Bitmap.getPixel仅返回0

时间:2013-06-11 08:26:52

标签: android

我有以下用于创建位图的代码:

public PixelMapper(Path inputPath){
    RectF src = new RectF();
    inputPath.computeBounds(src, true);
    int width = (int)src.width()+1;
    int height = (int)src.height()+1;
    largeBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);

    Paint canvasPaint = new Paint();
    canvasPaint.setAntiAlias(false);
    canvasPaint.setColor(Color.BLACK);
    canvasPaint.setStyle(Style.STROKE);
    canvasPaint.setStrokeWidth(5);

    Canvas canvas = new Canvas(largeBitmap);
    canvas.drawPath(inputPath, canvasPaint);
    bitmap = Bitmap.createScaledBitmap(largeBitmap, SIDE_OF_BITMAP, SIDE_OF_BITMAP, true);
    bitmap = Bitmap.createBitmap(bitmap);//so that a immutable bitmap is created
    drawPixelMap();
}

public void drawPixelMap(){
    for(int x=0; x<bitmap.getWidth(); x++){
        String msg="";
        for(int y=0; y<bitmap.getHeight(); y++){
            msg = Integer.toHexString( bitmap.getPixel(x,y) );
            Log.v("bitmap", msg);   
        }           
    }
}

int[] pixels = new int[64]; 
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, SIDE_OF_BITMAP, SIDE_OF_BITMAP);
bitmap.setPixels(pixels, 0, 8, 0, 0, 8, 8);
for ( int pixel : pixels)
    Log.v("bitmap", Integer.toHexString(pixel) );

问题是所有日志消息都是“0”:getPixel和getPixels都返回“0”。更糟糕的是,如果我删除行bitmap.getPixels(...);并离开bitmap.setPixels(...)行,则仍会像以前一样绘制图像。似乎bitmap变量只是一个引用,并且位图不存在,并且由于某种原因,我无法获得这些像素。 我知道位图是根据需要创建的,因为我可以在ImageView上查看它。它显示黑色和白色像素,也有一些灰色像素。代码:

Bitmap newBitmap = Bitmap.createScaledBitmap(bitmap, 128, 128, false);
imageView1.setImageBitmap(newBitmap);

SIDE_OF_BITMAP = 8,所有类(路径,位图,画布)都是android。

我尝试使用以下代码将位图保存到文件:

public String saveToStorage(String fileName){
    if( !storageDir.exists() )
        storageDir.mkdirs();
    File file = new File(storageDir, fileName + ".png");
    try{
        OutputStream out = new FileOutputStream(file);
        boolean result = bitmap.compress(CompressFormat.PNG, 100, out);
        out.close();
        return Boolean.toString(result);
    }
    catch (FileNotFoundException e){
        Log.e("save", "cannot save file", e);
        return "File not found exception";
    }
    catch (IOException e){
        Log.e("save", "IO error", e);
        return "IO Exception";
    }
}

但它返回“false”,即bitmap.compress方法返回false。请给我任何帮助,不一定是示例代码。

2 个答案:

答案 0 :(得分:1)

我发现了自己的错误。它位于

largeBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);

Bitmap.Config.ALPHA_8仅创建一个蒙版。它不会创建实际像素。这就是我得到错误结果的原因。但是,当我将其设置为ImageView时,我得到了所需的结果,因为它的背景(默认情况下)是白色的。 我通过将Bitmap.Config.ALPHA_8更改为Bitmap.Config.ARGB_8888

来解决了我的问题

答案 1 :(得分:0)

该行

bitmap = Bitmap.createBitmap(bitmap);

创建与源位图具有相同维度/颜色深度等的不可变位图,但不将源位图从可变位转换为不可变位。所以你的新位图是空白的。

您可以先使用newBitmap = Bitmap.createBitmap(int[], int, int, Bitmap.Config)创建不可变位图,然后按canvas = new Canvas(newBitmap)为其创建一个画布。您的位图现在可以newBitmap复制到canvas.drawBitmap(bitmap, 0, 0, null)