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-Arrayadd(upperLeftRow, upperLeftColumn, lowerRightRow, lowerRightColumn, stream)aus einem InputStreamadd(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
| Problem | Ursache | Lösung |
|---|---|---|
getCount() gibt nach dem Hinzufügen 0 zurück | Stream wurde geschlossen, bevor das Hinzufügen abgeschlossen war | Stellen Sie sicher, dass InputStream geöffnet und lesbar ist |
ImageType.UNKNOWN zurückgegeben | Nicht 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 aus | Zeilen-/Spaltenindizes sind falsch | Verwenden 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
| Methode | Rückgabetyp | Beschreibung |
|---|---|---|
getName() | String | Interner Name des Bildes. |
setName(name) | void | Setzt den internen Namen. |
getUpperLeftRow() | int | Nullbasierte Zeile des oberen linken Ankers. |
setUpperLeftRow(row) | void | Legt die obere linke Ankerzeile fest. |
getUpperLeftColumn() | int | Nullbasierte Spalte des oberen linken Ankers. |
setUpperLeftColumn(col) | void | Setzt die obere linke Anker-Spalte. |
getLowerRightRow() | int | Nullbasierte Zeile des unteren rechten Ankers. |
setLowerRightRow(row) | void | Legt die untere rechte Ankerzeile fest. |
getLowerRightColumn() | int | Nullbasierte Spalte des unteren rechten Ankers. |
setLowerRightColumn(col) | void | Setzt die untere rechte Ankerspalte. |
getImageType() | ImageType | Erkanter Bildformat-Enum-Wert. |
getData() | byte[] | Rohbildbytes. |
setData(data) | void | Ersetzt die Rohbildbytes. |
getContentType() | String | MIME-Inhaltstyp-Zeichenkette. |
PictureCollection
| Methode | Rückgabetyp | Beschreibung |
|---|---|---|
getCount() | int | Anzahl der Bilder im Arbeitsblatt. |
get(index) | Picture | Gibt das Bild am nullbasierten Index zurück. |
add(...) | int | Betten Sie ein Bild ein; gibt dessen nullbasierten Index zurück. |
removeAt(index) | void | Entfernt das Bild am nullbasierten Index. |
detectImageType(data) | ImageType | Erkennt das Bildformat aus rohen Bytes. |
extensionFromData(data) | String | Gibt die Dateierweiterung für die Bilddaten zurück. |
contentTypeFromExtension(ext) | String | Gibt den MIME-Typ für eine Dateierweiterung zurück. |