Help us understand the problem. What is going on with this article?

画像リサイズ

More than 1 year has passed since last update.

はじめに

事前に以下のアプリケーションをインストールします。
・ImageMagick
Linux版/Windows版/Mac版があります。
http://www.imagemagick.org/script/binary-releases.php

※なお、JavaSEのjavax.imageio.ImageIOクラスを使用すると非常に簡単なのですが、出力される画質は実用に堪えません。
→[2016/02/04追記]saka1029さんにコメントでご教示いただいた方法だとめっちゃきれいです。ありがとうございます!(ImageIOさんごめんなさい)

リサイズする画像は以下のファイルを使います。
input.jpg

実装例

サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

ImageResizer.java
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 *
 * @author tool-taro.com
 */
public class ImageResizer {

    public static void main(String[] args) throws IOException, InterruptedException {

        //ImageMagickのパス
        //String imageMagickPath = "C:\\Program Files\\ImageMagick-6.8.7-Q16\\convert.exe"; //←Windowsの場合の例
        String imageMagickPath = "/usr/bin/convert";
        //読み取りたい画像ファイルの保存場所
        String inputFilePath = "input.jpg";
        //リサイズ後の画像ファイルの保存場所
        String outputFilePath = "output.jpg";
        //リサイズ後の幅(0以下の場合は高さに合わせて自動調整)
        int width = 640;
        //リサイズ後の高さ(0以下の場合は高さに合わせて自動調整)
        int height = 0;
        //リサイズ後の画像形式(jpg/png/gif)
        String type = "jpg";
        //リサイズ後の画像形式がjpgの場合のdpi(0以下の場合は変更しない)
        int dpi = 72;

        //リサイズ処理
        File source = new File(inputFilePath);
        File target = new File(outputFilePath);
        //ImageMagickのリサイズ指定文字列
        String size;
        if (height <= 0) {
            size = String.valueOf(width);
        }
        else if (width <= 0) {
            size = "x" + height;
        }
        else {
            size = width + "x" + height + "!";
        }

        String[] commandArray = new String[5 + ((dpi > 0) ? 2 : 0) + (("jpg".equals(type)) ? 2 : 0)];
        int index = 0;
        commandArray[index++] = imageMagickPath;
        if (dpi > 0) {
            commandArray[index++] = "-density";
            commandArray[index++] = String.valueOf(dpi);
        }
        //jpgの場合、元画像の透過部分を消す
        if ("jpg".equals(type)) {
            commandArray[index++] = "-alpha";
            commandArray[index++] = "deactivate";
        }
        commandArray[index++] = "-resize";
        commandArray[index++] = size;
        commandArray[index++] = source.getAbsolutePath();
        commandArray[index++] = type + ":" + target.getAbsolutePath();

        Runtime runtime = Runtime.getRuntime();
        Process process = null;
        StringBuilder logBuilder = new StringBuilder();
        StringBuilder errorBuilder = new StringBuilder();
        int status = 0;

        try {
            process = runtime.exec(commandArray);
            final InputStream in = process.getInputStream();
            final InputStream ein = process.getErrorStream();

            Runnable inputStreamThread = () -> {
                BufferedReader reader = null;
                String line;
                try {
                    reader = new BufferedReader(new InputStreamReader(in));
                    while (true) {
                        line = reader.readLine();
                        if (line == null) {
                            break;
                        }
                        logBuilder.append(line).append("\n");
                    }
                }
                catch (IOException e) {
                }
                finally {
                    if (reader != null) {
                        try {
                            reader.close();
                        }
                        catch (IOException e) {
                        }
                    }
                }
            };
            Runnable errorStreamThread = () -> {
                BufferedReader reader = null;
                String line;
                try {
                    reader = new BufferedReader(new InputStreamReader(ein));
                    while (true) {
                        line = reader.readLine();
                        if (line == null) {
                            break;
                        }
                        errorBuilder.append(line).append("\n");
                    }
                }
                catch (IOException e) {
                }
                finally {
                    if (reader != null) {
                        try {
                            reader.close();
                        }
                        catch (IOException e) {
                        }
                    }
                }
            };

            Thread inThread = new Thread(inputStreamThread);
            Thread errorThread = new Thread(errorStreamThread);

            inThread.start();
            errorThread.start();

            status = process.waitFor();
            inThread.join();
            errorThread.join();
        }
        finally {
            if (process != null) {
                try {
                    process.destroy();
                }
                catch (Exception e) {
                }
            }
        }
    }
}

動作確認

$ javac ImageResizer.java
$ java ImageResizer

以下のような画像が出力されているはずです。
output.jpg

環境

  • 開発

    • Windows 10 Pro
    • JDK 1.8.0_112
    • NetBeans IDE 8.2
  • 動作検証

    • CentOS Linux release 7.2
    • JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
画像リサイズ(高画質・縮小・拡大)|Web便利ツール@ツールタロウ

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away