使用画布绘制捕获的图像并保存到SD卡-损坏的显示-android
我拍了一张照片,想用手指在上面画一个矩形 在与屏幕交互时,一切正常,显示正确。但当我想用SD卡上的矩形保存图像时,我得到的图像背景正确,但有一点破损的矩形。他们看起来像是有人把他们的某些部分剪掉了。你可以看到它们曾经是长方形,但看起来像垃圾 我的问题是为什么 我很难将所有内容保存在一个画布上,并将其保存到SD卡,因为我的线程无法设置画布的位图。在使用了两张画布之后,它就像我说的那样工作,但是矩形被破坏了。 当我在画布上绘制没有底层图像位图的矩形时,矩形被正确保存。 我真的不明白。我尝试了我能想象到的一切,但没有得到错误 我试着发布一个简短的代码示例:使用画布绘制捕获的图像并保存到SD卡-损坏的显示-android,android,bitmap,save,android-canvas,sd-card,Android,Bitmap,Save,Android Canvas,Sd Card,我拍了一张照片,想用手指在上面画一个矩形 在与屏幕交互时,一切正常,显示正确。但当我想用SD卡上的矩形保存图像时,我得到的图像背景正确,但有一点破损的矩形。他们看起来像是有人把他们的某些部分剪掉了。你可以看到它们曾经是长方形,但看起来像垃圾 我的问题是为什么 我很难将所有内容保存在一个画布上,并将其保存到SD卡,因为我的线程无法设置画布的位图。在使用了两张画布之后,它就像我说的那样工作,但是矩形被破坏了。 当我在画布上绘制没有底层图像位图的矩形时,矩形被正确保存。 我真的不明白。我尝试了我能想象
public class Mark extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mark);
p = new Panel(this);
frLayout = (FrameLayout)findViewById(R.id.preview);
frLayout.addView(p);
bitmap = BitmapFactory.decodeFile(image_path + "/img.jpg", options);
img = (ImageView) findViewById(R.id.img_capturedImage);
bitmapAll = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),Bitmap.Config.ARGB_8888);
save.setOnClickListener(new View.OnClickListener() {
try {
out = new FileOutputStream(file);
bitmapAll.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
MediaStore.Images.Media.insertImage(getContentResolver(),
file.getAbsolutePath(), file.getName(),
file.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
class Panel extends SurfaceView implements SurfaceHolder.Callback {
private TutorialThread _thread;
Canvas myCanvas;
public Panel(Context context) {
super(context);
getHolder().addCallback(this);
_thread = new TutorialThread(getHolder(), this);
setFocusable(true);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
synchronized (_thread.getSurfaceHolder()) {
switch(event.getAction() & MotionEvent.ACTION_MASK){
... save the coordinates for the rectangle ...
}
return true;
}
@Override
public void onDraw(Canvas canvas) {
myCanvas = new Canvas(bitmapAll);
Paint paint = new Paint();
myCanvas.drawBitmap(bitmap, 0, 0, paint);
canvas.drawBitmap(bitmap, 0, 0, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_OVER));
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(3);
Rect rect;
for (...go over every saved rectangle ...) {
rect.set(...coordinates...);
canvas.drawRect(rect, paint);
myCanvas.drawRect(rect, paint);
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub
}
public void surfaceCreated(SurfaceHolder holder) {
_thread.setRunning(true);
_thread.start();
}
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
_thread.setRunning(false);
while (retry) {
try {
_thread.join();
retry = false;
} catch (InterruptedException e) {
}
}
}
}
class TutorialThread extends Thread {
private SurfaceHolder _surfaceHolder;
private Panel _panel;
private boolean _run = false;
public TutorialThread(SurfaceHolder surfaceHolder, Panel panel) {
_surfaceHolder = surfaceHolder;
_panel = panel;
}
public void setRunning(boolean run) {
_run = run;
}
public SurfaceHolder getSurfaceHolder() {
return _surfaceHolder;
}
@Override
public void run() {
Canvas c;
while (_run) {
c = null;
try {
c = _surfaceHolder.lockCanvas(null);
synchronized (_surfaceHolder) {
_panel.onDraw(c);
}
} catch (Exception e) {
Log.e("Error", Log.getStackTraceString(e));
} finally {
if (c != null) {
_surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
}
}