2016-04-18 18 views
1

URLからimageをロードしようとしていますが、thisのような画像が届きます。Java。 URLからの壊れた画像

コード:

@Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D)g; 
      ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      try { 
       URL url = new URL("http://s.developers.org.ua/img/announces/java_1.jpg"); 
       BufferedInputStream in = new BufferedInputStream(url.openStream()); 
       byte[] b = new byte[512]; 
       while (in.read(b)!=-1) 
        out.write(b); 
       Image img = ImageIO.read(new ByteArrayInputStream(out.toByteArray())); 
       g2.drawImage(img, 0, 0, getWidth(), getHeight(), null); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

答えて

2
  1. paintComponentメソッド内の画像を読んではいけない、それはメソッドがイベントディスパッチャスレッド(EDT)上で実行されるよう、アプリケーションが、低迷見えるようになります。また、コンポーネントを塗り直すたびに、イメージを何度もダウンロードすることを意味します。代わりに、それを正面から読むか、別のスレッドで(すなわち、SwingWorkerを使用)、paintComponentメソッドの中からg.drawImage(...)を呼び出してください。

  2. 壊れたイメージの理由は、(値が-1でない限り)あなたが読んでいるどのように多くのバイトに注意を払っていない、あなたのバイトのコピーコード、であるが、代わりに無条件512バイトをコピーします。

    URL url = new URL("http://s.developers.org.ua/img/announces/java_1.jpg"); 
    try (BufferedInputStream in = new BufferedInputStream(url.openStream())) { 
        BufferedImage img = ImageIO.read(in); 
    } 
    

    は余分tryを追加する(してみてください-で-リソース):しかし、あなたはここで、あなたは、単にコードをより単純で読みやすく、このように、ImageIO.readにストリームを渡すことができることを行う必要はありません。ブロックはリソースリークを避けるためにストリームが適切に閉じられていることを確認します。

  3. 完全を期すため、バイトのコピーコードを修正するために、正しいバージョンは次のようになります。

    // ... as above ... 
    byte[] b = new byte[512]; 
    int bytesRead; // Keep track of the number of bytes read into 'b' 
    while ((bytesRead = in.read(b)) != -1) 
        out.write(b, 0, bytesRead); 
    
0

私は地元のURLからいくつかのコードのコピーファイルを持っている...これまでのところ、結果は実際のソースのように同じです。ちょうどそれを解決するために役立つかもしれないいくつかの変更を行う。

import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.net.URL; 
import java.util.ArrayList; 
import org.apache.commons.io.FilenameUtils; 
import javax.imageio.ImageIO; 

public class ImagesUrlToImagesLocal { 
    public ArrayList<String> getIt(ArrayList<String> urlFile) 
    { 
     ArrayList<String> strResult = new ArrayList<String>(); 
     Image imagesUrl = null; 
     String baseName = null; 
     String extension = null; 
     File outputfile = null; 
     try { 
      for (int i = 0; i < urlFile.size(); i++) 
      { 
       URL url = new URL(urlFile.get(i)); 
       baseName = FilenameUtils.getBaseName(urlFile.get(i)); 
       extension = FilenameUtils.getExtension(urlFile.get(i)); 
       imagesUrl = ImageIO.read(url); 
       BufferedImage image = (BufferedImage) imagesUrl; 
       outputfile = new File("temp_images/" + baseName + "." + extension); 
       ImageIO.write(image, extension, outputfile); 
       strResult.add("temp_images/" + baseName + "." + extension); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return strResult; 
    } 
} 
1

これが唯一の問題であれば、私は知らないが、あなたはより多くを書くかもしれません取得する。あなたはあまり

を書きます、最後のバッファが正確に512バイト長であれば、

int len; 
while ((len=in.read(b))!=-1) 
    out.write(b, 0, len); 

そうでない場合: 私はあなたにあなたの文章のコードを変更することを示唆しています

関連する問題