[JAVA] Schreiben Sie mit ImageIO Byte-Array-Bilddaten in den Ausgabestream

Einführung

Als ich versuchte, mit ImageIO ein Byte-Array in outputStream einzufügen, blieb ich auf verschiedene Weise hängen, sodass ich es als Memo schreiben werde.

Vorerst irgendwie die Quelle

    public void writeOutputStream(byte[] byteArray, OutputStream outputStream, String fileFormat) throws IOException {
        ByteArrayInputStream imageInput = new ByteArrayInputStream(byteArray);
        BufferedImage buffer = ImageIO.read(imageInput);

        ImageWriter writer = null;
        Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName(fileFormat);
        if (iter.hasNext()) {
            writer = iter.next();
        }

        ImageWriteParam param = writer.getDefaultWriteParam();
        if (param.canWriteCompressed() && fileFormat.equals("jpg")) {
            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            param.setCompressionQuality(0.5f);
        }

        ImageOutputStream ios = ImageIO.createImageOutputStream(outputStream);
        writer.setOutput(ios);
        IIOImage iioImage = new IIOImage(buffer, null, null);
        writer.write(null, iioImage, param);
    }

Quellenbeschreibung

Ich denke nicht, dass die Erklärung so notwendig ist, aber ich werde die Punkte erklären, die wahrscheinlich erwischt werden.

Argumentannahme

Die Geschichte von ImageWriteParam

Dieses Mal musste ich ImageWriteParam verwenden, da ich mit der Komprimierung des Bildes beauftragt war. Dies ist der Teil, der diesmal am besten passt, und die Bedingungen für die Komprimierung sind streng und nur JPEG oder GIF sind möglich, und PNG verursacht eine Ausnahme. Es ist möglich, PNG mit einem JPEG-Writer zwangsweise zu komprimieren, aber leider war es nicht verwendbar.

Also entschied ich mich diesmal, das Urteil "param.canWriteCompressed () && fileFormat.equals (" jpg ")" zu fällen. canWriteCompressed ändert sich abhängig vom Typ von ImageWriteParam und wie oben beschrieben, werden beim Abrufen von getImageWritersByFormatName JPEG und GIF als true zurückgegeben und PNG als false zurückgegeben. Ich habe auch das JPG-Urteil hinzugefügt (tatsächlich ist auch "jpeg" erforderlich), aber im Fall von GIF-Bildern scheint es eine Ausnahme zu geben, wenn Sie auch "setCompressionType" angeben, aber ich war mir nicht sicher, was ich angeben soll. Also habe ich es reingelegt.

JavaDoc https://docs.oracle.com/javase/jp/7/api/javax/imageio/ImageWriteParam.html

Geschichte schreiben

ImageWrite wird zum Schreiben verwendet, aber wenn das tatsächlich zu schreibende Objekt setOutput ist, muss es in ein bestimmtes Format konvertiert werden. Da die ImageIO-Klasse über eine create-Methode verfügt, können Sie sie zum Konvertieren in einen ImageOutputStream verwenden. Ich habe jedoch nicht untersucht, welche Klasse beschreibbar ist. Derzeit gibt es kein Problem, wenn Sie es damit konvertieren, aber es ist problematisch, wenn ImageOutputStream in dem aus getImageWritersByFormatName extrahierten Writer nicht zulässig ist.

Solange ich es mit PNG, JPEG und GIF ausprobiert habe, war alles in Ordnung, daher denke ich nicht, dass es ein Problem für den täglichen Gebrauch ist. Wenn Sie Ihr eigenes ImageWrite erstellen möchten, beachten Sie, dass es weh tun kann, wenn Sie nicht richtig darüber nachdenken.

Wenn Sie ohne Komprimierung oder Optimierungsverarbeitung direkt in OutputStream schreiben möchten, können Sie dies schnell mit ImageIO.write tun, sodass Sie ohne Konvertierungsverfahren in Allowed OutputStream schreiben können.

Recommended Posts

Schreiben Sie mit ImageIO Byte-Array-Bilddaten in den Ausgabestream
Antwortdaten direkt im Frühjahr schreiben
So implementieren Sie die Image-Veröffentlichung mithilfe von Schienen
Mit ShiftJIS in Datei schreiben ・ Datei lesen (Kotlin / JVM)
Ablauf zur Implementierung der Image-Posting-Funktion mit ActiveStorage
So erstellen Sie hierarchische Kategoriedaten mithilfe von Vorfahren
Schieben Sie das Image mit Jib zum Docker-Hub