2013-02-28 82 views
0

我的問題是我拍攝的圖像,然後我改變了一些像素值,然後設置它們到所需的位置,然後我寫圖像,然後我用ImageIO.read()讀取圖像使用圖像對象我沒拿到之前的值,所以,我怎麼能得到以前的值使用imageio.read設置像素後得到錯誤的像素值

import java.awt.*; 

import java.awt.event.*; 

import java.awt.image.*; 

import java.io.*; 

import javax.imageio.*; 

import javax.swing.*; 


public class LoadImageApp extends JFrame implements ActionListener 

{ 

     BufferedImage img=null; 
    BufferedImage img1=null; 
    BufferedImage mask=null; 
    BufferedImage rao=null; 
     JButton b1; 
    int pixel[][]; 
    int w,h; 
    JFileChooser chooser; 
    File file; 
     public void paint(Graphics g) 
     { 
     g.drawImage(img,50,50,150,200,this); 
    g.drawImage(mask,600,100,150,200,this); 

     } 

    public LoadImageApp() 
     { 
     super("Image..."); 
    setSize(800,800); 
    setLayout(new FlowLayout()); 
    b1=new JButton("Select Image"); 
    b1.setSize(250,20); 
    add(b1); 
    b1.addActionListener(this); 
    setVisible(true); 
     } 
    public void actionPerformed(ActionEvent ae) 
    { 
    try 
    { 

        chooser = new JFileChooser("C:/Users/Ravi/Desktop"); 
      chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
       int returnVal = chooser.showOpenDialog(this); 
       if(returnVal == JFileChooser.APPROVE_OPTION) 
      { 
      file=chooser.getSelectedFile(); 
      img=ImageIO.read(file); 
      mask=new BufferedImage(img.getWidth(),img.getHeight(),img.getType()); 
      repaint(); 
      img1=img.getSubimage(0,0,100,150); 
       } 
      repaint(); 
      pixel=getPixels(img); 
      int i=80,j=50; 
      int temp[]={1,1,1,1}; 
      int temp1=setPixel(temp); 
      for(j=0;j<w;j++) 
      pixel[i][j]=temp1; 
      System.out.println("pixels before.."+pixel[80][3]); 
      this.setPixels();//setting pixels.... 
      ImageIO.write(mask,"jpeg",new File("aft-con.jpeg"));//write the image 

      BufferedImage next=ImageIO.read(new File("aft-con.jpeg")); 
      ord=getPixels(next);//getting the previous values... 
      org=getARGB(ord[80][3]); 
      System.out.println("pixels before.."+pixel[80][3]);//but it is not same... 

     } 
     catch(Exception e) 
     { 
      System.out.println("error in action"); 
     } 
    } 
    public int setPixel(int rgb[]) 
    { 
     int pixel = (((rgb[0] & 0x0ff)<<24)|((rgb[1] & 0x0ff)<<16)|((rgb[2] & 0x0ff)<<8)|(rgb[3] & 0x0ff)); 
     return pixel; 
    } 
    public int[] getARGB(int pixel) 
    { 
      int rgb[]=new int[4]; 
      rgb[0] =((pixel >> 24) & 0xff); 
      rgb[1] = ((pixel >> 16) & 0xff); 
      rgb[2] =((pixel >> 8) & 0xff); 
      rgb[3] =((pixel) & 0xff); 

      return rgb; 
    } 

    public int[][] getPixels(BufferedImage img) 
    { 
     w=img.getWidth(); 
     h=img.getHeight(); 
     int pixels[][]=new int[h][w]; 

    int i=0,j=0; 
    try 
    { 
     for(i=0;i<h;i++) 
     for(j=0;j<w;j++) 
      pixels[i][j]=img.getRGB(j,i); 

    } 
    catch(Exception e) 
    { 
     System.out.println("i:"+i+" j:"+j); 
    } 


    return pixels; 
} 
public void setPixels() 
{ 
     w=img.getWidth(); 
     h=img.getHeight(); 

      int i=0,j=0; 
     try 
     { 
     for(i=0;i<h;i++) 
     for(j=0;j<w;j++) 
     mask.setRGB(j,i,pixel[i][j]); 
     } 
     catch(Exception e) 
     { 
       System.out.println("error at setting pixel"); 
     } 
} 

    public static void main(String[] args) 
    { 

     LoadImageApp f = new LoadImageApp(); 
      f.addWindowListener(new WindowAdapter(){ 
      public void windowClosing(WindowEvent e) { 
      System.exit(0); 
      } 
      }); 
    } 

}

回答

0

當圖像保存爲JPEG,它就會被壓縮。這會導致像素值發生變化。如果您不想進行任何更改,則需要保存爲無損格式,例如PNG。