0

私の問題は、画像を取得し、いくつかのピクセル値を変更してから目的の場所に設定し、画像を書き込んでから、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);
             }
           });
    }

}

4

1 に答える 1

0

画像をJPEGとして保存すると、圧縮されます。これにより、ピクセル値が変更されます。変更を加えたくない場合は、PNGなどのロスレス形式で保存する必要があります。

于 2013-03-16T22:00:32.570 に答える