将 MagickImage 转换为 SWT.ImageData

Converting MagickImage to SWT.ImageData

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

这是我的测试图像(2x2 像素 PNG 文件):

蓝色像素的透明度值为 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 读取 test.png 文件时 api imageData 字段:数据、alphadata 和颜色掩码与我自定义创建的 imageData 相同,但保存的图像不同。

我更改了 PaletteData 中的颜色遮罩值,但效果不佳。也许有人知道如何正确地做到这一点。

24 的颜色深度不适合 dataBlob 的布局,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);

两者都可以。