Java 将负片图像转换为正片
我把旧的底片扫描到电脑上。我想写一个小程序把负片转换成正片 我知道有几个图像编辑器应用程序,我可以使用它们来实现这种转换,但我正在研究如何通过一个小应用程序操纵像素来转换它们Java 将负片图像转换为正片,java,c++,image,Java,C++,Image,我把旧的底片扫描到电脑上。我想写一个小程序把负片转换成正片 我知道有几个图像编辑器应用程序,我可以使用它们来实现这种转换,但我正在研究如何通过一个小应用程序操纵像素来转换它们 有人能给我一个先例吗?如果可能,我们也将非常感谢示例代码。我刚刚编写了一个工作示例。给定以下输入图像img.png 输出将是一个新图像invert img.pnglike import java.awt.*; import java.awt.image.BufferedImage; import java.io.File
有人能给我一个先例吗?如果可能,我们也将非常感谢示例代码。我刚刚编写了一个工作示例。给定以下输入图像
img.png
输出将是一个新图像invert img.png
like
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
class Convert
{
public static void main(String[] args)
{
invertImage("img.png");
}
public static void invertImage(String imageName) {
BufferedImage inputFile = null;
try {
inputFile = ImageIO.read(new File(imageName));
} catch (IOException e) {
e.printStackTrace();
}
for (int x = 0; x < inputFile.getWidth(); x++) {
for (int y = 0; y < inputFile.getHeight(); y++) {
int rgba = inputFile.getRGB(x, y);
Color col = new Color(rgba, true);
col = new Color(255 - col.getRed(),
255 - col.getGreen(),
255 - col.getBlue());
inputFile.setRGB(x, y, col.getRGB());
}
}
try {
File outputFile = new File("invert-"+imageName);
ImageIO.write(inputFile, "png", outputFile);
} catch (IOException e) {
e.printStackTrace();
}
}
}
上图将为您提供以下图像
您可以调整
MONO_阈值
,以获得更令人满意的输出。增加数字会使像素变暗,反之亦然。那么这是一个领先的起点。假设您可以访问负片图像中的每个单独像素,并且每个像素都有RGB分量,则按如下方式获取原始像素的RGB分量:
int MONO_THRESHOLD = 368;
if (col.getRed() + col.getGreen() + col.getBlue() > MONO_THRESHOLD)
col = new Color(255, 255, 255);
else
col = new Color(0, 0, 0);
int originalRed = Math.abs( pixel.getRed( ) - 255 );
int originalGreen = Math.abs( pixel.getGreen( ) - 255 );
int originalBlue = Math.abs( pixel.getBlue( ) - 255 );
// now build the original pixel using the RGB components
对每个像素执行上述操作,您可以逐像素重新创建原始图像。试试。这是一本来自肮脏的富人客户的书。“有谁能让我在这方面领先一步吗?”到目前为止,你得到了什么?查看JavaDocs,看看是否可以找到从何处开始。abs是不必要的。只需执行
(0xFF-pixel.getRed())
这是另一种方法,但我试图让事情变得简单understand@Oscar:添加不必要的复杂性“保持简单”是什么意思?我同意255
比0xFF
更好。再想一想,我不同意0xFF
更好,因为很明显它是最大8位值。这太棒了。有没有办法使图像二值化(两种颜色/黑白),最好使用类似的代码?你是说灰度吗?是的,您可以编辑新颜色(…)
零件。我建议您将所有值设置为(col.getRed()+col.getGreen()+col.getBlue())/3
。谢谢您的回答。灰度不是我想要的——我希望能够将图像转换成黑白图像(也就是二进制/1位图像)。生成的图像应显示为白色背景,其上有黑色元素,缺少大部分细节。关于如何实现这一点有什么想法吗?我不认为RGB包含在其中,因为它不处理R、G或B。谢谢。kba我们如何才能将绿色色调添加到RGB像素中。放在这里