Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal

internet

Top Contributor
Hallo,

auf meinem Mac - Laufwerk habe ich ein Bild, welches hochkant ist.
Das Bild möchte ich nun hochladen und verwende u.a. folgende Funktion (kleiner machen etc.)...
Das Problem scheint mir nun, dass hier das Bild nicht so betrachtet wird, wie es auf meinem Laufwerk ist.
Ggf. speichert es auf meinem Mac die EXIF Informationen so ab, sodass das Bild in meinem File Explorer entsprechend angezeigt wird.
Lade ich das Bild nun hoch, dann ist es nicht hochkant.
Kennt jemand das Problem?

Java:
    /**
     * InputStream ausgeben
     *
     * @throws IOException
     */
    public static BufferedImage convertByteArrayToBufferedImage(byte[] byteArray) throws IOException {

        InputStream is = new ByteArrayInputStream(byteArray);
        BufferedImage newBi = ImageIO.read(is);
       
        return newBi;
    }


Java:
public ByteArrayOutputStream resizePicture(byte[] inputStreamOriginal, int width, int height)
            throws IOException {
        BufferedImage bimg = StorageHelper.convertByteArrayToBufferedImage(inputStreamOriginal);

        int originalWidth = bimg.getWidth();
        int originalHeight = bimg.getHeight();

        // Nur verkleinern, wenn das Original Bild wirklich größer ist:
        if (originalWidth > width || originalHeight > height) {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            Thumbnails.of(bimg).size(width, height).outputFormat("jpg").toOutputStream(outputStream);
            return outputStream;
        }

    return null;
    }

Wie kann man das lösen?
 

Robert Zenz

Top Contributor
Wie du bereits selbst festgestellt hast, ist ganz sicher die Sache die dass das Bild tatsaechlich in der Orientierung ist welche du am Server siehst. Der Dateimanager zeigt dir das Bild rotiert an basierend auf dem Metadaten des Bildes.

Da gibt es jetzt zwei Moeglichkeiten: Entweder du drehst das Bild am Client, oder du drehst es am Server.

Also entweder du rotierst das Bild auf deinem Computer so das es richtig ist (jhead ist ein moegliches Programm um dies in Masse zu machen)...oder du laedst das Bild hoch, liest dann davon die Metadaten aus (zum Beispiel mit metadata-extractor) und rotierst dann das Bild manuell basierend auf dieser Information.
 

internet

Top Contributor
Ich würde es gerne am Server drehen - also so, wie es im File Explorer angezeigt ist...

Ich habe mir mal soeben die Größen der Datei angesehen:
- Auf dem File Explorer:
Breite: 3024px
Höhe: 4032px

Nachdem ich das BufferedImage bekommen habe, gerade andersherum:

int originalWidth = bimg.getWidth(); // 4032px
int originalHeight = bimg.getHeight(); //3024px

https://github.com/drewnoakes/metadata-extractor habe ich mir bereits angeschaut. Dass es die Lib gibt, sodass ich die EXIF Infos auslesen kann, weiß ich nun....

Aber mir ist dann nicht klar:
1. Wann muss ich das Bild drehen?
2. Wie drehe ich das Bild?
 

Robert Zenz

Top Contributor
1. Wann muss ich das Bild drehen?

Weil das Bild mit 4032x3024 so ist, es ist horizontal, nicht vertikal. In dem Metadaten steht drinnen "hey, das Bild muss um 90° im Uhrzeigersinn gedreht angezeigt werden damit es stimmt". Wenn du jetzt das rohe bild betrachtest, interessieren dich die Metadaten nicht die Bohne. Das ist so wie wenn du ein Schild an deiner Tuer hast "Schuhe abwischen vor dem eintreten"...kannste machen, musste aber nicht.

2. Wie drehe ich das Bild?

Das einfachste wird sein wenn du dir ein zweites BufferedImage in der rotierten Groesze erzeugst, und dann ueber das Graphics Objekt einfach das andere Bild rotiert hinein zeichnest. Ich habe sowas aber schon seit Ewigkeiten nicht mehr gemacht oder gebraucht. Vielleicht will dir @KonradN da ein kompletteres, aktuelles Beispiel geben.
 

KonradN

Super-Moderator
Mitarbeiter
Das malen geht ja einfach über ein Graphics Objekt, das man sich geben lässt und das bietet eine rotate Methode. Also dürfte es ganz einfach sein:
  • zweites BufferedImage erzeugen (mit höhe <-> breite vertauscht)
  • Graphics Instanz besorgen
  • rotate aufrufen
  • Bild malen
-> fertig

Ansonsten ist der offizielle Weg immer über eine Transformation - da geht dann halt deutlich mehr als drehen und so. Das wäre dann etwas wie:
Java:
    public static BufferedImage rotate90Clockwise(BufferedImage inputImage) {
        int width = inputImage.getWidth();
        int height = inputImage.getHeight();
        BufferedImage outputImage = new BufferedImage(height, width, inputImage.getType());
        Graphics2D g2d = outputImage.createGraphics();
        AffineTransform transform = new AffineTransform();
        transform.rotate(Math.PI / 2, height / 2, height / 2);
        g2d.setTransform(transform);
        g2d.drawImage(inputImage, 0, -width, null);
        g2d.dispose();
        return outputImage;
    }
(Da ich zu faul war, habe ich mir den Code von ChatGPT geben lassen.)

Und die erste Variante macht auch nichts anderes - siehe https://docs.oracle.com/en/java/jav...sktop/java/awt/Graphics2D.html#rotate(double)
Concatenates the current Graphics2D Transform with a rotation transform. Subsequent rendering is rotated by the specified radians relative to the previous origin. This is equivalent to calling transform(R), where R is an AffineTransform represented by the following matrix:
 

internet

Top Contributor
danke...

Und die Prüfung, ob ich das Bild drehen muss oder nicht ist dann so?

Java:
public boolean isLandscape(BufferedImage image){
  return image.getWidth() > image.getHeight();
}
 

internet

Top Contributor
@Robert Zenz / @KonradN

Also das ganze habe ich mir deutlich einfacher vorgestellt.
Das mit der obigen Prüfung wird so auch nicht funktionieren - ich brauche die EXIF des Bildes - alles andere hilft mir vermutlich nicht...
Ich habe nun mal dieses Framework verwendet.

Code:
    <dependency>
            <groupId>com.drewnoakes</groupId>
            <artifactId>metadata-extractor</artifactId>
            <version>2.18.0</version>
        </dependency>

Ich habe das nun so:
Java:
/**
     * BufferedImage ausgeben
     *
     * @throws IOException
     */
    public static BufferedImage convertByteArrayToBufferedImage(byte[] byteArray) throws IOException {

        LOGGER.info("START convertByteArrayToBufferedImage");

        InputStream is = new ByteArrayInputStream(byteArray);
        ImageInformation imageInformation = null;
        
        try {

            imageInformation = readImageInformation(is);

        } catch (Exception e) {
            LOGGER.error(ExceptionUtils.getFullStackTrace(e));
        }
        
        // Danach ist newBi NULL
        BufferedImage newBi = ImageIO.read(is);

        
        if (imageInformation != null) {

            if (imageInformation.orientation != 1) {
                AffineTransform transform = getExifTransformation(imageInformation);

                newBi = rotateImageInCorrectDirection(newBi, transform);
            }

        }

        LOGGER.info("END convertByteArrayToBufferedImage");
        return newBi;
    }


Code:
    /**
     * Ließt die Informationen bei einem Bild
     *
     * @param imageFile
     * @return
     * @throws IOException
     * @throws MetadataException
     * @throws ImageProcessingException
     */
    public static ImageInformation readImageInformation(InputStream imageFile)
            throws IOException, MetadataException, ImageProcessingException {

        Metadata metadata = ImageMetadataReader.readMetadata(imageFile);
        Directory directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
        JpegDirectory jpegDirectory = metadata.getFirstDirectoryOfType(JpegDirectory.class);

        int orientation = 1;

        try {
            orientation = directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
        } catch (MetadataException me) {
            return null;
        }
        int width = jpegDirectory.getImageWidth();
        int height = jpegDirectory.getImageHeight();

        return new ImageInformation(orientation, width, height);
    }

Das Problem scheint mir diese Stelle zu sein:

Metadata metadata = ImageMetadataReader.readMetadata(imageFile);

In der API passiert das hier:
1678948315643.png

Wenn ich dann BufferedImage newBi = ImageIO.read(is); aufrufe, dann ist das BufferedImage NULL...

Wie kann ich das denn vernünftig lösen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Resourcen richtig laden (Bild, Musik) Java Basics - Anfänger-Themen 2
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
B Bild per KeyListener drehen Java Basics - Anfänger-Themen 1
I Kamera anschließen / Bild machen / Live View / Externe Blitz Java Basics - Anfänger-Themen 19
I Innerhalb einem Bild ein Teil austauschen Java Basics - Anfänger-Themen 26
I Datei (Bild) Drucken und wie Druckeinstellung speichern? Java Basics - Anfänger-Themen 3
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
H Artefact mit Bild erzeugen Java Basics - Anfänger-Themen 11
R UML-Bild (Erkennung ob static o. nicht) Java Basics - Anfänger-Themen 18
J Bild auf Hintergrundbild zeichnen Java Basics - Anfänger-Themen 5
krgewb Bild itextpdf Java Basics - Anfänger-Themen 2
C Bild in executable JAR File mitgeben Java Basics - Anfänger-Themen 5
VPChief Bild in JEditorPane Java Basics - Anfänger-Themen 9
B Warum bekomme ich kein Bild. Java Basics - Anfänger-Themen 10
S Bild einfügen // NEU Java Basics - Anfänger-Themen 12
N Bild drehen Java Basics - Anfänger-Themen 3
S Ein Bild mit dynamischer Quelle neuzeichnen Java Basics - Anfänger-Themen 12
N GLOOP Bild nicht ansichtbar Java Basics - Anfänger-Themen 5
M Bild in JFrame Java Basics - Anfänger-Themen 1
B Signatur erstellen - Bild ist nur weiß Java Basics - Anfänger-Themen 0
CptK Interface Bild rotieren Java Basics - Anfänger-Themen 17
CptK Interface Bild rotieren Java Basics - Anfänger-Themen 1
Anica Processing Animation Bild-Position ändern Java Basics - Anfänger-Themen 9
CptK Interface Bild über Methode ändern funktioniert nicht Java Basics - Anfänger-Themen 4
CptK Interface Curser durch Bild ersetzen & MouseListner Java Basics - Anfänger-Themen 2
M jTextPane Bild anzeigen Java Basics - Anfänger-Themen 6
CptK Bild beim betätigen eines JButtons Java Basics - Anfänger-Themen 6
S Bild über JButton legen Java Basics - Anfänger-Themen 3
B Bild mit Schrift befüllen / Anpassung bei Wortlänge Java Basics - Anfänger-Themen 2
D Google maps bild mit marker versehen Java Basics - Anfänger-Themen 12
D ImageView mit einfarbigem Bild fuellen Java Basics - Anfänger-Themen 3
it_is_all Bild-Pfad wird gefunden, nicht aber Textdatei-Pfad Java Basics - Anfänger-Themen 8
M Einzelne Pixel in einem Bild auslesen und bearbeiten Java Basics - Anfänger-Themen 1
M Bild wird von JFrame nicht geladen Java Basics - Anfänger-Themen 12
J Bild in Button einsetzen Java Basics - Anfänger-Themen 6
S button kommt durch bild Java Basics - Anfänger-Themen 13
M Ein Bild durch Objekterzeugung zeichnen Java Basics - Anfänger-Themen 5
B Greenscreen (grüner Hintergrund ersetzen mit Bild) Java Basics - Anfänger-Themen 49
K Interface Kein Bild im .jar-File Java Basics - Anfänger-Themen 15
S Bild in Jar-File mit ImageIO Java Basics - Anfänger-Themen 50
S Bild einfügen Java Basics - Anfänger-Themen 16
binop Bild anzeigen lassen Java Basics - Anfänger-Themen 2
D Bild zu Text Java Basics - Anfänger-Themen 4
I HTML Code in Bild (transparent) konvertieren Java Basics - Anfänger-Themen 0
I Watermark erstellen mit HTML in Bild? Java Basics - Anfänger-Themen 7
D Classpath Bild kann in .jar nicht geladen werden Java Basics - Anfänger-Themen 2
Anfänger2011 Bild programmieren?! Java Basics - Anfänger-Themen 3
8 Eigenes Bild in email einfügen Java Basics - Anfänger-Themen 1
K JTable Bild einfügen Java Basics - Anfänger-Themen 1
L BufferdImage schwarzes Bild nach zusammenfügen zweier Bilder Java Basics - Anfänger-Themen 8
S Bild in JOptionPane Java Basics - Anfänger-Themen 1
C Abfrage nach einem Bild im Array Java Basics - Anfänger-Themen 9
J Umgebungsvariable Programmfenster zeigt kein Bild an Java Basics - Anfänger-Themen 1
J Bild loopen Java Basics - Anfänger-Themen 6
M JFrame Bild einfügen Java Basics - Anfänger-Themen 3
S Bild bei Kontakt ändern Java Basics - Anfänger-Themen 2
C Erste Schritte Bild holen und speichern Java Basics - Anfänger-Themen 1
D Bild in Frame einfügen Java Basics - Anfänger-Themen 11
D Bild im Applet anzeigen Java Basics - Anfänger-Themen 3
F Bild in ein Runnable Jar File packen (eclipse) Java Basics - Anfänger-Themen 2
M Java-Applet: Bild einbinden (getImage) Java Basics - Anfänger-Themen 0
J Ganzes Bild Java Basics - Anfänger-Themen 4
T GUI anstatt Bild schwarzes Rechteck gespeichert Java Basics - Anfänger-Themen 0
A Bild verschwindet! Wieso?? Java Basics - Anfänger-Themen 2
I Bild aus Bereich laden Java Basics - Anfänger-Themen 3
P Bild in JFrame Titelleiste Java Basics - Anfänger-Themen 7
Y Nach Bild-Upload wird Bild nicht angezeigt Java Basics - Anfänger-Themen 1
M Button mit Bild und Text Java Basics - Anfänger-Themen 2
M JSP-Einfaches Bild anzeigen Java Basics - Anfänger-Themen 4
C Bild ins Frame laden und Objekte drüber legen Java Basics - Anfänger-Themen 1
Sogomn Bild will sich nicht skalieren lassen Java Basics - Anfänger-Themen 1
P Ein Bild für GUI (Java-Editor) Java Basics - Anfänger-Themen 4
D Bild für ein paar Sekunden einblenden und wieder ausblenden Java Basics - Anfänger-Themen 1
E Bild per Verzeichnis/JFileChooser auf JPanel laden Java Basics - Anfänger-Themen 13
S Bild auf eine Position rotieren?! Java Basics - Anfänger-Themen 4
P Bild bearbeiten Java Basics - Anfänger-Themen 9
Z Datenmatrix in Bild verwandeln Java Basics - Anfänger-Themen 4
C Bild verschwinden lassen Java Basics - Anfänger-Themen 7
S Bild Icon aus ID3Tag auslesen Java Basics - Anfänger-Themen 4
E Bild vom FileChooser aus via ImageIcon in DB schreiben Java Basics - Anfänger-Themen 16
D Bild zum Panel hinzufügen Java Basics - Anfänger-Themen 8
C Greenfoot: Bei Tastendruck und best. Wert Bild ändern Java Basics - Anfänger-Themen 2
O Auflösung einer Bild-Datei bekommen ohne sie herunterzuladen?? Java Basics - Anfänger-Themen 7
L Bild-Datein "zuschneiden" Java Basics - Anfänger-Themen 11
O DeviantArt-Bild Konverter: Fehler.. Java Basics - Anfänger-Themen 16
K Transparents Bild laden -> Fehlermeldung Java Basics - Anfänger-Themen 6
M Bild einbinden Java Basics - Anfänger-Themen 7
2 Bild auf JApplet zeichnen Java Basics - Anfänger-Themen 18
T Bild laden Java Basics - Anfänger-Themen 7
R Bild in GUI Java Basics - Anfänger-Themen 11
D Eclipse Juno zeigt Bild nicht bei Run Java Basics - Anfänger-Themen 3
Kenan89 Bild mit jar öffnen Java Basics - Anfänger-Themen 4
S Problem bei Bewegung von einem Bild! Java Basics - Anfänger-Themen 2
J Bild mit transparenter Farbe Java Basics - Anfänger-Themen 10
N Erste Schritte Applet zeichnet Bild nicht Java Basics - Anfänger-Themen 10
J Bild auf JLabel wird nicht angezeigt Java Basics - Anfänger-Themen 11
J Bild einfügen Java Basics - Anfänger-Themen 3
T ASCII Art von Bild erstellen. Java Basics - Anfänger-Themen 32
E Bild OS-unabhängig einbinden mit URL Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben