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()
返回对缓冲图像中基础光栅对象的引用。因此,如果更改光栅,则实际上更改了图像
您可能希望制作原始图像的副本,然后对副本进行操作。这将保留原始图像。这正是问题所在,制作了原始图像的副本,并将其发送给函数。谢谢