3 Stimmen

Wie kann ich sicherstellen, dass das Bild vollständig ist? (in Java)

Ich verwende den folgenden Code, um ein Bild von einer URL zu erhalten:

    URL url=new URL("http://www.google.com/images/logos/ps_logo2.png");
    InputStream in=url.openStream();
    ByteArrayOutputStream tmpOut = new ByteArrayOutputStream();
    byte[] buf = new byte[512];
    int len;
    while (true) {
        len = in.read(buf);
        if (len == -1) {
            break;
        }
        tmpOut.write(buf, 0, len);
    }
    tmpOut.close();

    byte[] picture=tmpOut.toByteArray();
    System.out.println(picture.length);

Dieser Code ist in Ordnung, aber meine Internetverbindung ist sehr schlecht.

Daher erhalte ich vielleicht ein defektes Bild wie dieses:

alt text

Wie kann ich sicherstellen, dass die Bilddatei vollständig ist?

Ich denke, Sie können diesen Code hinzufügen, um dies zu versuchen und zu testen:

if (len == -1) { ändern zu if (len == -1 || (int)(Math.random()*100)==1 ) {

Vollständiger Testcode:

    URL url=new URL("http://www.google.com/images/logos/ps_logo2.png");
    InputStream in=url.openStream();
    ByteArrayOutputStream tmpOut = new ByteArrayOutputStream();
    byte[] buf = new byte[512];
    int len;
    while (true) {
        len = in.read(buf);
        if (len == -1 || (int)(Math.random()*100)==1 ) {
            break;
        }
        tmpOut.write(buf, 0, len);
    }
    tmpOut.close();
    byte[] picture =tmpOut.toByteArray();
    System.out.println(picture.length);

Danke für die Hilfe :)

3voto

Stewart Murrie Punkte 1321

Hast du schon mal überlegt, die ImageIO Klasse zum Laden von Bildern zu verwenden - sie kümmert sich um viele dieser Details für dich:

Image image;
try {
  URL url = new URL("http://www.google.com/images/logos/ps_logo2.png");
  image = ImageIO.read(url);
} catch (IOException e) {
   ...
}

1voto

dvhh Punkte 4663

Versuchen Sie stattdessen URL.openConnection() zu verwenden Sie erhalten ein URLConnection-Objekt, auf dem Sie die Inhaltslänge abfragen können (sofern vorhanden) (URLConnection.getContentLength()). Das würde in den meisten Fällen helfen.

In anderen Fällen können Sie den Bildheader analysieren, um seine Länge zu erhalten, aber das würde einen dedizierten Analyzer für jedes Format erfordern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X