- PR -

画像減色処理について

1
投稿者投稿内容
いたこ
会議室デビュー日: 2004/05/25
投稿数: 6
投稿日時: 2005-02-16 11:02
JPEG画像を256色に減色して、GIFに保存したいです。

BufferedImageを二次元配列化して、減色し、BufferedImageにして戻すメソッドを作りました。減色はできているようなのですが、青い画像に化けてしまいます。

原因がわかりません。

JAVAの減色のしくみについて教えて下さい。
いたこ
会議室デビュー日: 2004/05/25
投稿数: 6
投稿日時: 2005-02-16 14:31
自己レスです

import com.sun.jimi.core.*;
import com.sun.jimi.core.util.ColorReducer;で減色できました。

引数(BufferedImage、色数(256))
ColorReducer reducer = new ColorReducer(colorNum, true);
Image reduced = reducer.getColorReducedImage(image);

これでImageに減色画像が入ります。

でも、最終的に欲しいのはBufferedImageです。

ImageをBufferedImageに変換する方法を教えて下さい。
さたろう
会議室デビュー日: 2005/02/07
投稿数: 11
投稿日時: 2005-02-16 14:57
たしか自分が昔やった方法は,
BufferedImageオブジェクトから,createGraphics()かgetGraphics()のどちらかでGraphicsオブジェクトを取得し,そのオブジェクトのdrawImageメソッドを用いて,Imageを描画したと思います.
記憶違いかもしれませんが,ちょっと試してみてください.
いたこ
会議室デビュー日: 2004/05/25
投稿数: 6
投稿日時: 2005-02-16 16:40
レスありがとうございます。

試してみましたが、
ImageをBufferedImageに変換できませんでした。

今BufferedImageFilterを試しております。

引き続きアドバイスお願いします。
takamaro
大ベテラン
会議室デビュー日: 2004/10/12
投稿数: 100
投稿日時: 2005-02-16 17:34
引用:

いたこさんの書き込み (2005-02-16 16:40) より:
試してみましたが、
ImageをBufferedImageに変換できませんでした。


JIMI関連については存じ上げませんが、ImageからBufferedImageへの
変換(?)でしたら、さたろうさんの方法で十分可能な気がしますけどね。
そもそも「試してみましたが」と「できませんでした」の間がすっぽりと抜け落ち
ていてはアドバイスのしようがないですよ。
さたろう
会議室デビュー日: 2005/02/07
投稿数: 11
投稿日時: 2005-02-16 19:34
前の私の書き込みの“ImageオブジェクトをBufferedImageオブジェクトに変換する”やり方に対して,簡単ではありますが,サンプルを作成してみましたので載せておきます.

コード:
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;

public class ImageTest{
    
    public static void main(String[] args){
        
        //  ↓ 画像を読み込む(適当なImageオブジェクトを作成)
        Image img = Toolkit.getDefaultToolkit().createImage("test.PNG");
        Component com = new Panel();
        MediaTracker mt = new MediaTracker(com);
        mt.addImage(img, 0);
        try{
            mt.waitForID(0);  // Imageを完全に読み込む処理
        }catch(InterruptedException e){}
        //-- 
        
        //  ↓ ImageをBufferedImageに変換する処理
        BufferedImage bimg= new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_3BYTE_BGR);  // BufferedImageオブジェクトを作成
        Graphics g = bimg.createGraphics();  // Graphicsの取得
        g.drawImage(img,0,0,null);  // BufferedImageに描画させる
        //-- 
        
        //  ↓ 試しに描画してみる処理
        JFrame frame = new JFrame();
        MyPanel myPanel = new MyPanel();
        myPanel.setImage(bimg);
        frame.add(myPanel);
        frame.setBounds(0,0,500,500);
        frame.setVisible(true);
        //--
    }
}
class MyPanel extends JPanel{
    private BufferedImage img=null;
    public void paint(Graphics g){
        if(img != null){
            g.drawImage(img,0,0,this);
        }
    }
    public void setImage(BufferedImage img){
        this.img = img;
    }
}


これの"test.PNG"の画像ファイルを書き直して実行させて見てください.
その画像が描画されていれば成功です.

もしかしたら,いたこさんのやりたいこととは違うことなのかもしれませんが,
検討してみてください.
いたこ
会議室デビュー日: 2004/05/25
投稿数: 6
投稿日時: 2005-02-17 09:58
レスありがとうございます。
さっそく試してみます。
いたこ
会議室デビュー日: 2004/05/25
投稿数: 6
投稿日時: 2005-02-17 11:12
できました。
ありがとうございます。

完成したコードを掲載しておきます。

プログラム初心者のため、読みづらい部分があるかもしれませんが
ご容赦ください。


import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ImagingOpException;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import Acme.JPM.Encoders.GifEncoder;
import com.sun.jimi.core.JimiException;
import com.sun.jimi.core.util.ColorReducer;

public class JpegToGif {

/**
* Jpeg画像を減色して、GIFエンコードして返す
*
* @param image   引数:画像(JPEG)
* @return     減色後の画像
* @throws     JimiException
*/

int maxColor = 256;//色数

//減色するメソッド
public BufferedImage quantizeImage( BufferedImage image,
int maxColors )
throws ImagingOpException, JimiException
{
//減色
ColorReducer reducer = new ColorReducer(maxColors);
Image reduced = reducer.getColorReducedImage(image);
// ↓ ImageをBufferedImageに変換する処理
BufferedImage newImage= new BufferedImage
(reduced.getWidth(null),
reduced.getHeight(null),
BufferedImage.TYPE_3BYTE_BGR);
Graphics g = newImage.createGraphics(); // Graphicsの取得
g.drawImage(reduced,0,0,null); // BufferedImageに描画させる

return newImage;
}

//エンコードする
public ByteArrayOutputStream encode(BufferedImage org ,
DefaultImageOperator con,
ByteArrayOutputStream stream )
throws JimiException, IOException{
org = con.quantizeImage(org , maxColor);//減色処理
GifEncoder gecd = new GifEncoder(org , stream);
gecd.encode();
stream.flush();
return stream;
}

//ファイルに出力
public void output(ByteArrayOutputStream stream,String destFile)
throws IOException{
FileOutputStream fout = new FileOutputStream(destFile);
fout.write(stream.toByteArray());
fout.close();
}

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

ByteArrayOutputStream stream = null;
JpegToGif jtg = new JpegToGif();
DefaultImageOperator con = new DefaultImageOperator();
//画像読み込み
BufferedImage image = ImageIO.read(new File(args[0]));
stream = jtg.encode(image , con , stream);//エンコード
jtg.output(stream,args[1]);//ファイルに書き出し

stream.close();
}
}
1

スキルアップ/キャリアアップ(JOB@IT)