我正在尝试将MagickImage转换为SWT.ImageDate,因为以前的库提供了使用平滑边缘更好地缩放图像的API,更好的插值和保持透明度。
蓝色像素的透明度值为127
以下是我用来转换的示例代码:
ImageInfo ii = new ImageInfo("img/test.png");
MagickImage mi = new MagickImage(ii);
Point p = new Point(mi.getDimension().width, mi.getDimension().height);
int blobSize = p.x * p.y;
byte[] dataBlob = new byte[blobSize * 4];
byte[] alphaDataBlob = new byte[blobSize];
PixelPacket temp = null;
int blobpos = 0;
int alphapos = 0;
for(int row=0; row<p.y; row++) {
for (int col = 0; col < p.x; col++) {
temp = mi.getOnePixel(col, row);
alphapos = (row * p.x) + col;
blobpos = 4 * ((row * p.x) + col);
dataBlob[blobpos + 1] = (byte)(temp.getRed() & 0xFF);
dataBlob[blobpos + 2] = (byte)(temp.getGreen() & 0xFF);
dataBlob[blobpos + 3] = (byte)(temp.getBlue() & 0xFF);
alphaDataBlob[alphapos] = (byte)(0xFF - (temp.getOpacity() & 0xFF));
}
}
ImageData imageData = new ImageData(p.x, p.y, 24, new PaletteData(0xFF0000, 0x00FF00 , 0x0000FF));
imageData.data = dataBlob;
imageData.alphaData = alphaDataBlob;
ImageLoader imageLoader = new ImageLoader();
imageLoader.data = new ImageData[] {imageData};
imageLoader.save("img/result.png", SWT.IMAGE_PNG);
第四个像素现在有255个透明度值,颜色是奇数。
当我使用SWT api imageData字段读取test.png文件时:数据,alphadata和颜色掩码与我自定义创建的imageData相同,但保存的图像不同。
我在PaletteData中更改了颜色遮罩值但没有很好的结果。也许有人知道如何正确地做到这一点。
答案 0 :(得分:1)
24的颜色深度不适合dataBlob
的布局,每个像素有4个字节。
您可以将ImageData
构造函数调用更改为
ImageData imageData = new ImageData(p.x, p.y, 32, new PaletteData(0xFF0000, 0x00FF00, 0x0000FF));
或每像素存储3个字节:
blobpos = 3 * ((row * p.x) + col);
dataBlob[blobpos + 0] = (byte)(temp.getRed() & 0xFF);
dataBlob[blobpos + 1] = (byte)(temp.getGreen() & 0xFF);
dataBlob[blobpos + 2] = (byte)(temp.getBlue() & 0xFF);
两者都有效。