我有以下用于创建位图的代码:
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。请给我任何帮助,不一定是示例代码。
答案 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)
。