画像に対して個人情報等をマスクする際に利用します。
private void imageMaskBlack(String imageFile) thorws Exception {
// 変数を宣言する。
BufferedImage bimg = null;
Graphics graphics = null;
ImageReader jpgReader = null;
ImageWriter jpgWriter = null;
try {
// イメージファイルを読み込む。(ImageIO.readは利用しない方針)
jpgReader ImageIO.getImageReadersByFormatName("jpeg").next();
jpgReader.setInput(ImageIO.createImageInputStream(new File(imageFile)));
bimg = jpgReader.read(0);
// Graphicsオブジェクトを取得する。
graphics = bimg.getGraphics();
graphics.setColor(Color.BLACK);
// X座標、Y座標、幅、高さを指定し黒色でマスクする。
// 画像の左上がX座標:0、Y座標:0
graphics.fillRect(100, 50, 100, 100);
graphics.drawImage(bimg, 0, 0, null);
// 品質と解像度指定
// イメージを書き込むため、ImageIOからjpg用のImageWriterを取得する。
jpgWriter = ImageIO.getImageWritersByFormatName("jpeg").next();
// ImageWriterのパラメータ設定
// パラメータを取得する。
JPEGImageWriteParam jpgWriteParam = (JPEGImageWriteParam)jpgWriter.getDefaultWriteParam();
// パラメータに品質指定を行うモードを指定する。
jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
// パラメータに品質を指定する。(0.0f~1.0f)
jpgWriteParam.setCompressionQuality(0.5f);
// ImageWriterのメタデータの設定
// メタデータを取得する。
IIOMetadata imageMeta = jpgWriter.getDefaultImageMetadata(new ImageTypeSpecifier(bimg), jpgWriteParam);
// メタデータからXMLのツリー構造を取得する。
Element tree = (Element)imageMeta.getAsTree("javax_imageio_jpeg_image_1.0");
// ツリー構造から要素「JFIF」を取得する。
Element jfif = (Element)tree.getElementsByTagName("app0JFIF").item(0);
//DPI指定を行うモードを指定する。
jfif.setAttribute("resUnits", "1");
// X座標は300dpiを指定する。
jfif.setAttribute("Xdensity", 300);
// Y座標は300dpiを指定する。
jfif.setAttribute("Ydensity", 300);
// メタデータにツリー構造を設定し直す。
imageMeta.setFromTree("javax_imageio_jpeg_image_1,0", tree);
// これまでに行った設定を元にイメージファイルを出力する。(ImageIO.writeは利用しない方針)
jpgWriter.setOutput(ImageIO.createImageOutputStream(new File(imageFile)));
jpgWriter.write(null, new IIOImage(bimg, null, imageMeta), jpgWriteParam);
} finally {
if (grahics != null) {
graphics.dispose();
graphics = null;
}
if (jpgWriter != null) {
jpgWriter.reset();
jpgWriter = null;
}
if (jpgReader != null) {
jpgReader.reset();
jpgReader = null;
}
if (bimg != null) {
bimg.flush();
bimg = null;
}
}
}