Java-从图像的RGB值中减去标量

Java-从图像的RGB值中减去标量,java,image,rgb,Java,Image,Rgb,使用Java EDIT:和ImageMagick/JMagick之外的优秀图像库: 我想从ALL像素的RGB值中减去一个标量(比如100)(从零开始见底)。这将有效地使图像变暗 例如,对于具有R:20 G:103 B:200的给定像素,在进行此减法之后,该像素应为R:0 G:3 B:100(同样,我希望快速有效地对所有像素执行此操作,而不仅仅是一个像素) 我已经尝试过使用ImageMagick,但得到了不精确的结果——减法是准确的,没有舍入误差等,这一点至关重要。还有其他的图书馆擅长这个吗?是否

使用Java EDIT:和ImageMagick/JMagick之外的优秀图像库:

我想从ALL像素的RGB值中减去一个标量(比如100)(从零开始见底)。这将有效地使图像变暗

例如,对于具有R:20 G:103 B:200的给定像素,在进行此减法之后,该像素应为R:0 G:3 B:100(同样,我希望快速有效地对所有像素执行此操作,而不仅仅是一个像素)


我已经尝试过使用ImageMagick,但得到了不精确的结果——减法是准确的,没有舍入误差等,这一点至关重要。还有其他的图书馆擅长这个吗?是否有其他选项不处理对RGB值数组的迭代

BuffereImage类既有一个
getRGB()
方法,也有一个
setRGB()
方法,可以作用于单个像素或像素阵列


BuffereImage类既有
getRGB()
方法,也有
setRGB()
方法,可以作用于单个像素或像素阵列

试试这个: 如果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);
//首先获取RGB值
int RGB=getRGB(x,y);
INTR=RGB>>>16-100//移位16位以获得R值
如果(R试试这个:
如果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);
//首先获取RGB值
int RGB=getRGB(x,y);
int R=RGB>>>16-100;//移位16位以获得R值

如果而不是减去你可以考虑乘以小于一个数这会导致一个更自然的暗化。这个目标对于美学的目的不是太暗了——它是为了处理的目的,所以我肯定要做减法,而不是减去你可以考虑乘以小于一个数——这将重新计算。t在更自然的变暗中。目标对于美学目的来说不是太暗-它是为了处理目的,所以我肯定要做减法运算。迭代整个像素数组减去100不是很低效/耗时吗?我想我在某个地方读到了(找不到链接)使用光栅可能更快。但是,图像是一个像素阵列,您如何能够准确地执行变换而不迭代并将减法应用于所有像素(通过您的操作或您可能正在使用的某个抽象接口)?迭代整个像素数组减去100不是很低效/耗时吗?我想我在某个地方读过(找不到链接)使用光栅可能更快。但是,图像是一个像素阵列,您如何能够准确地执行变换而不迭代并将减法应用于所有像素(通过您的操作或您可能使用的某个抽象接口)?