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
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
N Exception beim Verwenden von Arraylist? Java Basics - Anfänger-Themen 10
C Fehler beim erstellen eines Objektes Java Basics - Anfänger-Themen 3
C Brauche Hilfe beim Schreiben eines Programmes :/ Java Basics - Anfänger-Themen 1
cmn489 Werte beim Funktionsaufruf in ein Feld übertragen(falls dieses leer ist) Java Basics - Anfänger-Themen 1
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
Nerdinfekt BMI Rechner, fehler beim Zurückgeben des Strings? Java Basics - Anfänger-Themen 2
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
O Methode in while-Schleife aufrufen geht nur beim ersten Mal Java Basics - Anfänger-Themen 2
pry bitte Hilfe beim Kreditrechner objektorientiert Java Basics - Anfänger-Themen 6
J Hilfe beim Label animieren Java Basics - Anfänger-Themen 1
Avalon Programmierstil beim Mocken Java Basics - Anfänger-Themen 45
Avalon NullPointerException beim Mocken Java Basics - Anfänger-Themen 6
J Hilfe beim verstehen Java Basics - Anfänger-Themen 3
A Fehler beim Ausführen einer class Datei Java Basics - Anfänger-Themen 6
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
M Compiler-Fehler Fehler beim Ausführen des Codes Java Basics - Anfänger-Themen 25
L Anfänger braucht Hilfe - Stecke beim Lernen fest Java Basics - Anfänger-Themen 10
N Probleme beim printen von Arrays durch for Schleife Java Basics - Anfänger-Themen 3
Bluedaishi Hilfe beim erklären dieser Methode Java Basics - Anfänger-Themen 5
E Macht Java Rechenfehler beim Potenzieren und Mod? Java Basics - Anfänger-Themen 5
J Hilfe beim Programmieren Java Basics - Anfänger-Themen 5
C Fehler beim Speichern (Build projekt) Java Basics - Anfänger-Themen 42
S Endlosschleife beim Ausgeben einer LinkedList Java Basics - Anfänger-Themen 2
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
Kirby.exe Fehler beim Ausgeben Java Basics - Anfänger-Themen 2
L Brauche Hilfe beim arbeiten mit Konstruktoren Java Basics - Anfänger-Themen 20
D Was tun gegen zu komplzierten Denken beim Programmieren Java Basics - Anfänger-Themen 27

Ähnliche Java Themen

Neue Themen


Oben