2016-04-23 12 views
0

画像を読み込み、80 * 60に拡大して複製方法で複製してみようとしています。私の方法は個別にうまくいきますが、私がメインメソッドでそれらを呼び出すと、私のイメージは黒くなります。誰も私を助けることができますか?ここ は私のコードです:私は提案しています何返信方法でjavaで画像を拡大

import java.awt.BorderLayout; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.RenderingHints; 
import java.awt.image.BufferedImage; 
import java.io.File; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class Test { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     BufferedImage Image = null; 
     File fc = null; 

      try{ 

       fc = new File("C:\\1.jpg"); 
       Image = ImageIO.read(fc); 
       BufferedImage zoomin = new BufferedImage(ScaledImage(Image,80,60).getWidth(null),ScaledImage(Image,80,60).getWidth(null), BufferedImage.TYPE_BYTE_GRAY); 
       JFrame frame = new JFrame("Scaled Resolution"); 
       frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       JLabel lbl = new JLabel(); 
       lbl.setIcon(new ImageIcon(ImgReplication(zoomin,2))); 
       frame.getContentPane().add(lbl, BorderLayout.CENTER); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 

      } 
      catch (Exception e1){ 
      System.out.println(e1); 
      } 


    } 
public static BufferedImage ImgReplication(BufferedImage image, int n) { 

     int w = n * image.getWidth(); 
     int h = n * image.getHeight(); 

     BufferedImage enlargedImage = 
       new BufferedImage(w, h, image.getType()); 

     for (int y=0; y < h; ++y) 
      for (int x=0; x < w; ++x) 
       enlargedImage.setRGB(x, y, image.getRGB(x/n, y/n)); 

     return enlargedImage; 

    } 
public static BufferedImage ScaledImage(Image img, int w , int h){ 

    BufferedImage resizedImage = new BufferedImage(w , h , BufferedImage.TYPE_BYTE_GRAY); 
    Graphics2D g2 = resizedImage.createGraphics(); 
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
    g2.drawImage(img, 0, 0, w, h, null); 
    g2.dispose(); 
    return resizedImage; 
} 


} 
+0

アルファチャンネルを考慮していますか? –

+0

は個別にうまく機能しますか?あなたはどの点でイメージを描き、それはうまくいくのですか? – gpasch

+0

私が読むはずのイメージは、グレースケールBYTEです。私はアルファを持っていません。 – Nazi

答えて

1

はこれです:

BufferedImage Image = null; 
    File fc = null; 

     try{ 

      fc = new File("C:\\1.jpg"); 
      Image = ImageIO.read(fc); 
      BufferedImage sc=ScaledImage(Image,80,60); 
      JFrame frame = new JFrame("Scaled Resolution"); 
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      JLabel lbl = new JLabel(); 
      lbl.setIcon(new ImageIcon(ImgReplication(sc,2))); 
      frame.getContentPane().add(lbl, BorderLayout.CENTER); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 

     } 
     catch (Exception e1){ 
     System.out.println(e1); 
     } 


} 

public static BufferedImage ImgReplication(BufferedImage image, int n) { 

    int w = n * image.getWidth(); 
    int h = n * image.getHeight(); 

    BufferedImage enlargedImage = 
      new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 

    for (int y=0; y < h; ++y) 
     for (int x=0; x < w; ++x) 
      enlargedImage.setRGB(x, y, image.getRGB(x/n, y/n)); 

    return enlargedImage; 

} 

public static BufferedImage ScaledImage(Image img, int w , int h){ 

    BufferedImage resizedImage = new BufferedImage(w , h , BufferedImage.TYPE_INT_RGB); 
    Graphics2D g2 = resizedImage.createGraphics(); 
    g2.drawImage(img, 0, 0, w, h, null); 
    g2.dispose(); 
    return resizedImage; 
} 


} 
+0

It doesn何の違いもありません。私はまだ黒を手に入れます。なぜ私はこれを取得しているのかわかりません。あなたの努力に感謝します:) – Nazi

+0

あなたはまた正しい引数を見逃しましたImgReplication(sc、2) – gpasch

+0

いいえ、私はそれを見逃しませんでした。次の行があります。lbl.setIcon(new ImageIcon(ImgReplication(sc、2)));私は問題がscaledImageメソッドを呼び出すことから来ていることを知っています。画像が黒くなるこの線を打つまで、すべてがうまくいくからです。しかし、私は何が起こっているのか理解していません。 – Nazi

1

ので、 "コア" の問題はここにある...

BufferedImage zoomin = new BufferedImage(
      ScaledImage(Image,80,60).getWidth(null), 
      ScaledImage(Image,80,60).getWidth(null), 
      BufferedImage.TYPE_BYTE_GRAY); 

このすべてがされます80x60という空白の画像を作成し、それを達成するために多くの作業をしています。代わりに、あなたはちょうどあなたがそれをグレースケールにしたい場合は、あなたが同じの種類BufferedImage.TYPE_BYTE_GRAYの新しいBufferedImageイメージを作成する必要があると思い、...のような

BufferedImage zoomin = ScaledImage(Image,80,60); 

を何かを使用する必要があります

zoomin画像としてサイズとそれにzoomin画像を描く...

あなたはまた、画像のスケーリングに関するいくつかのより多くのアイデアをQuality of Image after resize very low -- JavaJava: maintaining aspect ratio of JPanel background imageを見てみるのが好きかもしれません。 get/setRGBが特に効率的ではないとdrawImage(x, y, w, h)の品質は、そのいずれかの偉大な

のRunnableの例ではありません...だから

は、提案の修正を行った後、私はあなたのアルゴリズムを実行し、それがこの思い付きました。.. 。

Example

オリジナル、ScaledImageImgReplication

import java.awt.EventQueue; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Image; 
import java.awt.RenderingHints; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        try { 
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
         ex.printStackTrace(); 
        } 

        JFrame frame = new JFrame("Testing"); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.add(new TestPane()); 
        frame.pack(); 
        frame.setLocationRelativeTo(null); 
        frame.setVisible(true); 
       } catch (IOException ex) { 
        ex.printStackTrace();; 
       } 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() throws IOException { 
      BufferedImage master = ImageIO.read(new File("...")); 
      setLayout(new GridBagLayout()); 

      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 

      add(new JLabel(new ImageIcon(master)), gbc); 
      add(new JLabel(new ImageIcon(ScaledImage(master, 80, 60))), gbc); 
      add(new JLabel(new ImageIcon(ImgReplication(master, 2))), gbc); 
     } 

    } 

    public static BufferedImage ScaledImage(Image img, int w, int h) { 

     BufferedImage resizedImage = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY); 
     Graphics2D g2 = resizedImage.createGraphics(); 
     g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
     g2.drawImage(img, 0, 0, w, h, null); 
     g2.dispose(); 
     return resizedImage; 
    } 

    public static BufferedImage ImgReplication(BufferedImage image, int n) { 

     int w = n * image.getWidth(); 
     int h = n * image.getHeight(); 

     BufferedImage enlargedImage 
       = new BufferedImage(w, h, image.getType()); 

     for (int y = 0; y < h; ++y) { 
      for (int x = 0; x < w; ++x) { 
       enlargedImage.setRGB(x, y, image.getRGB(x/n, y/n)); 
      } 
     } 

     return enlargedImage; 

    } 
} 

だから私のために大丈夫だと思われる

+0

私はあなたが育てたものを試しましたが、何も変わりません。まだスケーリングされた黒い画像。私は高品質のイメージを探しているわけではありません。このプログラムの主なアイデアは、画像補間のさまざまな方法を比較して、どちらがより良い画像を提供するかを調べることです。 – Nazi

+0

提案コードを追加するとコードが正常に動作しているようです。 – MadProgrammer

+1

16年以上にわたり、私は画像のスケーリングに関する多くの研究を行ってきましたが、迅速で効率的なアルゴリズムを提案しようとしています(この例題はhttp://stackoverflow.com/questions/14115950/quality-of-image-サイズ変更後の非常に低いJava/14116752#14116752)と[この例](http://stackoverflow.com/questions/11959758/java-maintaining-aspect-ratio-of-jpanel-background-image/11959928# 11959928)は、[The Perils of Image.getScaledInstance()](https://today.java.net/pub/a/today/2007/04/03/perils-of)の結果に基づいているsimular prinicに基づいています。 -image-getscaledinstance.html)と他のブログ – MadProgrammer