使用Java SWT在透明图像上绘图

Lev*_*ros 11 java graphics swt drawing

如何在启用抗锯齿的情况下创建内存中完全透明的SWT图像并在其上绘制黑线?

我希望结果只包含黑色和alpha值,范围从0到255,因为抗锯齿...

我用Google搜索并尝试了所有可能的东西......这有可能吗?

小智 5

这是我的做法,并且有效:

    Image src = new Image(null, 16, 16);        
    ImageData imageData = src.getImageData();
    imageData.transparentPixel = imageData.getPixel(0, 0);
    src.dispose();
    Image icon = new Image(null, imageData);
    //draw on the icon with gc
Run Code Online (Sandbox Code Playgroud)


Sea*_*ght 4

我能够完成这项工作,尽管感觉有点老套:

Display display = Display.getDefault();

int width = 10;
int height = 10;

Image canvas = new Image(display, width, height);

GC gc = new GC(canvas);

gc.setAntialias(SWT.ON);

// This sets the alpha on the entire canvas to transparent
gc.setAlpha(0);
gc.fillRectangle(0, 0, width, height);

// Reset our alpha and draw a line
gc.setAlpha(255);
gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
gc.drawLine(0, 0, width, height);

// We're done with the GC, so dispose of it
gc.dispose();

ImageData canvasData = canvas.getImageData();
canvasData.alphaData = new byte[width * height];

// This is the hacky bit that is making assumptions about
// the underlying ImageData.  In my case it is 32 bit data
// so every 4th byte in the data array is the alpha for that
// pixel...
for (int idx = 0; idx < (width * height); idx++) {
    int coord = (idx * 4) + 3;
    canvasData.alphaData[idx] = canvasData.data[coord];
}

// Now that we've set the alphaData, we can create our
// final image
Image finalImage = new Image(canvasData);

// And get rid of the canvas
canvas.dispose();
Run Code Online (Sandbox Code Playgroud)

之后,finalImage可以绘制成GC带状drawImage,并且透明部分将受到尊重。