java - 更改 WritableRaster 对象会影响 bufferedImage 对象

标签 java image-processing bufferedimage

我正在编写一个程序,使用以下代码对图像执行各种操作:

import java.awt.Desktop;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.imageio.ImageIO;

public class BrightnessContrast {
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        int i, j, choice = 1;
        String imgName;
        boolean flag = true;

        String imagePath = "images/test.jpg";
        BufferedImage myImage = ImageIO.read(new File(imagePath));
        int height = myImage.getHeight();
        int width = myImage.getWidth();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        final BufferedImage greyImage = new BufferedImage(width, height,BufferedImage.TYPE_BYTE_GRAY);
        Graphics grp = greyImage.getGraphics();
        grp.drawImage(myImage, 0, 0, null);
        File f2 = new File("images/BrightnessContrastTestInput.jpg");
        try {
            ImageIO.write(greyImage, "JPG", f2);
        } catch (IOException x) {
            x.printStackTrace();
        }

        while (flag == true) {
            System.out
                    .println(" 1.Brightness \n 2.Contrast \n 3.EXIT!");
            choice = Integer.parseInt(br.readLine());

            switch (choice) {
            case 1:
                //increase brightness

            case 2:
                //increase contrast
            case 3:
                flag = false;
                break;
            default:
                System.out.println("Invalid Option. Please try again.");
                break;
            }
        }
    }

    public static void ImageOperation(BufferedImage greyImage) {

        WritableRaster  myRaster = greyImage.getRaster();

        for (j = 0; j < greyImage.getHeight(); j++) {
            for (i = 0; i < greyImage.getWidth(); i++) {
                //some logic to increase contrast and brightness 
            }
        }

        File f = new File("images/"+imgName);
        try {
            ImageIO.write(greyImage, "JPG", f);
        } catch (IOException x) {
            x.printStackTrace();
        }
    }
    }

}

所有操作都是在ImageOperation方法中对可写栅格对象myRaster完成的,myRaster是使用BufferedImage对象greyImage创建的.

现在,在第一次运行中,当我(比方说)将图像的对比度增加某个因子时,它会给出正确的结果,在第二次运行中,如果我应用完全相同的对比度,它会在图像上执行该操作之前增强的图像,而不是原始图像,因此,在第二次中它给了我更高的对比度。

我的问题是,每次我增加 myRaster 上的对比度时,BufferedImage 对象 greyImage 是否都会更新?

最佳答案

查看 BufferedImage 的源代码,getRaster() 返回对缓冲图像内基础光栅对象的引用。因此,如果更改光栅,则实际上更改了图像。

您可能想要制作原始图像的副本,然后对副本进行操作。这应该保留原始内容。

关于java - 更改 WritableRaster 对象会影响 bufferedImage 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12248613/

相关文章:

matlab - Opencv 中的直方图

java - 如何在 Java 中对 BufferedImage 进行去饱和处理?

java - VM 启动后启动 Instrumentation Agent

java - 如何在java中编写未经检查的异常?

java - @ManyToMany 和更新实体

r - R 中的边缘检测、图像处理和最终数据提取

java - “Java”未被识别为内部或外部命令

android - 为什么我的 copyTo 函数没有将掩码复制到正确的 Mat 上?

java - 如何在Java中使透明图像变得不透明?

java - 从图像中剪切形状