使用Android创建索引颜色的PNG

时间:2012-09-11 02:38:31

标签: android png image-compression

我想知道是否有人知道如何强制Android使用compress函数创建索引颜色的PNG文件。

例如:

    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 user user  55878 Sep 10 19:00 8500_001.2B.png  <- Input
-rwxr--r-- 1 user user 245933 Sep 10 21:49 out.png          <- Output

原因是因为原始文件使用的是索引颜色(PseudoClass),而不是真彩色(DirectClass)。 [1]

$ identify 8500_001.2B.png
8500_001.2B.png PNG 1712x2200 1712x2200+0+0 8-bit PseudoClass 2c 55.9KB 0.000u 0:00.000

$ identify out.png
out.png PNG 1370x1760 1370x1760+0+0 8-bit DirectClass 246KB 0.000u 0:00.000

ImageMagick非常智能,可以使用索引颜色和双色彩色图对原始双色图像进行编码。在Android中打开,缩放和重新编码后,该文件不会这样做,而是为每个像素使用真彩色,从而产生更大的文件大小。

问题

  1. 有没有人知道是否有办法强制标准Android库使用色彩映射压缩文件?
  2. 如果没有,有没有人知道是否有任何纯java实现只能完成这3个任务(解码,缩放,编码)?
  3. 提前致谢。

    [1] The PNG Specification

2 个答案:

答案 0 :(得分:1)

  

有没有人知道是否有任何纯java实现

是的,使用pngj库。它是一个简单的 .jar 库。

看看这里: Create Index PNG with PNGJ 2.1.1

对于一些java示例,这里有一个java应用程序: NeatoCode TechniquesLance Nanek

答案 1 :(得分:0)

有可能使用pngj一个可以保存索引png的java库。

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