<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />下面的 JSL 創建了兩個位圖:彩虹色背景和 Mandelbrot 形狀的遮罩。兩個位圖被添加到一個圖形中,彩虹在掩碼下四處移動。它非常快,因為位圖只創建一次並且操作系統提供對掩碼透明孔的支持。
蒙版中的透明孔是使用 alpha 層創建的,類似於紅色、綠色和藍色層。Alpha 是一個介於 0 和 1 之間的數字,用於確定像素在先前繪製的像素之上渲染時的透明/不透明程度。在此示例中,alpha 為零(透明)或一(不透明)。您可以將位圖與中間值混合。
這個內聯版本的 JSL 被調整用於製作視頻的位圖。附加文件在運行時看起來可能會好一些,因為它使用計時器來確定下一幀要顯示的幀。
克雷奇黑爾斯 - YouTube
https://www.youtube.com/watch?v=NA-O0YbehpQ
// 這個例子演示了一種製作帶洞圖像的方法。
// 大多數圖像只使用紅色、綠色和藍色(比如背景彩虹
// 下圖)。一些圖像添加 Alpha 作為第四個通道描述
// 不透明或透明。JMP 使用 1 表示不透明。
//
規模 = 35; // 整體尺寸
nr = 20 * 規模; //縱橫比
nc = 25 * 比例; //縱橫比
// 像素最初構建在矩陣中,使用 J 函數分配
transp = J( nr, nc, 0 );
// 使用 mandelbrot 函數填充像素。使用並行分配
// 為了速度,而不是嵌套循環。
並行分配(
{nr = N 行( transp ), nr2 = N 行( transp ) / 2,
nc = N Cols( transp ), nc3 = N Cols( transp ) / 1.3333, limit = 1000},
transp[r, c] = Mandelbrot( limit, 4, // 從 1..limit 返回整數答案
2 * (c - nc3) / Sqrt( nr * nc ), // 將矩陣行、列縮放到有趣的空間
2 * (r - nr2) / Sqrt( nr * nc ) ) / limit // 除以極限比例 0..1
);
// 下一行是重要的一行。這個圖像是用 4 個數據通道創建的,
// 紅色、綠色、藍色和 Alpha。因為相同的“transp”值用於 r,g,b
// 圖像是灰度圖,但由於來自 Mandelbrot() 的數據,你不會看到太多
// 面具中的灰色......只有黑色。將 2nd transp 更改為 1-transp,您會看到
// 綠色遮罩。但重要的參數是 transp<.5,它創建了 alpha
// 渠道。transp 是值介於 0 和 1 之間的矩形矩陣;高價值
// 是 mandelbrot 集內的平坦區域,低值在外面。傳輸<.5
// 在外部為真或 1,在內部為假或 0。這使得矩形陣列
// 0 或 1 的 alpha:1 是遮罩,0 是透明的。(alpha 可以是小數
// 這將混合位圖。這裡不使用它。)
transpImage = New Image( "rgba", {transp, transp, transp, transp < .5} );
// 這個例子不使用保存的圖像,但是你可以像這樣,還有 png
// 例如,如果您使用 Gimp 打開它,則保存是透明的。
// 測試:transpimage << saveimage( "\\VBOXSVR\windowsShare\transparent\test.png", "png" );
// 創建一個窗口來保存動畫和一個圖形框來保存位圖。
// 在 JMP 中展示透明位圖的最佳選擇是在圖表中
// 因為其他帶有位圖的顯示框並不想相互重疊。
新窗口(“透明度”,
gb = Graph Box( framesize( nc + 20, nr + 20 ), // 10 像素彩虹邊框
<<背景顏色(“紅色”))); // 你可能會在添加第二張圖片之前看到紅色
// 將第一張圖像插入幀並獲取圖像段的句柄
gb[framebox( 1 )] << addimage( image( transpimage ) );
transpSeg = gb[framebox( 1 )] << childseg;
// 定位它;這個“面具”只定位一次,就在這裡
transpSeg << 移動( 50, 50 );
//
//
// 製作第二個沒有任何透明度的彩虹圖像
背景 = J( nr * 2, nc * 2, 0 ); // 額外的滾動。製作一些彩虹像素...
並行分配(
{nr = N 行(背景),nc = N 列(背景)},
背景[r, c] = RGB 顏色( (Sin( r / 70 ) + 1) / 2, (Sin( c / 50 ) + 1) / 2, Sin( (r + c) / 60 ) )
);
// 將像素轉換為位圖圖像,添加到框架,獲取句柄
backgroundImage = 新圖像(背景);
gb[framebox( 1 )] << addimage( image( backgroundImage ) );
backgroundSeg = gb[framebox( 1 )] << childseg;
//
wait(.1);// 確保窗口在循環開始之前打開
//
開始= 0; // 使用時間來創建更流暢的動畫
幀=0;
while( start < 30, // 運行 30 秒
位置=開始; // 用作 sin 和 cos 的弧度 arg ...
開始 = 開始 + 1/30;
x = 50 + 50 * Sin( 位置 * .39 ); // 任意縮放使用
y = 50 + 50 * Cos( 位置 * .27 ); // 藝術許可
// 好吧,這很笨拙;看來移動方法需要幫助評估...
// EvalExpr 查看它的參數並蒐索 Expr 進行計算。
// EvalExpr 返回一個仍然需要計算的表達式
Eval( Eval Expr( backgroundseg << move( Expr( x ), Expr( y ) ) ) );
// GB<<無效;等待(0);動畫因等待而變得參差不齊(允許交互)
gb << 更新窗口; // 這是非常流暢的動畫,但不是交互式的
//製作圖片:gb << savepicture("\\VBOXSVR\windowsShare\transparent\v\v"||right(char(frame++,9),9,"0")||".png", "png" );
);
//
// 更多想法(未測試,讓我們知道會發生什麼):
// 設置圖形框 xscale 和 yscale 以匹配幀大小
// 如果你想以精確的像素工作。
// 嘗試使用 0.5 左右的 alpha 值來混合圖像。
// 將圖中其他要繪製的線段安排在遮罩線段之前;
// 標記段可以通過掩碼中的孔出現。電影望遠鏡。
// 移動掩碼而不是數據。
// 具有透明度的多層。使用視差想法的側滾動條。
// 使用 MouseTrap 拖動遮罩。
// 嘗試旋轉蒙版,也許也可以使用 MouseTrap,具體取決於點擊的距離
// 是從面具的中心。