Android - 使用应用的PorterDuffColorFilter压缩位图

时间:2013-12-29 08:54:30

标签: java android bitmap

我有Bitmap申请了PorterDuffColorFilter。但是当我将此Bitmap压缩到文件时,PorterDuffColorFilter消失了。我如何压缩Bitmap并且不会丢失PorterDuffColorFilter

以下是我现在使用的一些代码:


public void PrepareFiles(Bitmap original_img)
{
    try
    {
        Bitmap b = convert(original_img, 0xFFFF0000);

        String path1 = "/sdcard/red.png";

        File f1 = new File(path1);
        if (!f1.exists()) {
            f1.createNewFile();
        }
        else
        {
            f1.delete();
            f1.createNewFile();
        }

        FileOutputStream fos1 = new FileOutputStream(path1);
        b.compress(Bitmap.CompressFormat.PNG, 100, fos1);
        b.recycle();
    }
    catch (Exception ex)
    {
        Toast.makeText(this, ex.toString(), Toast.LENGTH_LONG).show();
    }
}

public Bitmap convert(Bitmap src, int color)
{
    BitmapDrawable temp = new BitmapDrawable(src);
    temp.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.ADD));
    return temp.getBitmap();
}

1 个答案:

答案 0 :(得分:4)

您无法在ColorFilter上设置Bitmap。在您的代码中,您要在ColorFilter上设置BitmapDrawable。这样做不会更改基础Bitmap实例。要解决您的问题,您必须创建一个新的Bitmap,附加一个Canvas并使用Paint在画布上绘制原始位图,该ColorFilter具有所需的// The original bitmap Bitmap src = ...; // an empty bitmap with the same dimensions as the original one Bitmap filteredBitmap = Bitmap.create(src.getWidth(), src.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(filteredBitmap); Paint paint = new Paint(); // no need to set Paint.FILTER_BITMAP flag paint.setColorFilter(colorFilter); // set the required color filter canvas.drawBitmap(src, 0f, 0f, paint); 。这是一个例子:

{{1}}

在此之后将'filteredBitmap'保存到文件中。