2

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で開いてスケーリングし、再エンコードした後のそのファイルはそれを行いませんが、各ピクセルにトゥルーカラーを使用するため、ファイルサイズがはるかに大きくなります。

質問

  1. 標準のAndroidライブラリにカラーマップを使用してファイルを圧縮させる方法があるかどうか誰かが知っていますか?
  2. そうでない場合は、これら3つのタスク(デコード、スケーリング、エンコード)だけを実行する純粋なJava実装があるかどうかを誰かが知っていますか?

前もって感謝します。

[1] PNG仕様

4

2 に答える 2

1

インデックス付きのpngを保存できるJavaライブラリのpngjを使用できる場合があります。

http://code.google.com/p/pngj/

于 2012-10-01T12:29:24.763 に答える
1

純粋なJavaの実装があるかどうか誰かが知っていますか

はい、pngjライブラリを使用します。そのプレーンな.jarライブラリ。

ここを見てください: PNGJ2.1.1でインデックスPNGを作成する

いくつかのJavaサンプルについては、次の1つのJavaアプリケーションがあります 。LanceNanekによるNeatoCodeテクニック

于 2015-10-13T10:32:01.503 に答える