Atitit.遍历图像像素点rgb java attilax总结
Atitit.遍历图像像素点rgb java attilax总结
1. 遍历像素点
ImgxPicPhotoSplitor.java atibrow prj
public static boolean containsWhiteLine(BufferedImage image) {
int heit=image.getHeight();
for(int i=0;i<heit;i++)
{
PixLine pl=getPixLine(image, i);
if(isWhiteLine(pl))
return true;
}
return false;
}
2. 提取一行
这 个过程的下一步是用 Java 2D 绘制图像。首先取得它的 Graphics2D 上下文。可以用方法 createGraphics2D() 或者调用 getGraphics() 做到这一点。在这个上下文上绘制将会自动修改图像的像素数据。在绘制完成后,可以用方法 getRGB(int startX, int startY, int w, int h, int rgbArray, int offset, int scansize) 容易且高效地提取图像的像素值。这个方法可以将图像中矩形区域的像素数据传输到一个整数数组中。getRGB() 方法的参数如下:
startX, startY 是要提取的区域左上角图像的坐标
w, h 是要提取的区域的宽度和高度
rgbArray 是接收像素值的整数数组
offset 是数组中接收第一个像素值的位置的索引。
scansize 是图像中相邻两行中具有相同行索引的像素的索引偏移值。如果这个值与要提取的区域的宽度相同,那么一行的第一个像素就会存储在数组中前一行最后一个像素后 面的索引位置。如果这个值大于提取区域的宽度,那么数组中,在一行最后和下一行开始之间就会有一些未使用的索引。
走势这个getRGB 好像有问题,不会调用,查找资料也不行。自豪嘎子写蓝。。
public static PixLine getPixLine(BufferedImage image, int lineIndex) {
int[] pxs=new int[image.getWidth()];
for(int i=0;i<image.getWidth();i++)
{
pxs[i]=image.getRGB(i, lineIndex);
}
PixLine pl=new PixLine();
pl.pxs=pxs;
return pl;
}
作者:: 老哇的爪子 Attilax 艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
3. Rgb分量提取
多谢sqcl的回答,还有一个问题,就是用BufferedImage.getRGB()返回的像素值是32位颜色值,要自己移位才能得到RBGA的各个分量值,有没有什么类可以配合BufferedImage直接取出某个像素的某个独立的分量值?
|
1 2 3 4 5 |
int pixel = 0xFF0000; Color pixelColor = new Color(pixel); int r = pixelColor.getRed(); int g = pixelColor.getGreen(); int b = pixelColor.getBlue(); |
不过,这样效率太低。用移位最好。如果觉得不方便,可以自己写个Helper类简单封装一下。
我们知道通过bufferedimage对象的getRGB(x,y)方法可以返回指定坐标的颜色int值 他可以通过
int R =(rgb & 0xff0000 ) >> 16 ;
int G= (rgb & 0xff00 ) >> 8 ;
int B= (rgb & 0xff );
转换成三个颜色分量
4. 其他读取像素
从BufferedImage对象中读取像素数据的代码如下:
[java] view plaincopy
1. int type= image.getType();
2. if ( type ==BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )
3. return (int [])image.getRaster().getDataElements(x, y, width, height, pixels );
4. else
, width );
[java] view plaincopy
1. int type= image.getType();
2. if ( type ==BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )
3. return (int [])image.getRaster().getDataElements(x, y, width, height, pixels );
4. else
, width );
位的INT型数据,直接读写RGB值即可,否则需要从Raster
对象中读取。
往BufferedImage对象中写入像素数据同样遵守上面的规则。代码如下:
[java] view plaincopy
1. int type= image.getType();
2. if ( type ==BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )
3. image.getRaster().setDataElements(x, y, width, height, pixels );
4. else
, width );
[java] view plaincopy
1. int type= image.getType();
2. if ( type ==BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )
3. image.getRaster().setDataElements(x, y, width, height, pixels );
4. else
, width );
读取图像可能因为图像文件比较大,需要一定时间的等待才可以,Java Advance Image
Processor API提供了MediaTracker对象来跟踪图像的加载,同步其它操作,使用方法如下:
[java] view plaincopy
1. MediaTracker tracker = new MediaTracker(this); //初始化对象
); // 加入要跟踪的BufferedImage对象image_001
) // 等待10秒,让iamge_01图像加载
[java] view plaincopy
1. MediaTracker tracker = new MediaTracker(this); //初始化对象
); // 加入要跟踪的BufferedImage对象image_001
) // 等待10秒,让iamge_01图像加载
位int型数据cARGB中读取图像RGB颜色值的代码如下:
[java] view plaincopy
)& 0xff; //透明度通道
) &0xff;
) &0xff;
4. int blue = cARGB & 0xff;
[java] view plaincopy
)& 0xff; //透明度通道
) &0xff;
) &0xff;
4. int blue = cARGB & 0xff;
将RGB颜色值写入成一个INT型数据cRGB的代码如下:
[java] view plaincopy
) | blue;
[java] view plaincopy
) | blue;
创建一个BufferedImage对象的代码如下:
[java] view plaincopy
, BufferedImage.TYPE_INT_ARGB);
[java] view plaincopy
, BufferedImage.TYPE_INT_ARGB);
5. --code
ImgxPicPhotoSplitor.java atibrow prj
6. 参考
Java数字图像处理基础知识 - 必读 - 流浪的鱼 - 博客频道 - CSDN.NET.htm
Java数字图像处理基础知识 - 必读 - 流浪的鱼 - 博客频道 - CSDN.NET.html
Atitit.遍历图像像素点rgb java attilax总结的更多相关文章
- Atitit 遍历文件夹算法 autoit attilax总结
Atitit 遍历文件夹算法 autoit attilax总结 _FileListToArray Lists files and\or folders in a specified folder (S ...
- Atitit 图像处理 调用opencv 通过java api attilax总结
Atitit 图像处理 调用opencv 通过java api attilax总结 1.1. Opencv java api的支持 opencv2.4.2 就有了对java api的支持1 1. ...
- Atitit.计算机图形图像图片处理原理与概论attilax总结
Atitit.计算机图形图像图片处理原理与概论attilax总结 计算机图形1 图像处理.分析与机器视觉(第3版)1 数字图像处理(第六版)2 图像处理基础(第2版)2 发展沿革 1963年,伊凡·苏 ...
- Atitit swt 4.3 4.4 4.5 新特性java attilax总结
Atitit swt 4.3 4.4 4.5 新特性java attilax总结 1. 4.5 Release - June 3, 20151 1.1. Older Releases1 2. SWT ...
- Atitit 图像处理—图像形态学(膨胀与腐蚀)
Atitit 图像处理-图像形态学(膨胀与腐蚀) 1.1. 膨胀与腐蚀1 1.2. 图像处理之二值膨胀及应用2 1.3. 测试原理,可以给一个5*5pic,测试膨胀算法5 1.4. Photoshop ...
- Atitit 视频编码与动画原理attilax总结
Atitit 视频编码与动画原理attilax总结 1.1. 第一步:实现有损图像压缩和解压1 1.2. 接着将其量化,所谓量化,就是信号采样的步长,1 1.3. 第二步:实现宏块误差计算2 1.4. ...
- Atitit 项目语言的选择 java c#.net php??
Atitit 项目语言的选择 java c#.net php?? 1.1. 编程语言与技术,应该使用开放式的目前流行的语言趋势1 1.2. 从个人职业生涯考虑,java优先1 1.3. 从项目实际来 ...
- Atitit 图像处理的心得与疑惑 attilax总结
Atitit 图像处理的心得与疑惑 attilax总结 1.1. 使用类库好不好??还是自己实现算法1 1.2. 但是,如果遇到类库体积太大,后者没有合适的算法,那就只能自己开发算法了1 1.3. 如 ...
- Atitit.ide技术原理与实践attilax总结
Atitit.ide技术原理与实践attilax总结 1.1. 语法着色1 1.2. 智能提示1 1.3. 类成员outline..func list1 1.4. 类型推导(type inferenc ...
随机推荐
- 一直对zookeeper的应用和原理比较迷糊,今天看一篇文章,讲得很通透,分享如下(转)
本文转自http://blog.csdn.net/gs80140/article/details/51496925 一直对zookeeper的应用和原理比较迷糊,今天看一篇文章,讲得很通透,分享如下: ...
- MySQL 的instr函数
1.测试数据库: MYSQL数据库 INSTR(STR,SUBSTR) 在一个字符串(STR)中搜索指定的字符(SUBSTR),返回发现指定的字符的位置(INDEX); STR 被搜索的字符串 SUB ...
- [转]双TOP二分法生成分页SQL类(支持MSSQL、ACCESS)
本文转自:http://www.cnblogs.com/jitian/archive/2011/03/22/1991961.html 博客开张,先发以前的几个老物件儿,以前写下来的,现在发上来权当记录 ...
- git 统计代码量 shell脚本
#!/bin/bash # 统计代码量 # 使用方法: sh gitstat.sh "2017-11-01" "2017-11-30" "JamKon ...
- RMAN备份与恢复之概念二
1 RMAN备份恢复 1.1 基础理论 恢复可以分为完全恢复和不完全恢复 完全数据库恢复是恢复到故障发生前的状态,所有已经提交的操作都进行恢复,确保数据库不丢失任何数据,完全恢复只用于归档模 ...
- PHP之is_a()函数执行代码之总结
今天看到云舒在群里贴的漏洞公告,原始的文章在 http://www.byte.nl/blog/2011/09/23/security-bug-in-is_a-function-in-php-5-3-7 ...
- java中Token验证
什么是Token:它是一个令牌,随机不可预测的. 为什么需要使用Token: 1,防止表单的重复提交 2:,防止跨站点的请求伪造 Token的使用流程是:首先在服务器端生成一个随机的token值并在服 ...
- 快速把web项目部署到weblogic上
转自:http://weijie.blog.51cto.com/340746/90420/ weblogic简介 BEA WebLogic是用于开发.集成.部署和管理大型分布式Web应 ...
- Cocos2d-x中如何增加图片和文本菜单
菜单都以MenuItem开头 MenuItemLabel - 文本菜单项 MenuItemImage - 图片菜单项 // on "init" you need to initia ...
- 正则表达式:日期,电话,邮箱等常用字符串;js中日期的带下的比较,获取不同格式的日期
一.日期 (1)首先需要验证年份,显然,年份范围为 0001 - 9999,匹配YYYY的正则表达式为: [0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1- ...