1

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

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所有类(Path、Bitmap、Canvas)都是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。请给我任何帮助,不一定是示例代码。

4

2 回答 2

1

我发现了我的错误。它位于线上

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

Bitmap.Config.ALPHA_8唯一创建一个掩码。它不会创建实际像素。这就是为什么我得到错误的结果。但是,当我将其设置为 a 时,ImageView我得到了所需的结果,因为它的背景(默认情况下)是白色的。我通过更改Bitmap.Config.ALPHA_8来解决了我的问题Bitmap.Config.ARGB_8888

于 2013-06-12T08:09:52.070 回答
0

线

bitmap = Bitmap.createBitmap(bitmap);

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

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

于 2013-06-11T09:07:41.263 回答