Androidにその機能を使ってインデックスカラーのPNGファイルを作成させる方法を知っている人はいないでしょうかcompress
。
例えば:
InputStream FIS = ...
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
opt.inScaled = false;
Bitmap img = BitmapFactory.decodeStream(FIS, null, opt);
// Resize
float scale = 0.8f;
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
Bitmap scaledBitmap = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true);
img = null; // Free
// Write
File sdCard = Environment.getExternalStorageDirectory();
File dir = new File(sdCard.getAbsolutePath() + "/scaled/");
FileOutputStream FOS = new FileOutputStream(new File(dir, "out.png"));
scaledBitmap.compress(Bitmap.CompressFormat.PNG, 100, FOS);
scaledBitmap = null; // Free
このコードはPNGファイルを開き、80%にサイズ変更して、SDカードに保存します。結果の画像は実際に80%に拡大縮小されますが、結果のファイルサイズは元のサイズのほぼ5倍になります。
-rw-rw-r--1ユーザーuser558789月10日19:008500_001.2B.png<-入力 -rwxr--r--1ユーザーuser245933Sep 10 21:49out.png<-出力
これは、元のファイルがトゥルーカラー(DirectClass)ではなくインデックスカラー(PseudoClass)を使用しているためです。[1]
$識別8500_001.2B.png 8500_001.2B.png PNG 1712x2200 1712x2200 + 0 +08ビット疑似クラス2c55.9KB0.000u 0:00.000 $ ID out.png out.png PNG 1370x1760 1370x1760 + 0 +08ビットDirectClass246KB0.000u 0:00.000
ImageMagickは、インデックスカラーと2色のカラーマップを使用して元の2色画像をエンコードするのに十分スマートです。Androidで開いてスケーリングし、再エンコードした後のそのファイルはそれを行いませんが、各ピクセルにトゥルーカラーを使用するため、ファイルサイズがはるかに大きくなります。
質問
- 標準のAndroidライブラリにカラーマップを使用してファイルを圧縮させる方法があるかどうか誰かが知っていますか?
- そうでない場合は、これら3つのタスク(デコード、スケーリング、エンコード)だけを実行する純粋なJava実装があるかどうかを誰かが知っていますか?
前もって感謝します。
[1] PNG仕様