Java 更改可写光栅对象会影响BuffereImage对象

Java 更改可写光栅对象会影响BuffereImage对象,java,image-processing,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.In

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

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();
        }
    }
    }

}
导入java.awt.Desktop;
导入java.awt.Graphics;
导入java.awt.image.buffereImage;
导入java.awt.image.WritableRaster;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.imageio.imageio;
公共类亮度对比{
公共静态void main(字符串[]args)引发IOException{
//TODO自动生成的方法存根
int i,j,choice=1;
字符串imgName;
布尔标志=真;
字符串imagePath=“images/test.jpg”;
BuffereImage myImage=ImageIO.read(新文件(imagePath));
int height=myImage.getHeight();
int width=myImage.getWidth();
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
final BuffereImage greyImage=新的BuffereImage(宽度、高度、BuffereImage.TYPE_BYTE_GRAY);
Graphics grp=greyImage.getGraphics();
grp.drawImage(myImage,0,0,null);
文件f2=新文件(“images/brightnessContractTestInput.jpg”);
试一试{
图像IO.write(灰度图像,“JPG”,f2);
}捕获(IOX异常){
x、 printStackTrace();
}
while(flag==true){
系统输出
.println(“1.亮度\n 2.对比度\n 3.退出!”);
choice=Integer.parseInt(br.readLine());
开关(选择){
案例1:
//增加亮度
案例2:
//增加对比度
案例3:
flag=false;
打破
违约:
System.out.println(“无效选项。请重试。”);
打破
}
}
}
公共静态无效图像操作(BuffereImage greyImage){
WritableRaster myRaster=greyImage.getRaster();
对于(j=0;j
所有的操作都是在可写光栅对象上完成的,在
ImageOperation
方法中,
mygraster
是使用BufferedImage对象
greyImage
创建的

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


我的问题是,每当我在
myRaster
上增加对比度时,BuffereImage对象
greyImage
是否会得到更新

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


您可能希望制作原始图像的副本,然后对副本进行操作。这将保留原始图像。

这正是问题所在,制作了原始图像的副本,并将其发送给函数。谢谢