大图(10000*5000)进行图像处理时的问题

chenweionline 2005-01-12 09:41:03
对一幅图像进行处理(例如模糊效果),
我使用
DataBufferInt dbi = (DataBufferInt) (buffImg.getRaster().getDataBuffer());
return dbi.getData();
取出图像的所有像素,填入一个int[] imgdata,然后使用算法从每个元素中取得RGB值进行处理。

以前,程序支持的图像大小最多为 5000*2500 像素,int[] imgdata = int [5000*2500],能够装入所有像素;
可是现在要求能够处理 10000*5000 像素的图像,int[] imgdata = int [10000*5000]就会抛出异常:java.lang.OutOfMemoryError: Java heap space

请问这是为什么?怎样可以解决呢。能否不取出像素到 int 数组,直接对 BufferedImage 进行图像处理?或者还有什么别的办法?
...全文
214 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
keyinwind 2005-01-13
  • 打赏
  • 举报
回复
你如何取一个Image的象素数组:
PixelGrabber grabber = new PixelGrabber(imageobj.getSource(), 0, 0,
imageWidth, imageHeight, values, 0, imageWidth);

values就是一个int[];
grab后就填充了这个int数组,它的长度就是imageWidth*imageHeight,一个int就表示一个
象素,至于如何表示,取决于一个pixel用几个bit,如果是16bit,可能是5,6,5对应r,g,b;也可能
是5,5,5,1对应r,g,b,alpha;如果是32bit,可能是一个byte对应R,G,B,也可能是其他;

你如何填充一个Image,就是用这个int[]数组去填了,只是填充时要指定width和height
MemoryImageSource mi = new MemoryImageSource(width, height, values, 0, width);

还是试高层库吧
loujing 2005-01-13
  • 打赏
  • 举报
回复
10000*5000*3B=150MB,分块处理吧,以“行”为单位分成四份,循环时控制一下循环变量的范围。
villagehead 2005-01-13
  • 打赏
  • 举报
回复
友情提醒:
分块处理的时候注意文件头信息,
可能包含特殊的图片文件格式信息的东西!

另外,楼主可以考虑使用多线程,
比如读到满1k,就开一个线程进行处理。

其他的就帮助上什么了。
关注ing.....

good luck
科技互联人生 2005-01-13
  • 打赏
  • 举报
回复
虽然不知道是什么意思,但是很关注,UP~
chenweionline 2005-01-13
  • 打赏
  • 举报
回复
我现在想每次取出10000*5000图的1/4做操作,处理完这1/4后将它们重新写回 BufferedImage 对象,再读取下一个1/4。

问题是:
java 里面用什么方法可以每次只取出 BufferedImage 对象中指定位置及长度的一部分像素填充进 int 像素数组?
处理完之后再用什么方法可以将这部分像素再填充回 BufferedImage 对象中的指定位置?
chenweionline 2005-01-13
  • 打赏
  • 举报
回复
zez 2005-01-12
  • 打赏
  • 举报
回复
呵呵,,太专业了...
你可以把5000*10000 的分成许多小块来一块一块的计算呀

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧