java像素值_(java)图片像素的操作

更新时间:2023-06-23 06:15:05 阅读: 评论:0

java像素值_(java)图⽚像素的操作
因为做个游戏,需要⼀些图⽚资源,⽽获取到的图⽚资源都是jpg格式的,不是透明的,例如下⾯样式的:
为了取出其中的蓝光部分,透明化⿊⾊背景,我开始了图⽚处理探索之路。
这篇⽂章的内容包含以下部分:
fightagainst1.RGB是什么?
2.获取图⽚指定位置的RGB值
3.图⽚的灰化处理
4.修改图⽚的透明通道alpha ———————————————————————————————————————————————————————————————
RGB是什么?
这⾥简单说⼀下,RGB即是red,green,blue的缩写,即红绿蓝三种颜⾊。可以通过这三种颜⾊按⼀定⽐例混合,可以形成任何颜⾊。
图⽚是由许许多多个像素组成,每⼀像素是⼀种颜⾊,有rgb按⼀定⽐例混合⽽成,平常rbg的取值范围为0~255,当red,green,blue的值
都为0时,这个像素的颜⾊就为⿊⾊,都为255时就是⽩⾊,当他们的值相同时,混合⾊变相为灰⾊。所以,⼀个像素点可以表⽰的颜⾊的
个数为 255 * 255 * 255个,是⾮常多的。
这⾥不多做介绍,百科还是很详细的。
获取图⽚指定位置的RGB值
使⽤java获取⼀个像素的RGB,需要使⽤BufferedImage这个类,这个类提供修改图⽚数据的⽅法。
1 /**
2 * 读取⼀张图⽚的RGB值
3 */
4 public voidgetImagePixel(String image) {5
6 int[] rgb = new int[3];
7 File file = newFile(image);
8 BufferedImage bi = null;
9 try{10 bi =ad(file);11 }
catch(IOException e) {12
13 e.printStackTrace();14 }15 int width =bi.getWidth();16 int height =bi.getHeight();17 int minX =bi.getMinX();18 int minY
=bi.getMinY();19 for(int y = minY; y < height; y++) {20 for(int x = minX; x < width; x++) {21 //获取包含这个像素的颜⾊信息的值, int型
22 int pixel =bi.getRGB(x, y);23 //从pixel中获取rgb的值
superiorto
24 rgb[0] = (pixel & 0xff0000) >> 16; //r
25 rgb[1] = (pixel & 0xff00) >> 8; //g
26 rgb[2] = (pixel & 0xff); //b
27 System.out.print("("+rgb[0] + "," + rgb[1] + "," + rgb[2] + ")");28 }29 System.out.println();30 }31
32 }
dvc表⽰⼀个像素的颜⾊数据的格式有很多,不过常见格式就是4byte形式,即32位数据。看下图
如果⽀持alpha通道,则最⾼的8位表⽰alpha的值,剩下的分别表⽰r,g,b的值,分别8位。还有其他的数据格式,这⾥不做介绍啦。
现在应该可以看懂上边的代码了吧。戈黛娃夫人
仓鼠的英文rgb[0]即是r的值,在24~16之间,所以pixel取此区间的值,再右移16位就取得了其值。g,b的值同理。
图⽚的灰化处理
图⽚的灰化处理,很常⽤,在图⽚识别之前,最常⽤。图像灰化,直观上看就是把多彩的图像⿊⽩化,本来⽤r,g,b三个值来表⽰⼀个pixel 的颜⾊,现在⽤⼀个值来表⽰pixel的颜⾊,这样,检测图⽚中图形的边界就⽅便许多啦。现在,介绍⼏种灰化⽅法。
1,以r,g,b中的其中⼀个值,作为灰度值
2. 以r,g,b中的最⼤值或最⼩值,作为灰度值
3.以r,g,b的平均值作为灰度值
4.以rgb的加权值作为灰度值
5.⽤java本⾝的灰化类型
下⾯写个以r值为灰度值的代码:
救命的英文/**
* @param imagePath 要灰化图像的名字
* @param path ⽣成的图像的名字
**/
public voidtransformGray_R(String imagePath, String path) {
BufferedImage image;try{
image= ad(newFile(imagePath));for(int y = MinY(); y < Height(); y++) {for(int x =
pixel= (r & 0x000000ff) | (pixel & 0xffffff00); //⽤r的值设置b的值
pixel = ((r<<8) & 0x0000ff00) | (pixel & 0xffff00ff);//⽤r的值设置g的值我爱你英文
image.tRGB(x, y, pixel);
}
}try{
ImageIO.write(image,"jpg", newFile(path));
}catch(IOException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}catch(IOException e1) {//TODO Auto-generated catch block
e1.printStackTrace();
}
}
看⼀下效果:
效果还可以,与ps的红⾊通道图⽚⼀模⼀样啊。
2,3⽅法就不演⽰啦。2⽅法还是很好使的,特别是处理像开头那种颜⾊单⼀的图⽚时。
从零开始学英语
下⾯说⼀下4⽅法
//加权法
public voidtransformGrayJiaQuan (String imagePath, String path) {try{
BufferedImage image= ad(newFile(imagePath));int width =Width();int height =Height();for(int y = MinY(); y < height; y++) {for(int x = MinX(); x < width ; x ++) {int pixel =RGB(x, y);int r = (pixel >> 16) & 0xff;int g = (pixel >> 8) & 0xff;int b = pixel & 0xff;//加权法的核⼼,加权法是⽤图⽚的亮度作为灰度值的
int grayValue = (int) (0.30f * r + 0.59f * g + 0.11f *b );//int grayValue = (int) (0.21f * 4 + 0.71f * g + 0.08f * b);//还可以使⽤这个系数的加权法
pixel = (grayValue << 16) & 0x00ff0000 | (pixel & 0xff00ffff);
pixel= (grayValue << 8) & 0x0000ff00 | (pixel & 0xffff00ff);
pixel= (grayValue) & 0x000000ff | (pixel & 0xffffff00);
image.tRGB(x, y, pixel);
}
}
ImageIO.write(image,"jpg", newFile(path));
}catch(IOException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
效果:
相对于r值灰化的效果,清晰了好多,但亮度明显⼩了。
第5种⽅法:
public voidtransformGray(String imagePath, String path) {
File file= newFile(imagePath);try{
BufferedImage ad(file);int width =Width();int height =Height();2018四六级成绩查询
BufferedImage grayImage= new BufferedImage(width, height,BufferedImage.TYPE_BYTE_GRAY);//这⾥的图像类型换了
for(int y = MinY(); y < height; y++) {for(int x = MinX(); x < width; x++) {int rgb =RGB(x, y);
grayImage.tRGB(x, y, rgb);
}
}
File newFile= newFile(path);
ImageIO.write(grayImage,"jpg", newFile);
}catch(IOException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
看效果
可以下载下来⾃⼰⽐对⼀番
修改图⽚的透明通道alpha
上⾯说了那么多,是为了我的终极⽬的,就是把⿊⾊的背景透明化,保留我想要的颜⾊。
alpha的值也是在0~255之间,当alpha为0时,则图⽚完全透明,为255时不透明,所以其值越⼩越透明,由此可知,保留想要的颜⾊,透明掉不想要的颜⾊是很简单的。
处理⽅法和灰化⽅法⼀样,这次修改的是alpha值。通⽤的⽅法是加权法,也可以根据图⽚颜⾊的类型选择合适的⽅法。
下⾯代码以加权值为alpha值,加权值得到的图⽚的亮度,所以,越⿊的地⽅,亮度越⼩,其alpha值最⼩,越透明。所以,此⽅法是可⾏的。
public voidclearBackground(String imagePath, String dstPath) {
ImageIcon icon= newImageIcon(imagePath);
Image Image();
BufferedImage dstImage= ImageObrver()),
Graphics Graphics();
gr.drawImage(srcImage,0,ImageObrver());int height =Height();int width =Width();for(int y = MinY(); y < height; y++) {for(int x = MinX(); x < width; x++) {int pixel =RGB(x, y);int r = (pixel & 0x00ff0000) >> 16;int g = (pixel >> 8) & 0xff;int b = pixel & 0xff;int liangDu = (int)(0.21f * 4 + 0.71f * g + 0.08f * b);//获取亮度//以亮度作为alpha值
pixel = (liangDu << 24) & 0xff000000 | (pixel & 0x00ffffff); //alpha值在24~32
the jinxdstImage.tRGB(x, y, pixel);
}
}try{
ImageIO.write(dstImage,"png", newFile(dstPath));//不要忘记更改图⽚格式为png格式,jpg不⽀持透明
}catch(IOException e) {//TODO Auto-generated catch block
e.printStackTrace();

本文发布于:2023-06-23 06:15:05,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/1019035.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:灰化   透明   像素   格式   获取
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图