java image 反色_Java SWT Image 图像 —— 变灰、变亮变黑、旋转、反色、拉伸、透明叠加...

图像变灰

图像变灰在桌面应用程序中有着广泛的应用。例如,一个图标被作为一个按钮的背景,我们需要一个灰色效果的图标作为按钮的背景来表示这个按钮处于禁用状态。在SWT中,基于已经存在的图像来创建一个具有灰色效果的图像,我们可以使用构造函数 Image(Display display, Image image, int flag) 来创建,其中参数 flag 使用 SWT.IMAGE_GRAY。

例子:

Image newImage = new Image(null, image, SWT.IMAGE_GRAY);

图像变亮/变黑

下面讨论图像变亮/变黑。 RGB 和 HSL (也叫 HSB/HSV )是两种色彩空间,即:红、绿、蓝( Red, Green, Blue) 和色调、饱和度、亮度( Hue, Saturation, Lightness 或 Brightness 或 Value),前者适用于机器采样,目前的显示器颜色即由这三种基色构成,而后者更符合人类的直观感觉。在 Windows 的标准颜色对话框中均包含这两种表示方法。 RGB 的取值范围在 0~255 之间, HSL 的取值在 0~1 之间。因此我们只需要将 HSL 空间数据的 L 分量进行调整即可调整此图像的亮度。要实现图像变亮/变黑的功能,只需要调整清单 3 中函数 lightImage 行(*)中等号右边的值( 0 到 1 之间)。

例子:

private static ImageData lightImage(ImageData srcData) {

double[] data = rgbTohsl(srcData.data);

byte[] newData = new byte[srcData.data.length];

int bytesPerPixel = srcData.bytesPerLine / srcData.width;

int destBytesPerLine = srcData.width * bytesPerPixel;

for(int i = 0; i < data.length; i += 3) {

data[i + 2] = 0.75; ----------------- (*)

}

data = hslTorgb(data);

for(int i = 0; i < srcData.data.length; i ++) {

newData[i] = (byte)data[i];

}

ImageData newImageData = new ImageData(srcData.width, srcData.height,

srcData.depth,srcData.palette, destBytesPerLine, newData);

return newImageData;

}

其中,方法 double[] rgbTohsl(byte[] data) 是把 RGB 空间数据转换到 HSL 空间;相反的,方法 double[] hslTorgb(double[] data) 是把数据从 HSL 空间转换到 RGB 空间。

图像旋转

清单4中方法 rotate 实现了将图像相左旋转 90 度。如图 1 ,对于像素点 (x, y) ,向左旋转90 度以后,它在图象中的位置变成了 (y, width - x - 1) 。因此,相左旋转 90 度即将所有的像素点按照规则换一下位置。其他的旋转可用同样的方法。

图1 旋转前与相左旋转 90 度后

57944cbbf018ddcda18823f0ad221026.png

例子:

private static ImageData rotate(ImageData srcData) {

int bytesPerPixel = srcData.bytesPerLine / srcData.width;

int destBytesPerLine = srcData.height * bytesPerPixel;

byte[] newData = new byte[srcData.data.length];

int width = 0, height = 0;

for (int srcY = 0; srcY < srcData.height; srcY++) {

for (int srcX = 0; srcX < srcData.width; srcX++) {

int destX = 0, destY = 0, destIndex = 0, srcIndex = 0;

destX = srcY;

destY = srcData.width - srcX - 1;

width = srcData.height;

height = srcData.width;

destIndex = (destY * destBytesPerLine) + (destX * bytesPerPixel);

srcIndex = (srcY * srcData.bytesPerLine) + (srcX * bytesPerPixel);

System.arraycopy(srcData.data, srcIndex, newData, destIndex, bytesPerPixel);

}

}

return new ImageData(width, height, srcData.depth, srcData.palette,

destBytesPerLine, newData);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值