画像の操作

画像の操作

Aspose.Cells FOSS for Java は、画像をワークシートのセルに直接埋め込んだり、既存の画像を取得または削除したりできるようにします。画像は各 Worksheet が公開する PictureCollection を通じて管理され、各 Picture オブジェクトは画像データ、そのアンカー位置、検出された画像タイプ、そして MIME コンテンツタイプへのアクセスを提供します。


概要

各ワークシートは Worksheet.getPictures() を通じて画像を公開し、PictureCollection を返します。バイト配列、InputStream、またはファイルパスから画像を追加できます。このコレクションは、生のバイトから画像タイプを検出し、画像データからファイル拡張子を解決し、拡張子を MIME コンテンツタイプにマッピングするためのヘルパーメソッドを提供します。


ワークシート上の画像へのアクセス

Worksheet.getPictures() を介して PictureCollection を取得します。PictureCollection.getCount() を使用して画像の数を判断します。個々の画像は PictureCollection.get(index) を通じてゼロベースのインデックスでアクセスできます。


画像の追加

PictureCollection.add() の3つのオーバーロードが利用可能で、いずれも新しく追加された画像のゼロベースインデックスを返します:

  • add(upperLeftRow, upperLeftColumn, lowerRightRow, lowerRightColumn, imageData) をバイト配列から取得
  • add(upperLeftRow, upperLeftColumn, lowerRightRow, lowerRightColumn, stream) を InputStream から取得
  • add(upperLeftRow, upperLeftColumn, lowerRightRow, lowerRightColumn, fileName) をファイルパスから取得
// 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);

画像プロパティの読み取り

一度 Picture の参照を保持したら、そのアンカー位置、未加工画像データ、検出された画像タイプ、そして 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());
}

未加工バイトから画像タイプを検出

まず埋め込まずに、PictureCollection.detectImageType(data) を使用してバイト配列の ImageType 列挙値を決定します。

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);

画像の削除

ゼロベースのインデックスで画像を削除するには、PictureCollection.removeAt(index) を使用します:

ws.getPictures().removeAt(0);

ヒントとベストプラクティス

  • メモリ内にバイト列が既にある場合は add(..., imageData) のオーバーロードを使用し、 大きなファイルを完全に読み込むのを避けるにはストリームのオーバーロードを使用してください。
  • 埋め込む前に画像形式を検証するには、PictureCollection.detectImageType(data) を呼び出します。
  • アンカー行と列はゼロベースのインデックスです。
  • Picture.getName() は元のファイル名ではなく、内部識別子を返します。
  • 画像は XLSX の往復変換で保持されます。

一般的な問題

問題原因修正
getCount() は追加後に0を返しますストリームが追加完了前に閉じられましたInputStream が開かれていて読み取り可能であることを確認してください
ImageType.UNKNOWN が返されましたサポートされていない、または破損した画像データファイルが有効な PNG、JPEG、GIF、BMP、または TIFF であることを確認してください
画像の位置が間違っているようです行/列インデックスが正しくありませんすべてのアンカー パラメータにゼロベースのインデックスを使用してください

FAQ

埋め込みに対応している画像形式はどれですか?

ImageType 列挙体は PNG、JPEG、GIF、BMP、TIFF、そして EMF をカバーしています。他の形式はバイナリデータとして埋め込むことができますが、ImageTypeUNKNOWN です。

埋め込まれた画像のファイル拡張子を取得するにはどうすればよいですか?

PictureCollection.extensionFromData(picture.getData()) を画像の生バイトで呼び出してください。

既存の画像データを置き換えることはできますか?

はい。get(index) を介して Picture を取得し、setData(bytes) を呼び出します。

名前で画像を検索するにはどうすればよいですか?

すべての画像をgetCount()get(index)で繰り返し処理し、Picture.getName()を比較します。

画像は他の形式に保存するときに保持されますか?

画像の保持は対象フォーマットに依存します。XLSX のラウンドトリップは完全にサポートされています。


API Reference の概要

Picture

メソッド戻り値の型説明
getName()String画像の内部名です。
setName(name)void内部名を設定します。
getUpperLeftRow()int左上アンカーのゼロベース行.
setUpperLeftRow(row)void左上のアンカー行を設定します。
getUpperLeftColumn()int左上アンカーのゼロベース列。
setUpperLeftColumn(col)void左上のアンカー列を設定します。
getLowerRightRow()int右下アンカーのゼロベース行。
setLowerRightRow(row)void右下のアンカー行を設定します。
getLowerRightColumn()int右下アンカーの0ベース列。
setLowerRightColumn(col)void右下のアンカー列を設定します。
getImageType()ImageType検出された画像フォーマットの列挙値。
getData()byte[]生の画像バイト。
setData(data)void生の画像バイトを置き換えます。
getContentType()StringMIME コンテンツタイプ文字列。

PictureCollection

メソッド戻り値の型説明
getCount()intワークシート上の画像の数。
get(index)Pictureゼロベースのインデックスの画像を返します。
add(...)int画像を埋め込みます; ゼロベースのインデックスを返します。
removeAt(index)voidゼロベースのインデックスにある画像を削除します。
detectImageType(data)ImageType生のバイト列から画像形式を検出します。
extensionFromData(data)String画像データのファイル拡張子を返します。
contentTypeFromExtension(ext)Stringファイル拡張子に対応する MIME タイプを返します。

参照

 日本語