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像素中。放在这里