Java SWT Image 图像 —— 反色、拉伸、透明叠加
  sAAkk3Vxfaa8 2023年11月02日 41 0


图像反色

对于彩色图像的 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 数据处理过程类似。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   54   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   109   0   0 Java
  8s1LUHPryisj   2024年05月17日   46   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
sAAkk3Vxfaa8