- - PR -
画像減色処理について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-02-16 11:02
JPEG画像を256色に減色して、GIFに保存したいです。
BufferedImageを二次元配列化して、減色し、BufferedImageにして戻すメソッドを作りました。減色はできているようなのですが、青い画像に化けてしまいます。 原因がわかりません。 JAVAの減色のしくみについて教えて下さい。 | ||||
|
投稿日時: 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-16 14:57
たしか自分が昔やった方法は,
BufferedImageオブジェクトから,createGraphics()かgetGraphics()のどちらかでGraphicsオブジェクトを取得し,そのオブジェクトのdrawImageメソッドを用いて,Imageを描画したと思います. 記憶違いかもしれませんが,ちょっと試してみてください. | ||||
|
投稿日時: 2005-02-16 16:40
レスありがとうございます。
試してみましたが、 ImageをBufferedImageに変換できませんでした。 今BufferedImageFilterを試しております。 引き続きアドバイスお願いします。 | ||||
|
投稿日時: 2005-02-16 17:34
JIMI関連については存じ上げませんが、ImageからBufferedImageへの 変換(?)でしたら、さたろうさんの方法で十分可能な気がしますけどね。 そもそも「試してみましたが」と「できませんでした」の間がすっぽりと抜け落ち ていてはアドバイスのしようがないですよ。 | ||||
|
投稿日時: 2005-02-16 19:34
前の私の書き込みの“ImageオブジェクトをBufferedImageオブジェクトに変換する”やり方に対して,簡単ではありますが,サンプルを作成してみましたので載せておきます.
これの"test.PNG"の画像ファイルを書き直して実行させて見てください. その画像が描画されていれば成功です. もしかしたら,いたこさんのやりたいこととは違うことなのかもしれませんが, 検討してみてください. | ||||
|
投稿日時: 2005-02-17 09:58
レスありがとうございます。
さっそく試してみます。 | ||||
|
投稿日時: 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