動機: 我的目標是以最有效的方式將AWT BufferedImage
轉換爲SWT ImageData
。這個問題的典型答案是整個圖像的逐像素轉換,即O(n^2)複雜度。如果他們可以交換整個像素矩陣,效率會更高。 BufferedImage
在詳細確定顏色和阿爾法編碼方面似乎非常靈活。爲了給您提供更廣泛的上下文,我使用Apache Batik編寫了一個SVG圖標按需光柵化器,但它是針對SWT(Eclipse)應用程序的。蠟染只渲染到java.awt.image.BufferedImage
,但SWT組件需要org.eclipse.swt.graphics.Image
。如何使用單獨的alpha光柵創建BufferedImage
它們的支持柵格對象:java.awt.image.Raster
和org.eclipse.swt.graphics.ImageData
表示完全相同的東西,它們只是包圍代表像素的二維字節值數組。如果我可以讓一個或另一個使用顏色編碼,瞧,我可以重新使用支持陣列。
我得到了很遠,這個工程:
// defined blank "canvas" for Batik Transcoder for SVG to be rasterized there
public BufferedImage createCanvasForBatik(int w, int h) {
new BufferedImage(w, h, BufferedImage.TYPE_4BYTE_ABGR);
}
// convert AWT's BufferedImage to SWT's ImageData to be made into SWT Image later
public ImageData convertToSWT(BufferedImage bufferedImage) {
DataBuffer db = bufferedImage.getData().getDataBuffer();
byte[] matrix = ((DataBufferByte) db).getData();
PaletteData palette =
new PaletteData(0x0000FF, 0x00FF00, 0xFF0000); // BRG model
// the last argument contains the byte[] with the image data
int w = bufferedImage.getWidth();
int h = bufferedImage.getHeight();
ImageData swtimgdata = new ImageData(w, h, 32, palette);
swtimgdata.data = matrix; // ImageData has all field public!!
// ImageData swtimgdata = new ImageData(w, h, 32, palette, 4, matrix); ..also works
return swtimgdata;
}
它除了透明度:(
它看起來像ImageData
需要(?總是)阿爾法所有的作品是一個單獨的柵格,看到ImageData.alphaData
從顏色光柵,見ImageData.data
;?都是byte[]
類型
有沒有辦法如何使ImageData
接受ARGB
模型是阿爾法與其他顏色混合我?懷疑所以我走了另一條路。使BufferedImage
對顏色和alpha使用單獨的陣列(又名柵格或「帶」)。 ComponentColorModel
和BandedRaster
似乎準確地用於這些事情。
到目前爲止,我來到這裏:
public BufferedImage createCanvasForBatik(int w, int h) {
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
int[] nBits = {8, 8, 8, 8}; // ??
ComponentColorModel colorModel = new ComponentColorModel(cs, nBits, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE);
WritableRaster raster = Raster.createBandedRaster(
DataBuffer.TYPE_BYTE, w, h, 4, new Point(0,0));
isPremultiplied = false;
properties = null;
return new BufferedImage(colorModel, raster, isPremultiplied, properties);
}
這創造了一個字母也爲單獨每種顏色獨立光柵(帶),所以我結束了4條帶(4個光柵),這是一次不可用SWT圖像。 是否可以使用2個波段創建帶狀光柵:一個用於RGB或BRG中的顏色,另一個用於alpha?
進行了交錯的SWT BGR圖像數據嗎?從你的問題的第一部分看來是如此。如果是這樣,製作帶狀光柵沒有多大意義。您需要創建一些自定義的'DataBuffer'和/或'SampleModel',我認爲它們具有交錯BGR存儲和分立的alpha存儲。當然,如果SWT圖像數據允許交錯字母以及... – haraldK
謝謝@haraldK,你很好地概括了我所要求的,也許用更好的詞彙:如何創建這樣的自定義DataBuffer和/或SampleModel ? – Espinosa