将MagickImage转换为SWT.ImageData

时间:2016-01-07 07:37:23

标签: java swt jmagick

我正在尝试将MagickImage转换为SWT.ImageDate,因为以前的库提供了使用平滑边缘更好地缩放图像的API,更好的插值和保持透明度。

这是我的测试图像(2x2像素PNG文件): blue pixel has transparency value 127

蓝色像素的透明度值为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);

此转换的结果是: enter image description here

第四个像素现在有255个透明度值,颜色是奇数。

当我使用SWT api imageData字段读取test.png文件时:数据,alphadata和颜色掩码与我自定义创建的imageData相同,但保存的图像不同。

我在PaletteData中更改了颜色遮罩值但没有很好的结果。也许有人知道如何正确地做到这一点。

1 个答案:

答案 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);

两者都有效。