Arbeiten mit Bildern

Arbeiten mit Bildern

Aspose.Cells FOSS für Java ermöglicht das Einbetten von Bildern direkt in Arbeitsblattzellen sowie das Abrufen oder Entfernen vorhandener Bilder. Bilder werden über das PictureCollection verwaltet, das von jedem Worksheet bereitgestellt wird, und jedes Picture-Objekt bietet Zugriff auf die Bilddaten, seine Ankerposition, den erkannten Bildtyp und den MIME-Inhaltstyp.


Übersicht

Jedes Arbeitsblatt stellt seine Bilder über Worksheet.getPictures() bereit, das ein PictureCollection zurückgibt. Sie können Bilder aus einem Byte-Array, einem InputStream oder einem Dateipfad hinzufügen. Die Sammlung bietet Hilfsmethoden zum Erkennen des Bildtyps aus rohen Bytes, zum Ermitteln der Dateierweiterung aus Bilddaten und zum Zuordnen der Erweiterung zum MIME-Inhaltstyp.


Zugriff auf Bilder in einem Arbeitsblatt

Rufen Sie das PictureCollection über Worksheet.getPictures() ab. Verwenden Sie PictureCollection.getCount(), um zu bestimmen, wie viele Bilder vorhanden sind. Einzelne Bilder sind über einen nullbasierten Index mittels PictureCollection.get(index) zugänglich.


Hinzufügen eines Bildes

Drei Überladungen von PictureCollection.add() stehen zur Verfügung, wobei jede den nullbasierten Index des neu hinzugefügten Bildes zurückgibt:

  • add(upperLeftRow, upperLeftColumn, lowerRightRow, lowerRightColumn, imageData) aus einem Byte-Array
  • add(upperLeftRow, upperLeftColumn, lowerRightRow, lowerRightColumn, stream) aus einem InputStream
  • add(upperLeftRow, upperLeftColumn, lowerRightRow, lowerRightColumn, fileName) aus einem Dateipfad
// Embed an image from bytes into cells A1:C5
byte[] imgData = Files.readAllBytes(Paths.get("logo.png"));
int idx = ws.getPictures().add(0, 0, 4, 2, imgData);

Bild-Eigenschaften lesen

Sobald Sie eine Picture-Referenz besitzen, lesen Sie deren Ankerposition, Rohbilddaten, erkannten Bildtyp und MIME-Inhaltstyp:

PictureCollection pics = ws.getPictures();
for (int i = 0; i < pics.getCount(); i++) {
    Picture p = pics.get(i);
    System.out.printf("Name=%s type=%s anchor=[%d,%d]-[%d,%d]%n",
        p.getName(), p.getImageType(),
        p.getUpperLeftRow(), p.getUpperLeftColumn(),
        p.getLowerRightRow(), p.getLowerRightColumn());
}

Bildtyp aus Rohbytes erkennen

Verwenden Sie PictureCollection.detectImageType(data), um den ImageType-Enum-Wert eines Byte-Arrays zu bestimmen, ohne ihn zuerst einzubetten.

PictureCollection pics = ws.getPictures();
byte[] data = Files.readAllBytes(Paths.get("chart.png"));
ImageType type = pics.detectImageType(data);
String ext  = pics.extensionFromData(data);
String mime = pics.contentTypeFromExtension(ext);
System.out.printf("type=%s ext=%s mime=%s%n", type, ext, mime);

Bild entfernen

Verwenden Sie PictureCollection.removeAt(index), um ein Bild anhand seines nullbasierten Index zu löschen:

ws.getPictures().removeAt(0);

Tipps und bewährte Verfahren

  • Verwenden Sie die Überladung add(..., imageData), wenn Sie die Bytes bereits im Speicher haben; verwenden Sie die Stream-Überladung, um das vollständige Laden großer Dateien zu vermeiden.
  • Rufen Sie PictureCollection.detectImageType(data) auf, um das Bildformat vor dem Einbetten zu validieren.
  • Ankerzeilen und -spalten sind nullbasierte Indizes.
  • Picture.getName() gibt einen internen Bezeichner zurück, nicht den ursprünglichen Dateinamen.
  • Bilder bleiben beim XLSX-Round-Trip erhalten.

Häufige Probleme

ProblemUrsacheLösung
getCount() gibt nach dem Hinzufügen 0 zurückStream wurde geschlossen, bevor das Hinzufügen abgeschlossen warStellen Sie sicher, dass InputStream geöffnet und lesbar ist
ImageType.UNKNOWN zurückgegebenNicht unterstützte oder beschädigte BilddatenÜberprüfen Sie, ob die Datei ein gültiges PNG, JPEG, GIF, BMP oder TIFF ist
Die Bildposition sieht falsch ausZeilen-/Spaltenindizes sind falschVerwenden Sie nullbasierte Indizes für alle Ankerparameter

FAQ

Welche Bildformate werden für das Einbetten unterstützt?

Das ImageType-Enum deckt PNG, JPEG, GIF, BMP, TIFF und EMF ab. Andere Formate können als Binärdaten eingebettet werden, besitzen jedoch ein ImageType von UNKNOWN.

Wie erhalte ich die Dateierweiterung eines eingebetteten Bildes?

Rufen Sie PictureCollection.extensionFromData(picture.getData()) mit den rohen Bildbytes auf.

Kann ich vorhandene Bilddaten ersetzen?

Ja. Rufen Sie das Picture über get(index) ab und rufen Sie setData(bytes) auf.

Wie finde ich ein Bild nach Namen?

Iterieren Sie über alle Bilder mit getCount() und get(index) und vergleichen Sie Picture.getName().

Werden Bilder beim Speichern in andere Formate beibehalten?

Die Bilderhaltung hängt vom Zielformat ab. XLSX-Rundtrip wird vollständig unterstützt.


API Reference Zusammenfassung

Picture

MethodeRückgabetypBeschreibung
getName()StringInterner Name des Bildes.
setName(name)voidSetzt den internen Namen.
getUpperLeftRow()intNullbasierte Zeile des oberen linken Ankers.
setUpperLeftRow(row)voidLegt die obere linke Ankerzeile fest.
getUpperLeftColumn()intNullbasierte Spalte des oberen linken Ankers.
setUpperLeftColumn(col)voidSetzt die obere linke Anker-Spalte.
getLowerRightRow()intNullbasierte Zeile des unteren rechten Ankers.
setLowerRightRow(row)voidLegt die untere rechte Ankerzeile fest.
getLowerRightColumn()intNullbasierte Spalte des unteren rechten Ankers.
setLowerRightColumn(col)voidSetzt die untere rechte Ankerspalte.
getImageType()ImageTypeErkanter Bildformat-Enum-Wert.
getData()byte[]Rohbildbytes.
setData(data)voidErsetzt die Rohbildbytes.
getContentType()StringMIME-Inhaltstyp-Zeichenkette.

PictureCollection

MethodeRückgabetypBeschreibung
getCount()intAnzahl der Bilder im Arbeitsblatt.
get(index)PictureGibt das Bild am nullbasierten Index zurück.
add(...)intBetten Sie ein Bild ein; gibt dessen nullbasierten Index zurück.
removeAt(index)voidEntfernt das Bild am nullbasierten Index.
detectImageType(data)ImageTypeErkennt das Bildformat aus rohen Bytes.
extensionFromData(data)StringGibt die Dateierweiterung für die Bilddaten zurück.
contentTypeFromExtension(ext)StringGibt den MIME-Typ für eine Dateierweiterung zurück.

Siehe auch

 Deutsch