2013-02-28 3 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); 
      } 
      }); 
    } 

을} 이미지가 JPEG로 저장

답변

0

얻을 수 있습니다, 그것은 압축됩니다. 이로 인해 픽셀 값이 변경됩니다. 변경 사항을 원하지 않으면 무손실 형식으로 저장해야합니다 (예 : PNG.