java swt 双屏_Java SWT Image 图像 —— 反色、拉伸、透明叠加

图像反色

对于彩色图像的 R、G、B 各彩色分量取反的技术就是图像的反色处理,这在处理二值化图像的连通区域选取的时候非常重要。如物体连通域用黑色表示,而二值化后的物体连通域图像可那是白色的,而背景是黑色的,这时应手动选取图像的反色处理或有程序根据背景和物体连通域两种颜色的数量所占比例而自动选择是否选择选取图像的反色处理,其算法很简单,假设源图像一像素的红,绿,蓝分量为 (R,G,B),则目标图像该像素的红绿蓝分量应变为 (255 - R,255 - G, 255 - B)。

private static ImageData reverseImage(ImageData srcData)

{

int bytesPerPixel = srcData.bytesPerLine / srcData.width;

int destBytesPerLine = srcData.width * bytesPerPixel;

byte[] newData = srcData.data;

for (int i = 0; i < newData.length; i ++)

newData[i] = (byte) (255 - newData[i]);

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

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

newImageData.transparentPixel = srcData.transparentPixel;

return newImageData;

}

图像拉伸

图像的缩小/放大一般分为按比例缩小和不按比例缩小两种。图像的缩小操作中,是在现有的信息里如何挑选所需要的有用信息。图像的放大操作中,则需对尺寸放大后所多出来的空格填入适当的值,这是信息的估计问题,所以较图像的缩小要难一些,而且图像大比例放大时经常会出现马赛克效应。庆幸的是,SWT 工具箱对图像的拉伸进行了封装,开发者只需要调用方法 ImageData.scaledTo(int width, int height) 来获得一个拉伸后的 ImageData。

Image newImage = new Image(null, imageData[0].scaledTo(imageData[0].width / 2,

imageData[0].height / 2));

图像透明叠加

透明叠加方式是图象处理中常用的一种处理方式,在这种处理方式中,一幅图片叠加到另一幅图片上,但是这幅图象不是完全将原来的图象覆盖,而是能够部分的透过叠加的图象显示出来,透明的程度由透明度参数指定(假定为 a,其值在 0 与 1 之间,数值越小表明被叠加的图片越透明),其原理是目标图片的 R、G、B 以及 alpha 分别为待叠加图片 1 的 R、G、B 以及 alpha 分量乘以透明度参数 a 加上待叠加图片 2 的 R、G、B 以及 alpha 分量乘以 1-a 的值。我们可以使用图片的透明叠加作出水印的效果。

private static ImageData watermark(ImageData srcData1, ImageData srcData2, double alpha) {

if(srcData1.width != srcData2.width || srcData1.height !=

srcData2.height || rcData1.bytesPerLine != srcData2.bytesPerLine)

//未考虑不同大小图片的叠加

return null;

int bytesPerPixe = srcData1.bytesPerLine / srcData1.width;

int destBytesPerLine = srcData1.width * bytesPerPixe;

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

ImageData newImageData = new ImageData(srcData1.width, srcData1.height, srcData1.depth,

srcData1.palette, destBytesPerLine, newData);

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

for (int srcX = 0; srcX < srcData1.bytesPerLine; srcX++) {

int idx = srcY * srcData1.bytesPerLine + srcX;

newImageData.data[idx] = (byte)(alpha * srcData1.data[idx] +

(1- alpha) * srcData2.data[idx]);

}

}

return newImageData;

}

需要说明的是,以上所列举的清单中大部分都没有对透明度数据进行处理,读者如对带有透明度数据图片进行处理的时候,可自行添加相关代码,其处理过程跟对 ImageData 数据处理过程类似。

分享到:

2012-01-18 16:36

浏览 6122

评论

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值