Java 将MagickImage转换为SWT.ImageData

Java 将MagickImage转换为SWT.ImageData,java,swt,jmagick,Java,Swt,Jmagick,我正在尝试将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()

我正在尝试将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);
ImageInfo ii=新的ImageInfo(“img/test.png”);
MagickImage mi=新MagickImage(ii);
点p=新点(mi.getDimension().width,mi.getDimension().height);
int blobSize=p.x*p.y;
byte[]dataBlob=新字节[blobSize*4];
byte[]alphaDataBlob=新字节[blobSize];
像素数据包温度=零;
int-blobpos=0;
int alphapos=0;

对于(int row=0;row而言,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);
两者都会起作用