(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Java】プログラムで画像ファイルの任意の座標でトリミングする方法

スポンサーリンク

はじめに

Javaを利用し、オーソドックスな座標の平行移動にてトリミングを実現する流れを記載しました。
画像ファイルを画素の配列として扱いながら処理するので、アイデアによっては応用が利くとと思います。

本記事では手動でトリミングするための情報を与えていますが、例えば以下記事を利用すれば画像内の特定のマーカーの位置を検出してそこを基軸にトリミングも可能です。

参考(import文)
  • java.awt.image.BufferedImage
  • java.io.*
  • javax.imageio.ImageIO

画像のトリミング方法

元ファイルは以下で読み込み

File f = new File("C:\\Users\\XXXX\\Downloads\\java.png");
BufferedImage read=ImageIO.read(f);
int w = read.getWidth();
int h = read.getHeight();

以下のループでそれぞれの画素を取り出せます

for(int y=0;y<h;y++){
 for(int x=0;x<w;x++){
  System.out.println(read.getRGB(x, y));
 }
}

ここで元画像の座標からどこを取り出すか決めます。
例えば左上を(a,b)、右上を(a+m,b)、左下を(a,b+n)、右下を(a+m,b+n)とすると生成されるトリミング後の画像の出力用ファイルを以下とします。

BufferedImage write = new BufferedImage(m+1,n+1, BufferedImage.TYPE_INT_RGB);

あとは先ほどのループの中で以下のように座標をずらしながら値を格納すると

if(y>=b && y<=b+n){
 if(x>=a && x<=a+m){
  write.setRGB(x-a,y-b,read.getRGB(x, y));
 }
}

以下で新たな画像ファイルとして出力されます。

File f2 = new File("test.png");
ImageIO.write(write, "png", f2);

使用例

例えば以下ファイルを
f:id:mtiit:20190816192529p:plain
適当な箇所で以下サイズで区切ると

BufferedImage write = new BufferedImage(235, 117, BufferedImage.TYPE_INT_RGB);

以下のように出力されました。ウォーリーを探せみたいですね。
f:id:mtiit:20190816192515p:plain

終わりに

簡易的に画像ファイルを切り出しましたが、上の例では画像ファイルの大きさも184KBから10KBになりました。
本手法を応用すれば、トリミング時の座標情報を正しく与えてあげれば画像をばらばらに切り分けることも可能う。
同様なことを実装しようとした方の参考になれば幸いです。