You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于SWT的ImageData与高斯模糊实现阴影图片及透明圆角问题

解决SWT中Material风格阴影图的圆角白边问题

问题根源

你遇到的圆角白边,本质是原代码用transparentPixel单索引色实现透明,无法正确处理抗锯齿产生的半透明过渡像素——这些过渡像素的颜色不是(0,0)点的初始透明色,被当成了不透明的白色(或底色),最终显示出白边。另外,初始创建的图像默认没有Alpha通道,抗锯齿渲染的边缘信息丢失。

解决步骤

  • 创建带Alpha通道的图像:直接用ImageData指定alpha通道,确保图像支持全范围透明度,而非单一透明色。
  • 放弃transparentPixel:改用原生Alpha通道处理透明,让抗锯齿的半透明边缘能正确保留。
  • 简化GC初始化:无需填充全透明矩形,直接在空的Alpha图像上绘制黑色圆角矩形即可。

修改后的代码

ImageLoader saver = new ImageLoader();
int width = 140;
int height = 140;

// 创建带Alpha通道的ImageData,初始全透明
ImageData imageData = new ImageData(width, height, 32, new PaletteData(0xFF0000, 0x00FF00, 0x0000FF));
imageData.alphaData = new byte[width * height];
// 初始化所有像素为全透明
Arrays.fill(imageData.alphaData, (byte) 0);

Image src = new Image(null, imageData);
GC gc = new GC(src);
gc.setAntialias(SWT.ON);
// 设置黑色背景
gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK));
// 绘制圆角矩形,抗锯齿边缘会生成半透明Alpha值
gc.fillRoundRectangle(20, 20, 100, 100, 22, 22);
gc.dispose();

// 直接保存带Alpha通道的图像数据
saver.data = new ImageData[] {src.getImageData()};
saver.save("result.png", SWT.IMAGE_PNG);

// 释放资源
src.dispose();

模糊处理补充

如果后续用Nebula/Opal的模糊工具,要确保:

  • 模糊操作的输入是带Alpha通道的图像
  • 模糊算法同步处理Alpha通道(部分旧算法只模糊RGB通道,忽略Alpha会导致边缘白边)
  • 模糊后确认Alpha通道完整保留,未被错误覆盖

内容的提问来源于stack exchange,提问作者Kuba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 01:00:07