株式会社インターワーク

Javaで画像を切り抜く(クロップする)方法

JavaのImageIOやJDeliライブラリを使って画像を切り抜く(クロップする)方法を、コード例付きでわかりやすく解説します。BufferedImageの注意点も紹介。

(更新:
JDeliJava画像処理
Javaで画像を切り抜く(クロップする)方法

Javaで画像の一部を切り抜き(クロップ)したい場面は、サムネイルの生成、顔写真の切り出し、ドキュメントスキャン画像の余白除去など、さまざまな用途で発生します。この記事では、Java標準のImageIOを使った方法と、高機能な画像処理ライブラリJDeliを使った方法の2つを、コード例を交えて解説します。

JavaでImageIOを使って画像を切り抜く方法

Java SEに標準で含まれているImageIOクラスを使えば、外部ライブラリなしで画像の切り抜きが可能です。以下の3ステップで実行できます。

Step 1: 画像ファイルの読み込み

まず、ImageIO.read() メソッドを使って画像ファイルをBufferedImageオブジェクトとして読み込みます。

BufferedImage image = ImageIO.read(new File("C:\\path\\to\\kitten.jpg"));

JPEG、PNG、BMPなど、ImageIOがサポートする形式であればそのまま読み込めます。ただし、HEICやWebPなどの比較的新しいフォーマットにはImageIO単体では対応していません。

Step 2: 切り抜き領域の指定と実行

getSubimage() メソッドを使って、切り抜きたい矩形領域(x座標、y座標、幅、高さ)を指定します。座標の原点 (0, 0) は画像の左上隅です。

BufferedImage crop = image.getSubimage(0, 0, 100, 100);

上記の例では、画像の左上隅から幅100ピクセル・高さ100ピクセルの領域を切り抜きます。たとえば、画像の中心部分を切り抜きたい場合は、次のように計算できます。

int cropWidth = 200;
int cropHeight = 200;
int x = (image.getWidth() - cropWidth) / 2;
int y = (image.getHeight() - cropHeight) / 2;
BufferedImage crop = image.getSubimage(x, y, cropWidth, cropHeight);

Step 3: 切り抜いた画像の保存

切り抜いたBufferedImageを、ImageIO.write() メソッドでファイルに保存します。

ImageIO.write(crop, "JPEG", new File("C:\\path\\to\\cropped.jpeg"));

注意: getSubimage() で取得したBufferedImageは、元画像のピクセルデータを共有しています。そのため、元画像に変更を加えると切り抜き画像にも影響が及びます。切り抜き後は、他の処理を行う前に必ずファイルに保存するか、BufferedImage.copyData() で独立したコピーを作成してください。

JDeliを使ったJavaでの画像切り抜き方法

JDeliを使うと、画像の切り抜きをさらに簡潔かつ安全に実行できます。JDeliでは画像処理パイプラインの中でクロップ操作を宣言的に記述できるため、コードの可読性も向上します。

Step 1: Crop ImageOperationの作成

ImageProcessingOperations オブジェクトを作成し、crop() メソッドで切り抜き領域を指定します。

ImageProcessingOperations imageOps = new ImageProcessingOperations();
imageOps.crop(new Rectangle(0, 0, 100, 100));

Step 2: 変換の実行(読み込み・切り抜き・保存を一括処理)

JDeli.convert() メソッドを呼び出すだけで、画像の読み込みからクロップ、保存までを一括で処理できます。

JDeli.convert(new File("C:\\path\\to\\picture.jpeg"), new File("C:\\path\\to\\crop.jpeg"), imageOps);

JDeliの方式では、BufferedImageのデータ共有の問題を気にする必要がありません。また、クロップの前後にリサイズや回転などの操作を追加することも容易です。

ImageProcessingOperations imageOps = new ImageProcessingOperations();
imageOps.crop(new Rectangle(50, 50, 300, 300));
imageOps.scale(150, 150);  // クロップ後にリサイズ
JDeli.convert(inputFile, outputFile, imageOps);

ImageIOとJDeliの比較

項目ImageIOJDeli
外部ライブラリの追加不要(Java SE標準)必要(JDeli JARの追加)
対応フォーマットJPEG, PNG, BMP, GIF等JPEG, PNG, BMP, HEIC, WebP等14種類以上
BufferedImageの共有問題あり(要注意)なし(安全に処理)
処理パイプラインの構築手動で実装が必要メソッドチェーンで簡単に構築
スレッドセーフ制限あり対応済み
出力ファイルサイズ標準的最適化により小さいファイルを生成

Javaで画像の読み書きにJDeliを使うメリット

JDeliは、ImageIOやその他の代替ライブラリと比較して、以下のようなメリットを提供します。

  • 安定性の向上: ヒープ関連のJVMクラッシュを防止
  • 幅広いフォーマット対応: HEIC、WebP、JPEG XLなど最新フォーマットにも対応
  • ファイルサイズの最適化: 出力ファイルサイズを削減し、ストレージやネットワーク帯域を節約
  • 高速な処理: 読み取り・書き込みの両方でパフォーマンスが向上
  • 高品質なスケーリング: 優れた画像スケーリングアルゴリズムを搭載
  • 出力の細かな制御: DPI、品質、圧縮方式などを柔軟に設定可能
  • スレッドセーフ: マルチスレッド環境での安全な利用をサポート

一行のJavaコードで画像の読み取りと書き込みが可能

画像の読み込み:

BufferedImage image = JDeli.read(streamOrFile);

画像の書き出し:

JDeli.write(myBufferedImage, OutputFormat.HEIC, outputStreamOrFile);

Javaで画像ファイルを扱う開発ツール(SDK)をお探しの方へ、JDeliが効率のよい開発作業を支援します。無料トライアルをご利用いただけます。

JDeli

Java画像ライブラリ。HEIC・WebP・DICOMなど20以上のフォーマットに対応。ImageIOの最大7倍高速。

開発者向けPDF入門ガイド 表紙
無料 eBook / 25p

開発者向けPDF入門ガイド

PDFの仕様や活用方法など、開発者に必要な情報をコンパクトにまとめました。初めてPDFを扱う開発者にも分かりやすく、基礎から応用までカバーしているため、PDFのポテンシャルを最大限に引き出し、アプリケーション開発やドキュメント管理の効率化を図るための手引きとなるでしょう。

ご興味のある製品:

ご入力いただいた情報は、eBookの送付およびインターワークからのご案内にのみ使用いたします。プライバシーポリシー