Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

画像変換について

JavaでPNG⇒GIF、画像のサイズ変換を行いたいと考えております。
どのようなライブラリを使用してやるのがお奨めでしょうか?
いろいろ調べたのですが、JMF、Java Advanced Imaging、ACME等あり、混乱してます。
ちなみに、JavaのバージョンはJ2SE1.4.2を使用しています。
初歩的な質問で大変申し訳ないのですが、ご教授ください。

10

回答

3704

閲覧

10件の回答

評価

0

個人的にはImageIOですね。

評価

0

mio様
ご回答ありがとうございます。
mio様の意見を参考に、PNG⇒GIF、画像のサイズ変換のプログラムを作成してみました。
ただプログラムを実行すると、一瞬画面がちらついてしまします。
このちらつきを防ぐことはできるのでしょうか?それともjavaとはこのようなものなのでしょうか?
なお私の環境はWindowsVista、J2SE 1.4.2_04で、GIF変換時にはgif-plugin(https://gif-plugin.dev.java.net/)を使用しています。
よろしくお願いいたします。

-------------以下ソースになります。---------------

import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
import java.awt.RenderingHints;


public class GifConverter {

    private static final int WIDTH = 640;    //変換後の画像幅
    private static final int HEIGHT = 480;    //変換後の画像高さ
    
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        try{
            Convert();
            
            
        }
        catch(Exception e){
            System.out.println(e.getMessage());
        }
    }
    
    
    private static boolean Convert()  {
            
        boolean result = false;

        BufferedImage readImage = null;
        ImageFilter imageFilter = null;
        ImageProducer imageProducer = null;
        Image createdImage = null;
        BufferedImage bufferedImage = null;
        Graphics2D graphics2D = null;
        DataOutputStream dataOutputStream = null;
        
        try{
            readImage = ImageIO.read(new File("C:/a.png"));
            
            imageFilter = new AreaAveragingScaleFilter(WIDTH, HEIGHT);
            imageProducer = new FilteredImageSource(readImage.getSource(), imageFilter);
            createdImage = Toolkit.getDefaultToolkit().createImage(imageProducer);
            
            bufferedImage= new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

            graphics2D = bufferedImage.createGraphics();
            graphics2D.setRenderingHints(new  RenderingHints(RenderingHints.KEY_ANTIALIASING,  RenderingHints.VALUE_ANTIALIAS_ON));
            graphics2D.drawImage(createdImage, null, null);
            graphics2D.dispose();

            dataOutputStream = new DataOutputStream(new FileOutputStream("C:/a.gif"));

            ImageIO.write(bufferedImage, "gif", dataOutputStream);
            
            dataOutputStream.close();
            result = true;
        }
        catch(Exception e) {
        }            
        finally{
            readImage = null;
            imageFilter = null;
            imageProducer = null;
            createdImage = null;
            bufferedImage = null;
            graphics2D = null;
            dataOutputStream = null;
        }
        return result;
    }
}



評価

0

お世話になってます。
どうしても”ちらつき”が発生するので、調べ見ると下記の部分で発生するようです。
    createdImage = Toolkit.getDefaultToolkit().createImage(imageProducer);
この場合どのような回避方法があるのでしょうか?
ご存知の方がいらっしゃいましたらご教授願います。
よろしくお願いいたします。

評価

0

ちらつきの発生する、表示部分が上記ソースにはないようですが…。
具体的にどのようなちらつきなのかが、分かりません。

評価

0

イメージ形式とサイズ変換をするために、なぜ"スクリーンのちらつき"がでてくるのでしょう。

評価

0

mio様、foo様

返信ありがとうございます。

ちらつきが発生する部分(createdImage = Toolkit.getDefaultToolkit().createImage(imageProducer);)は
上記のソースのちょうど真ん中あたり(ソースの最初の行を1行目とすると46行目あたり)になります。

また、ちらつきなのですが、一瞬画面全体が暗くブラックアウトするような形になる現象です。

よろしくお願いいたします。

評価

0

そうではなくて…。
画面がないコードで、なぜ画面のちらつきが発生するのでしょうか?ということです。

評価

0

確かにmio様のご指摘の通りなのですが、なぜか私の環境で実行すると画面全体が黒く一瞬消えたようになります。
他の端末で試してみたのですが、他の端末2台では特にこのような現象は発生しませんでした。

ちなみに、端末の環境は下記のとおりです。

ちらつく端末
 WindowsVista + Java1.4.2_04
大丈夫な端末
 WindowsVista + Java1.6.0-oem
 WindwosXP + Java1.4.2_03

VistaとJavaの1.4系の相性が悪いのでしょうかね?
それともグラフィックカードとかですかね?

評価

0

画面全体となると、Javaの取り扱う部分ではありませんので、システムがらみでしょう。
JVMのネイティブである可能性もありますが、それはJVMをインストールすれば分かりますね。
ドライバだとすると、ちょっと簡単には行かないでしょうが。

評価

0

画面全体がちらつくのは、OS関連の問題かもしれませんが、Toolkitがネイティブにアクセスしているのですから、そもそもToolkitを使用しなければ良いのではないでしょうか?

ImageIO(旧JAI)を使用して掲題の処理を実装するために、Toolkitも、ImageProducerも必要ないですから。

ImageIOを使用するのであれば、ImageProducerとImageIOフレームワークを調べてみてください。
単純なイメージ形式変換、スケーリング程度の処理であれば、ざっと理解すれば良いでしょうから。

この件の処理であれば、ImageIOを使用すれば、処理部分はおそらく3行(1行でも可能だと思う)で書けるはずです。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。