InputStream beim zweiten Mal fehlerhaft

internet

Top Contributor
Hallo,

ich habe eine Methode, bei dem ich mein Bild ausgeben will und refreshen bzw. mit einem Wasserzeichen versehen will.
Zuvor lade ich ein Bild hoch, das als Wasserzeichen verwendet werden soll (Methode: handleFileUploadPicture)

In der GUI habe ich verschiedene Einstellmöglichkeiten, und möchte nachdem ich etwas geändert habe, erneut das Bild refresehen und drücke hierzu einen Button "refresh", was die Methode doGeneratePreview() ausführt.


JSF Bean - ich nutze Primefaces für den Upload

Java:
    /**
     * Hochladen
     */
    public void handleFileUploadPicture(FileUploadEvent event) {

        try {

            UploadedFile primefacesUploadedFile = event.getFile();

            UploadFileHelper uploadFileHelper = new UploadFileHelper();
            uploadFileHelper.setInputStream(new BufferedInputStream(primefacesUploadedFile.getInputStream()));

            picWatermarkSettingType.setTempUploadFileHelper(uploadFileHelper);
            
        } catch (Exception e) {
            LOGGER.error(ExceptionUtils.getFullStackTrace(e));
        }
    }

Refreshen des Bildes (Wasserzeichen erstellen)

Java:
    /**
     * Watermark generieren
     */
    public void doGeneratePreview() {

        try {
            
            InputStream streamFile = picWatermarkProcessService
                    .createWatermarkPreview(picWatermarkSettingType);

        } catch (Exception e) {
            LOGGER.error(ExceptionUtils.getFullStackTrace(e));
        }
    }

Service - Klasse (=Wasserzeichen erstellen):

Java:
public ByteArrayInputStream createWatermarkPreview(PicWatermarkSettingType picWatermarkSettingType)
            throws IOException {

        // Sample Picture laden
        BufferedImage originalImage = generateSamplePicture();

        // Position laden von Enum
        Positions positions = // holt aus dem Enum den Wert

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        ///////////////////////
        // Vorschau für Bild
        ///////////////////////
            InputStream inputStream = picWatermarkSettingType.getTempUploadFileHelper().getInputStream();
            inputStream.mark(0);

            BufferedImage watermarkReduced = Thumbnails.of(ImageIO.read(inputStream))
                    .size(400, 300)
                    .rotate(picWatermarkSettingType.getRotation())
                    .asBufferedImage();

            BufferedImage watermark = Thumbnails.of(watermarkReduced)
                    .scale(picWatermarkSettingType.getScale() / 100)
                    .asBufferedImage();

            // Generiert die Vorschau
            Thumbnails.of(originalImage).scale(1)
                    .watermark(positions, watermark, (float) picWatermarkSettingType.getOpacity() / 100)
                    .outputFormat("jpg")
                    .outputQuality(1).toOutputStream(outputStream);

        return new ByteArrayInputStream(outputStream.toByteArray());
    }


    /**
     * Generiert ein Sample Picture
     *
     * @return
     */
    private BufferedImage generateSamplePicture() {

        BufferedImage buffer;

        buffer = new BufferedImage(400, 300, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = buffer.createGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, buffer.getWidth(), buffer.getHeight());
        g.dispose();

        return buffer;
    }

Beim ersten mal generieren des Wasserzeichen klappt das auch.
Beim zweiten Mal bekomme ich diesen Fehler (klicken des Buttons bzw. Ausführung der Methode: doGeneratePreview())

diesen Fehler:

PicWatermarkProcessService for method public java.io.ByteArrayInputStream de.dpunkt.myaktion.gallery.process.PicWatermarkProcessService.createWatermarkPreview(de.dpunkt.myaktion.gallery.model.PicWatermarkSettingType) throws java.io.IOException: javax.ejb.EJBException: java.lang.NullPointerException: Image cannot be null.

Was mache ich falsch? Was muss geändert werden? Warum ändert sich vermutlich der Inputstream von:
picWatermarkSettingType.getTempUploadFileHelper().getInputStream()

Vielen Dank für jede Hilfe
 

mihe7

Top Contributor
Wenn ich es richtig sehe, versuchst Du, einen InputStream wiederzuverwenden. Das geht nicht: gelesen ist gelesen. Dein UploadFileHelper sollte bei getInputStream einen neuen InputStream liefern.
 

internet

Top Contributor
ja, genau...
Hm... aber dann müsste ich erneut das Bild hochladen (handleFileUploadPicture(FileUploadEvent event)..
Aber genau das möchte ich nicht machen....

Welche anderen Möglichkeiten habe ich hier? Wäre das machbar?:

- Beim Hochladen den InputStream erstmal als eigenes Objekt speichern?
- Und dann immer eine Kopie von diesem InputStream - Objekt erstellen. Die Kopie dann an
picWatermarkSettingType.getTempUploadFileHelper().setInputStream(COPY) übergeben?
 

mihe7

Top Contributor
Das kommt ein wenig darauf an, was Du vorhast.

Grundsätzlich kannst Du natürlich den Stream verwenden, dann in ein Bild umwandeln, dann dem Bild ein Wasserzeichen hinzufügen und abschließend das Bild zurückgeben oder speichern. Dann brauchst Du nur im ersten Schritt den InputStream.

Genauso kannst Du die Datei erstmal abspeichern (s. UploadedFile#write) und dann den Dateinamen bzw. eine URI übergeben, von dem dann immer ein neuer InputStream erzeugt wird.

Bei kleinen Dateien gäbe auch die Möglichkeit, das Teil in ein byte-Array einzulesen und mit diesem weiterzuarbeiten (z. B. immer ein ByteArrayInputStream erzeugen).
 

internet

Top Contributor
danke für die Info
Mein Workflow sieht so aus:

1. Erstellen
- User lädt Bild hoch für Wasserzeichen
- Bild wird nur im Cache / InputStream gehalten und nicht auf Festplatte als File gespeichert
- User drückt auf "Generieren"
- Bild wird mit Wasserzeichen zurückgegeben und in GUI angezeigt
-> Genau hier habe ich das Problem. Wie "erneuere" ich den Stream bei jedem erneuten drücken auf "refresh" ?
- Wenn alles passt, speichert der User das ganze und das hochgeladene Bild wird ebenfalls auf die Festplatte gespeichert

2. Ändern

- Ist bisher ungetestet, aber ich denke hier habe ich nicht das Problem, da der Stream dann direkt vom Fileshare kommt.
- Bild wird von Fileshare gelesen, was er in 1) Erstellen gespeichert wird
- InputStream wird von dem File erstellt (ich gehe davon aus, dass ich hier nicht das Problem haben werde)

Also im Grunde benötige ich eine Lösung für 1. Erstellen
 

internet

Top Contributor
was meinst du genau unter "halten" ?

Ich "halte" in meiner Bean ja:
private InputStream streamFile;

und:


Java:
UploadFileHelper uploadFileHelper = new UploadFileHelper();
uploadFileHelper.setInputStream(new BufferedInputStream(primefacesUploadedFile.getInputStream()));
picWatermarkSettingType.setTempUploadFileHelper(uploadFileHelper)
-> (UploadFileHelper + InputStream wird nur beim Hochladen des Watermark Bilds erstellt).

Wie gesagt der erste "Generiere Watermark" Klick auf den Button funktioniert.
Nur beim nächsten Mal nicht mehr...
 

fhoffmann

Top Contributor
mach es nicht so spannend ;)
D.h. - was muss ich ändern?
Ich habe das Gefühl, dass du nicht wirklich weißt, was ein InputStream ist.
Bei einem InputStream handelt es sich (in deinem Fall) nur um die Verbindung zwischen der Datei auf der Festplatte und deinem Programm. Mit Hilfe des InputStreams kannst du (einmalig) den Inhalt der Datei in dein Programm einlesen. Der InputStream selbst enthält aber den Inhalt der Datei nicht. Es ist deshalb sinnlos, den InputStream zu kopieren oder ähnliches mit ihm zu machen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Problem mit url, inputStream und bytes beim Quellcode laden. Java Basics - Anfänger-Themen 6
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I Dateigröße von einem InputStream oder byte[] bekommen Java Basics - Anfänger-Themen 2
berserkerdq2 inputstream und bufferedwirter /outputstream und bufferedwriter Java Basics - Anfänger-Themen 9
T Bluetooth, Inputstream Java Basics - Anfänger-Themen 0
B Inputstream in file schreiben? Java Basics - Anfänger-Themen 23
B InputStream / OutputStream / PipedOutputStream und managedExecutorService Java Basics - Anfänger-Themen 3
B java.io.OutputStream zu java.io.InputStream konvertieren Java Basics - Anfänger-Themen 18
B Hilfe bei InputStream To File Java Basics - Anfänger-Themen 22
B InputStream (PDF) nach Image (PNG / JPG) konvertieren? Java Basics - Anfänger-Themen 2
B Konvertieren: Outputstream zu Inputstream Java Basics - Anfänger-Themen 13
J Was genau macht die Methode close() im InputStream? Java Basics - Anfänger-Themen 5
E InputStream im Servlet wirft Exception Java Basics - Anfänger-Themen 5
D InputStream parsen und als Bilddatei abspeichern Java Basics - Anfänger-Themen 1
G Input/Output InputStream gibt nicht die Korrekten Werte aus Java Basics - Anfänger-Themen 10
T Datentypen InputStream to list of Int (or similar) Java Basics - Anfänger-Themen 4
P bytes aus einem InputStream zählen Java Basics - Anfänger-Themen 2
P InputStream eines Musik-Streams abspielen Java Basics - Anfänger-Themen 2
I Resize Image - Einlesen von InputStream Java Basics - Anfänger-Themen 3
T Input/Output Exception bei einem InputStream Java Basics - Anfänger-Themen 2
W ProcessBuilder InputStream in Array speichern Java Basics - Anfänger-Themen 3
K InputStream erstellen Java Basics - Anfänger-Themen 4
B Input/Output Data / Buffer / File Outstream Inputstream Java Basics - Anfänger-Themen 2
L Webservice soll InputStream übergeben bekommen Java Basics - Anfänger-Themen 7
S Eigener InputStream, Hilfe bei read-Methode Java Basics - Anfänger-Themen 6
C InputStream Java Basics - Anfänger-Themen 2
O Input/Output Fragen zum InputStream Java Basics - Anfänger-Themen 7
E Input/Output Relativer Bild-Pfad für InputStream Java Basics - Anfänger-Themen 5
G Frage zu InputStream? Java Basics - Anfänger-Themen 11
E Socket InputStream "terminiert" nicht Java Basics - Anfänger-Themen 4
E Input/Output Inputstream während der Laufzeit füllen Java Basics - Anfänger-Themen 2
A Frage zu Beispiel eines Dekorierers von InputStream Java Basics - Anfänger-Themen 4
B Input/Output InputStream (JSch) in OutputStream (Blob) überführen Java Basics - Anfänger-Themen 8
P Input/Output InputStream Listener? Java Basics - Anfänger-Themen 7
M Eigener InputStream will nicht mit BufferedReader Java Basics - Anfänger-Themen 3
S Input/Output Neuen InputStream System.in setzen Java Basics - Anfänger-Themen 11
A InputStream gibt nur jede 2te Zeile aus Java Basics - Anfänger-Themen 7
J InputStream FTP Java Basics - Anfänger-Themen 8
brunothg Inputstream zu Filechannel Java Basics - Anfänger-Themen 6
K StringWriter/String nach InputStream konvertieren Java Basics - Anfänger-Themen 3
Benji0815 Inputstream aus Konsole in JTextArea Java Basics - Anfänger-Themen 14
A Problem mit InputStream Java Basics - Anfänger-Themen 4
bastiann Kann man Inputstream nur auf ein Zeichen anwenden? Java Basics - Anfänger-Themen 5
U Inputstream.read()/readLine() blockiert immer Java Basics - Anfänger-Themen 18
G Kompletten InputStream der Kommandokonsole ausgeben Java Basics - Anfänger-Themen 8
G InputStream aufrufen, ändern und zurück geben Java Basics - Anfänger-Themen 2
W Zeichen ersetzen im InputStream Java Basics - Anfänger-Themen 3
N String vom InputStream in TextArea übertragen Java Basics - Anfänger-Themen 6
A Frage zu Puffergröße bei InputStream Java Basics - Anfänger-Themen 9
G in einem inputstream auf " " abfragen? Java Basics - Anfänger-Themen 3
M Datei speichern mittels InputStream Java Basics - Anfänger-Themen 13
P InputStream in Byte-Array speichern Java Basics - Anfänger-Themen 2
G String in InputStream umwandeln? Java Basics - Anfänger-Themen 8
M Auslesen eines InputStream Java Basics - Anfänger-Themen 4
M Problem mit InputStream Java Basics - Anfänger-Themen 7
S Probleme mit InputStream- Rückgabe Java Basics - Anfänger-Themen 4
I InputStream von Konsole abfangen Java Basics - Anfänger-Themen 6
G InputStream im finally-Block schließen Java Basics - Anfänger-Themen 7
K InputStream? Java Basics - Anfänger-Themen 3
S Sockets and InputStream Java Basics - Anfänger-Themen 2
M InputStream einer Socketverbindung funktioniert nicht Java Basics - Anfänger-Themen 19
M Byte InputStream zu Zeichenformat Unicode bzw String konvert Java Basics - Anfänger-Themen 5
R InputStream erstellen, der aus String liest Java Basics - Anfänger-Themen 8
R ENTER in InputStream nicht lesen Java Basics - Anfänger-Themen 4
G InputStream auslesen und zurückschreiben Java Basics - Anfänger-Themen 9
R BufferedReader <-> InputStream Java Basics - Anfänger-Themen 3
R Suche geeignetes InputStream Java Basics - Anfänger-Themen 2
D InputStream -> Image Java Basics - Anfänger-Themen 6
M String zu InputStream/InputSource Java Basics - Anfänger-Themen 2
S Problem mit InputStream / flush() / BufferedReader Java Basics - Anfänger-Themen 19
C Aus ein Image-Objekt einen InputStream generieren? Java Basics - Anfänger-Themen 6
J InputStream in String umwandeln Java Basics - Anfänger-Themen 5
J InputStream ist null Java Basics - Anfänger-Themen 7
P InputStream, BufferedString Java Basics - Anfänger-Themen 3
Juelin jedit Fehler beim starten Java Basics - Anfänger-Themen 2
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
A Hilfe beim Lesen von Pfaden und Systemvariablen Java Basics - Anfänger-Themen 3
M Ausgabe beim Overloading Java Basics - Anfänger-Themen 3
W Null-Pointer Exception beim Programmstart Java Basics - Anfänger-Themen 8
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
M Nullpointer beim befüllen meiner Liste im Object Java Basics - Anfänger-Themen 3
J Beim Start des Programms zB. eine Linie in JPanel ausgeben Java Basics - Anfänger-Themen 4
I Projekte in IDE untereinander sharen / Probleme beim Build Java Basics - Anfänger-Themen 8
paulen1 Best Practice "Unchecked Assignment" Warnung beim erstellen eines 2D Arrays of Arraylists Java Basics - Anfänger-Themen 2
T Probleme beim Import eines Git-Repos Java Basics - Anfänger-Themen 2
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
N Array beim erstellen mit Werten füllen Java Basics - Anfänger-Themen 6
T DamagedFontException beim drucken Java Basics - Anfänger-Themen 3
Z SNAKE Schlange beim Aufheben von Essen verlängern Java Basics - Anfänger-Themen 4
Bugs Bunny Fehlerhafte Berechnung beim erneuten Durchlaufen der Schleife Java Basics - Anfänger-Themen 5
stormyark Fehler beim überschreiben einer Variable Java Basics - Anfänger-Themen 1
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
Fiedelbambu Prüfen von Komma stelle beim Taschenrechner Java Basics - Anfänger-Themen 5
B Objekte verschwinden beim Übersetzen Java Basics - Anfänger-Themen 5
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
X Hilfe beim Übertragen in eine For-Schleife Java Basics - Anfänger-Themen 1
S Fehler beim Programm Java Basics - Anfänger-Themen 2
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
M String beim einlesen formatieren Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben