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ów
  • add(upperLeftRow, upperLeftColumn, lowerRightRow, lowerRightColumn, stream) z InputStream
  • add(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

ProblemPrzyczynaNaprawa
getCount() zwraca 0 po dodaniuStrumień został zamknięty przed zakończeniem dodawaniaUpewnij się, że InputStream jest otwarty i czytelny
Zwrócono ImageType.UNKNOWNNieobsługiwane lub uszkodzone dane obrazuSprawdź, czy plik jest prawidłowym PNG, JPEG, GIF, BMP lub TIFF
Pozycja obrazu wydaje się nieprawidłowaIndeksy wiersza/kolumny są nieprawidłoweUż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

MetodaTyp zwracanyOpis
getName()StringWewnętrzna nazwa obrazu.
setName(name)voidUstawia wewnętrzną nazwę.
getUpperLeftRow()intWiersz numerowany od zera w lewym górnym rogu kotwicy.
setUpperLeftRow(row)voidUstawia wiersz kotwicy w lewym górnym rogu.
getUpperLeftColumn()intKolumna numerowana od zera lewego górnego punktu kotwicy.
setUpperLeftColumn(col)voidUstawia kolumnę kotwiczenia w lewym górnym rogu.
getLowerRightRow()intWiersz numerowany od zera prawego dolnego punktu kotwicy.
setLowerRightRow(row)voidUstawia wiersz kotwicy w prawym dolnym rogu.
getLowerRightColumn()intKolumna liczona od zera dolnego prawego kotwicy.
setLowerRightColumn(col)voidUstawia kolumnę kotwicy w prawym dolnym rogu.
getImageType()ImageTypeWykryta wartość wyliczeniowa formatu obrazu.
getData()byte[]Surowe bajty obrazu.
setData(data)voidZastępuje surowe bajty obrazu.
getContentType()StringCiąg typu zawartości MIME.

PictureCollection

MetodaTyp zwracanyOpis
getCount()intLiczba obrazów w arkuszu.
get(index)PictureZwraca obraz o indeksie zerobazowym.
add(...)intOsadza obraz; zwraca jego indeks zerobazowy.
removeAt(index)voidUsuwa obrazek o indeksie zerowym.
detectImageType(data)ImageTypeWykrywa format obrazu na podstawie surowych bajtów.
extensionFromData(data)StringZwraca rozszerzenie pliku dla danych obrazu.
contentTypeFromExtension(ext)StringZwraca typ MIME dla rozszerzenia pliku.

Zobacz także

 Polski