2012-09-03 86 views
2

我使用下面的代碼編寫一個程序來對圖像進行各種操作:改變WritableRaster對象影響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都會更新?

回答

3

查看BufferedImage的源代碼,getRaster()返回對緩衝圖像內的底層柵格對象的引用。所以如果你改變光柵,你已經有效地改變了圖像。

您可能想複製原始圖像,然後對副本進行操作。這應該保留原來的。

+0

這正是問題所在,製作了原始圖像的副本,並將其發送給函數。謝謝! – md1hunox

相關問題