【问题标题】:How to do transparency with rounded filled rectangles in SWT?如何在 SWT 中用圆角填充矩形做透明度?
【发布时间】:2013-03-06 00:35:47
【问题描述】:

我正在使用 SWT 4.2 Tree 小部件。我需要将颜色代码与列表中的每个 TreeItem 相关联。我正在使用TreeItem 的setImage(...) 执行此操作,图像创建如下:

private Image createImage(int imageSize)
{
    Image image = new Image(Display.getDefault(), imageSize, imageSize);
    GC gc = new GC(image);
    gc.setAntialias(SWT.ON);
    gc.setBackground(... a Color object ...);
    gc.fillRoundRectangle(0, 0, imageSize, imageSize, 5, 5);
    gc.dispose();
    return image;
}

实际上效果很好,除了一个细节:圆角矩形外部的角不透明——它们保持白色。效果是带有白色条纹的圆形彩色正方形。当用户选择 Tree 中的项目时,这一点尤其明显,因为选择的颜色使白色角落非常明显。

我在创建GC 之前尝试过使用Image.setBackground(...),因为该方法的文档指出:“设置将透明像素映射到的颜色”。但是,据我所知,将颜色设置为白色或设置图像的TreeItem 的颜色(无论如何都是白色)没有任何效果。我还尝试在上面的代码中设置 GC 的 alpha 值,但似乎无法获得正确的咒语来将 GC 的背景设置为透明但填充的矩形 not 是透明的。

我做错了什么?如何使填充矩形之外的区域透明,以便填充圆角矩形之外的图像角在出现在Tree 列表中时正确透明?

【问题讨论】:

    标签: java graphics swt


    【解决方案1】:

    您可以执行许多照片编辑工具可以执行的“颜色到 Alpha/透明度”之类的操作:

    如果您想了解更多详情,请阅读这篇文章:Taking a look at SWT Images

    这样的事情应该可以工作:

    ImageData data = yourImage.getImageData();
    // Assuming the corners are white
    int whitePixel = data.palette.getPixel(new RGB(255,255,255));
    data.transparentPixel = whitePixel;
    Image transparentImageCorners = new Image(display, data);
    

    如果您担心这可能会影响您绘制的图像中包含的颜色,请先使用您知道图像中不包含的独特颜色为背景着色。

    【讨论】:

    • 感谢您的回复。这可能不够清楚,但我实际上并没有使用外部图像;代码(原始的 sn-p)只是从头开始创建一个图像对象,然后在其中绘制。但是,我似乎仍然可以应用您的方法,只需创建两个图像即可。所以我尝试了,但不幸的是,它似乎没有什么区别:一旦设置在 TreeItem 中,彩色方块仍然没有透明角。我发布了我的代码here。
    • @mhucka 这正是我的意思。我说的是图片,因为您使用的是Image。创建第二个Image 在您使用GC 绘制图像之后,否则它将无法工作,因为ImageData 不包含您绘制的内容,直到您实际绘制它...
    • @baz 现在我明白了。它有效!新代码here。一个问题是,由于抗锯齿,圆角矩形外的角实际上不是白色的。我需要找出透明像素的正确颜色,但这是一个单独的问题。无论如何,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    相关资源
    最近更新 更多