2012-08-14 121 views
0

使用Java编辑的RGB值的标:和良好的图片库之外的ImageMagick/JMagick:爪哇 - 减去从图像

我想从所有RGB值减去一个标量(如100)像素,(最低为零)。这有效地使图像变暗。

例如,对于与R A给定像素:20 G:103 B:200,该减法后的像素应该是R:0 G:3 B:100(再次欲快速和有效地在所有像素上执行此操作,而不仅仅是一个)

我已经尝试过使用ImageMagick并且得到不准确的结果 - 重要的是减法是准确的,并且没有舍入错误等。任何其他图书馆都会擅长这一点?是否还有其他选项无法处理对RGB值数组的迭代?

+0

- 这会导致更自然的黑暗。 – 2012-08-14 19:13:59

+0

为了审美的目的,我们的目标不是太暗 - 这是为了处理目的,所以我绝对想要做减法运算 – Ken 2012-08-14 19:16:05

回答

2

BufferedImage类有一个getRGB()setRGB()方法可以作用于单个像素或像素数组。

http://docs.oracle.com/javase/6/docs/api/java/awt/image/BufferedImage.html

+0

迭代整个像素阵列以减去100是否不是非常低效/耗时? – Ken 2012-08-14 20:51:50

+0

我想我读了一些地方(无法找到链接),使用'Raster'可能会更快。然而,图像是一个像素数组,如何在不迭代的情况下准确地执行转换,并将所有像素的相减应用到所有像素上(无论是通过执行还是通过您可能使用的某个抽象接口)? – 2012-08-14 22:48:32

2

试试这个: 如果R或G或B是否定的,那么你可以把它反而减去你可能会考虑通过一个小于一个乘以0

//At first get the RGB value 
int RGB=getRGB(x,y); 
int R=RGB>>>16-100; //shift by 16 bit to get the R value 
if(R<0) R=0; 
int G=(RGB<<<8)>>>16-100;//clear the preceding numbers than shift 16 bit 
if(G<0) G=0; 
int B=(RGB<<<16)>>>16-100; 
if(B<0)B=0; 
int newRGB=R<<<16+G<<<8+B; 
setRGB(x,y,newRGB);