Drawing on a transparent image using Java SWT

前端 未结 4 1798
天涯浪人
天涯浪人 2021-01-04 12:08

How do I create an in-memory fully transparent SWT image and draw a black line on it with antialias enabled?

I expect the result to include only black color and alph

4条回答
  •  北海茫月
    2021-01-04 12:54

    I was able to make this work, although it feels a bit hacky:

    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();
    

    After this, finalImage can be drawn into a GC with drawImage and the transparent parts will be respected.

提交回复
热议问题