2011-10-12 12 views
0

イメージを受け取り、それを縮小する方法があります。 私がキャンバスを使用しているのは、画像が自動的に拡大縮小されると思うからです。キャンバスでスケーリングした後にBufferedImageがすべて黒くなる

変換後、出力イメージは完全に黒です。誰でもこれを修正する方法についての手掛かりがありますか?

try { 
     InputStream in = new ByteArrayInputStream(f.getBytes()); 
     BufferedImage image = ImageIO.read(in); 

     File beforescale = new File("beforescale.jpg"); 
     ImageIO.write(image, "jpg", beforescale); //works 

     Canvas canvas = new Canvas(); 
     canvas.setSize(100, 100); 
     canvas.paint(image.getGraphics()); 

     image = canvasToImage(canvas); 
     File outputfile = new File("testing.jpg"); 
     ImageIO.write(image, "jpg", outputfile); //all black 

     response.getWriter().print(canvas); 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

private BufferedImage canvasToImage(Canvas cnvs) { 
    int w = cnvs.getWidth(); 
    int h = cnvs.getHeight(); 
    int type = BufferedImage.TYPE_INT_RGB; 
    BufferedImage image = new BufferedImage(w,h,type); 
    Graphics2D g2 = image.createGraphics(); 
    cnvs.paint(g2); 
    g2.dispose(); 
    return image; 
} 

答えて

2

問題がキャンバスに画像をペイントするcanvas#paint(Graphics)を使用し、ここで、次のとおりです。

canvas.paint(image.getGraphics()); 

そして、ここであなたがイメージにキャンバスをペイントするために、再度#ペイント(グラフィックス)をキャンバス

明らかに、これらの2つのうちの1つが失敗します。このメソッドは、キャンバスをイメージにペイントするためにのみ使用できます。

getScaledInstance()imageで使用します。

BufferedImage image = ImageIO.read(in); 
Image smallerImg = image.getScaledInstance(100,100,Image.SCALE_SMOOTH); 
ImageIO.write(smallerImg, "jpg", outputfile); 
+0

ご返信ありがとうございます。私はgetScaledInstanceが良い結果を出さないことを読んだので、それを回避しようとしたのです。まだそれは本当ですか? (http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html) –

+0

@エミール - その記事から「一般的な苦情はパフォーマンスが悪い」 。これが本当かどうか分からない、それはあなたにとって遅すぎるのだろうか?とにかく 'getScaledInstance()'を使ってキャンバスを使うとおそらく助けにならないでしょう。別のルートを使用する場合は、記事に記載されているルートの1つを選択します。 – Ishtar

関連する問題