Praca z obrazami
Praca z obrazami
Aspose.Cells FOSS for Java umożliwia osadzanie obrazów bezpośrednio w komórkach arkusza oraz pobieranie lub usuwanie istniejących obrazków. Obrazy są zarządzane za pośrednictwem PictureCollection udostępnianego przez każdy Worksheet, a każdy Picture zapewnia dostęp do danych obrazu, jego pozycji kotwicy, wykrytego typu obrazu oraz typu MIME.
Przegląd
Każdy arkusz udostępnia swoje obrazy poprzez Worksheet.getPictures(), które zwraca PictureCollection. Można dodawać obrazy z tablicy bajtów, InputStream lub ścieżki do pliku. Kolekcja udostępnia metody pomocnicze do wykrywania typu obrazu z surowych bajtów, określania rozszerzenia pliku na podstawie danych obrazu oraz mapowania rozszerzenia na typ MIME.
Dostęp do obrazów w arkuszu
Pobierz PictureCollection za pomocą Worksheet.getPictures(). Użyj PictureCollection.getCount(), aby określić liczbę dostępnych obrazów. Poszczególne obrazy są dostępne poprzez indeks zerowy przy użyciu PictureCollection.get(index).
Dodawanie obrazu
Dostępne są trzy przeciążenia PictureCollection.add(), z których każde zwraca indeks zerowy nowo dodanego obrazu:
add(upperLeftRow, upperLeftColumn, lowerRightRow, lowerRightColumn, imageData)z tablicy bajtówadd(upperLeftRow, upperLeftColumn, lowerRightRow, lowerRightColumn, stream)z InputStreamadd(upperLeftRow, upperLeftColumn, lowerRightRow, lowerRightColumn, fileName)ze ścieżki pliku
// 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);Odczytywanie właściwości obrazu
Gdy posiadasz referencję Picture, odczytaj jej pozycję kotwicy, surowe dane obrazu, wykryty typ obrazu oraz typ treści MIME:
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());
}Wykrywanie typu obrazu z surowych bajtów
Użyj PictureCollection.detectImageType(data), aby określić wartość wyliczeniową ImageType tablicy bajtów bez jej uprzedniego osadzania.
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);Usuwanie obrazu
Użyj PictureCollection.removeAt(index), aby usunąć obrazek według indeksu zerowego:
ws.getPictures().removeAt(0);Wskazówki i najlepsze praktyki
- Użyj przeciążenia
add(..., imageData), gdy już masz bajty w pamięci; użyj przeciążenia strumieniowego, aby uniknąć wczytywania dużych plików w całości. - Wywołaj
PictureCollection.detectImageType(data), aby zweryfikować format obrazu przed osadzeniem. - Wiersze i kolumny kotwic są indeksami zerowymi.
Picture.getName()zwraca wewnętrzny identyfikator, a nie pierwotną nazwę pliku.- Obrazy są zachowywane przy dwukierunkowym przetwarzaniu XLSX.
Typowe problemy
| Problem | Przyczyna | Naprawa |
|---|---|---|
getCount() zwraca 0 po dodaniu | Strumień został zamknięty przed zakończeniem dodawania | Upewnij się, że InputStream jest otwarty i czytelny |
Zwrócono ImageType.UNKNOWN | Nieobsługiwane lub uszkodzone dane obrazu | Sprawdź, czy plik jest prawidłowym PNG, JPEG, GIF, BMP lub TIFF |
| Pozycja obrazu wydaje się nieprawidłowa | Indeksy wiersza/kolumny są nieprawidłowe | Użyj indeksów zerowych dla wszystkich parametrów kotwicy |
FAQ
Jakie formaty obrazów są obsługiwane przy osadzaniu?
Wyliczenie ImageType obejmuje PNG, JPEG, GIF, BMP, TIFF i EMF. Inne formaty mogą być osadzane jako dane binarne, ale mają ImageType równy UNKNOWN.
Jak uzyskać rozszerzenie pliku osadzonego obrazu?
Wywołaj PictureCollection.extensionFromData(picture.getData()) z surowymi bajtami obrazu.
Czy mogę zastąpić istniejące dane obrazu?
Tak. Pobierz Picture za pomocą get(index) i wywołaj setData(bytes).
Jak znaleźć obraz po nazwie?
Iteruj po wszystkich obrazach przy użyciu getCount() i get(index) oraz porównaj Picture.getName().
Czy obrazy są zachowywane przy zapisywaniu do innych formatów?
Zachowanie obrazów zależy od docelowego formatu. Okrężny przepływ XLSX jest w pełni obsługiwany.
API Reference Podsumowanie
Picture
| Metoda | Typ zwracany | Opis |
|---|---|---|
getName() | String | Wewnętrzna nazwa obrazu. |
setName(name) | void | Ustawia wewnętrzną nazwę. |
getUpperLeftRow() | int | Wiersz numerowany od zera w lewym górnym rogu kotwicy. |
setUpperLeftRow(row) | void | Ustawia wiersz kotwicy w lewym górnym rogu. |
getUpperLeftColumn() | int | Kolumna numerowana od zera lewego górnego punktu kotwicy. |
setUpperLeftColumn(col) | void | Ustawia kolumnę kotwiczenia w lewym górnym rogu. |
getLowerRightRow() | int | Wiersz numerowany od zera prawego dolnego punktu kotwicy. |
setLowerRightRow(row) | void | Ustawia wiersz kotwicy w prawym dolnym rogu. |
getLowerRightColumn() | int | Kolumna liczona od zera dolnego prawego kotwicy. |
setLowerRightColumn(col) | void | Ustawia kolumnę kotwicy w prawym dolnym rogu. |
getImageType() | ImageType | Wykryta wartość wyliczeniowa formatu obrazu. |
getData() | byte[] | Surowe bajty obrazu. |
setData(data) | void | Zastępuje surowe bajty obrazu. |
getContentType() | String | Ciąg typu zawartości MIME. |
PictureCollection
| Metoda | Typ zwracany | Opis |
|---|---|---|
getCount() | int | Liczba obrazów w arkuszu. |
get(index) | Picture | Zwraca obraz o indeksie zerobazowym. |
add(...) | int | Osadza obraz; zwraca jego indeks zerobazowy. |
removeAt(index) | void | Usuwa obrazek o indeksie zerowym. |
detectImageType(data) | ImageType | Wykrywa format obrazu na podstawie surowych bajtów. |
extensionFromData(data) | String | Zwraca rozszerzenie pliku dla danych obrazu. |
contentTypeFromExtension(ext) | String | Zwraca typ MIME dla rozszerzenia pliku. |