2017-04-12 6 views
0

助けてください。BufferedImageを別のBufferedImageに描画することはできません

私は大きな出力BufferedImage(スケーリング付き)に入力BufferedImageを描画しようとしています。 、次のコードを見てみてください:

public class Main { 
    public void print(BufferedImage img, int width, int height) { 
     for (int y = 0; y < height; y++) { 
      for (int x = 0; x < width; x++) { 
       System.out.print(img.getRGB(x, y) + " "); 
      } 
      System.out.println(""); 
     } 
    } 

    public static void main(String[] args) { 
     Main app = new Main(); 

     // create input image 
     int inputWidth = 2; 
     int inputHeight = 2; 
     BufferedImage inputImg = new BufferedImage(inputWidth, inputHeight, BufferedImage.TYPE_INT_ARGB); 

     // fill input image 
     for (int y = 0; y < inputHeight; y++) { 
      for (int x = 0; x < inputWidth; x++) { 
       inputImg.setRGB(x, y, y * inputWidth * (1 << 16) + x); 
      } 
     } 

     // print 
     app.print(inputImg, inputWidth, inputHeight); 

     // create output image 
     int outputWidth = 4; 
     int outputHeight = 4; 
     BufferedImage outputImg = new BufferedImage(outputWidth, outputHeight, BufferedImage.TYPE_INT_ARGB); 

     // draw inputImg into outputImg 
     Graphics2D g = outputImg.createGraphics(); 
     g.drawImage(inputImg, 0, 0, outputImg.getWidth(), outputImg.getHeight(), 0, 0, inputImg.getWidth(), inputImg.getHeight(), null); 

     // print 
     app.print(outputImg, outputImg.getWidth(), outputImg.getHeight()); 
    } 
} 

実行は、次の出力を生成します。私は描くことができるよので

0 1 
131072 131073 
0 0 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

は、ライン呼び出し、例えば、Graphics2Dオブジェクトの作品のように思えますdrawLine関数です。ですから、私はinputImgが問題の原因だと思いますが、何が間違っているのか分かりません。

更新: 私はAffineTransformを使用しようとしましたが、残念ながら助けにはなりませんでした。私に

Graphics2D g = outputImg.createGraphics(); 
AffineTransform at = new AffineTransform(); 
at.setToIdentity(); 
at.scale(2, 2); 
g.drawImage(inputImg, at, null); 
+0

イメージを手動でスケーリングする必要がありますか? 'Graphcs2D'にはスケーリング操作を実行できる' AffineTransform'があります – MadProgrammer

+0

ドキュメントでは、このバージョンのdrawImageはその場でinputImageを拡大する必要があると書かれています[drawImage](https://docs.oracle.com/javase/7/docs/api/java/ awt/Graphics.html#drawImage(java.awt.Image、%20int、%20int、%20int、%20int、%20int、%20int、%20int、%20int、%20java.awt.image.ImageObserver)) – JavaPupil

+0

ええそれはいいです、あなたが 'AffineTransform'を使うことができない何らかの理由はありますか? – MadProgrammer

答えて

1

、これは私が変更した場合、あなたが...

を使用している色の計算の問題のようです...

inputImg.setRGB(x, y, y * inputWidth * (1 << 16) + x); 

に...

int rgb = y * inputWidth * (1 << 16) + x; 
inputImg.setRGB(x, y, new Color(rgb).getRGB()); 

結果は黒いですが、結果は出ます。

私の方法は

-16777216 -16777215 
-16646144 -16646143 

ユアーズ

を生成を生成します。これは、デフォルトでは、あなたの計算は、この彼らが作り出すことを出力に出て生まれることができ 0

alpha値を生成していることを私に示唆します

0 1 
131072 131073 

今、私はこの種の計算をしません。なぜなら、APIがそれを実行するために利用可能なときではないからですr私 - 私は馬鹿になる; P

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 

public class Main { 

    public void print(BufferedImage img, int width, int height) { 
     for (int y = 0; y < height; y++) { 
      for (int x = 0; x < width; x++) { 
       System.out.print(img.getRGB(x, y) + " "); 
      } 
      System.out.println(""); 
     } 
    } 

    public static void main(String[] args) { 
     Main app = new Main(); 

     // create input image 
     int inputWidth = 2; 
     int inputHeight = 2; 
     BufferedImage inputImg = new BufferedImage(inputWidth, inputHeight, BufferedImage.TYPE_INT_ARGB); 

     // fill input image 
     System.out.println(inputWidth + "x" + inputHeight); 
     Color color = Color.RED; 
     for (int y = 0; y < inputHeight; y++) { 
      for (int x = 0; x < inputWidth; x++) { 
       int rgb = y * inputWidth * (1 << 16) + x; 
       inputImg.setRGB(x, y, new Color(rgb).getRGB()); 
      } 
     } 

     JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(inputImg))); 

     // print 
     app.print(inputImg, inputWidth, inputHeight); 

     // create output image 
     int outputWidth = 4; 
     int outputHeight = 4; 
     BufferedImage outputImg = new BufferedImage(outputWidth, outputHeight, BufferedImage.TYPE_INT_ARGB); 

     // draw inputImg into outputImg 
     Graphics2D g = outputImg.createGraphics(); 
     g.drawImage(inputImg, 0, 0, outputImg.getWidth(), outputImg.getHeight(), 0, 0, inputImg.getWidth(), inputImg.getHeight(), null); 
     g.dispose(); 
     JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(outputImg))); 

     // print 
     app.print(outputImg, outputImg.getWidth(), outputImg.getHeight()); 
    } 
} 
関連する問題