通过手机里面的路径找到一张图片将它画到画布上面,然后保存,保存后的图片西面是黑的,我想要保存后的图片大小和我放上去的图片的大小一样,求高手解决package com.example.drawline;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import android.R.integer;
import android.annotation.SuppressLint;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;@SuppressLint({ "NewApi", "ShowToast", "WrongCall" })
public class DrawLine extends View {
private int mov_x;// 声明起点坐标
private int mov_y;
private Paint paint;// 声明画笔
private Canvas canvas;// 画布
Bitmap bitmap;// 位图

List<float[]> centerList = new ArrayList<float[]>();// 用来存放画圆心坐标
List<float[]> ciryleList = new ArrayList<float[]>();// 用来存放画圆时的第二点的坐标 List<float[]> rect_centerList = new ArrayList<float[]>();// 用来存放矩形中心的坐标
List<float[]> rectList = new ArrayList<float[]>();// 用来存放矩形的第二个点的坐标
List<Object[]> objectList = new ArrayList<Object[]>();// 用来存放文字以及文字的坐标 List<float[]> lineList1 = new ArrayList<float[]>();// 用来存放画线的参数
List<float[]> lineList2 = new ArrayList<float[]>();// 用来存放画线的参数
private int blcolor;
private double width;
private double height;
int doAction;
int h;
int mask=-1;
final static int editTextID = 0x1000001;
String path = "/mnt/sdcard/picture.jpg";
public DrawLine(Context context) {
super(context); paint = new Paint(Paint.DITHER_FLAG);// 创建一个画笔
try {
Bitmap bitmap2 = revitionImageSize(path, 600);//
bitmap = Bitmap.createBitmap(bitmap2.getWidth(), bitmap2.getHeight(), Bitmap.Config.ARGB_8888); // 设置位图的宽高
canvas = new Canvas(bitmap);
canvas.setBitmap(bitmap);
paint.setStyle(Style.STROKE);// 设置非填充
paint.setStrokeWidth(4);// 笔宽5像素
paint.setColor(Color.RED);// 设置为红笔
paint.setAntiAlias(true);// 锯齿不显示
paint.setTextSize(30); } catch (Exception e) {
e.printStackTrace();
}// 根据路径解码出一个bitmap } // 08-26 10:19:19.072: D/may(9772):
// MainActivity--->path=/mnt/sdcard/Tencent/QzonePic/-1885745854.png // 画位图
@Override
protected void onDraw(Canvas canvas) { Log.i("ONDRAW", "ONDRAW");
canvas.drawBitmap(bitmap, 0, 0, paint);


Bitmap bitmap2;
try {
bitmap2 = revitionImageSize(path, 600);
canvas.drawBitmap(bitmap2, 0, 0, paint);// 将图片画到当前的画布上

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 将图片缩小


invalidate();
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
} @SuppressLint("ShowToast")
public void saveToLocal() { canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore(); String path = "/sdcard/mm.jpg"; try {
FileOutputStream fos = new FileOutputStream(path); DrawLine.this.buildDrawingCache();
Bitmap bitmap = DrawLine.this.getDrawingCache(); if (bitmap == null) {
Toast.makeText(getContext(), "空的,再想想办法吧", 1000).show();
} else {
bitmap.compress(CompressFormat.JPEG, 100, fos);
}
fos.flush();
fos.close();
Toast.makeText(getContext(), "CLOSE", 1000).show();
} catch (FileNotFoundException e) {
Toast.makeText(getContext(), "FileNotFoundException", 1000).show();
e.printStackTrace();
} catch (IOException e) {
Toast.makeText(getContext(), "IOException", 1000).show();
e.printStackTrace();
} } private Bitmap revitionImageSize(String path, int size) throws IOException {
// 取得图片
FileInputStream temp = new FileInputStream(path);
BitmapFactory.Options options = new BitmapFactory.Options();
// 这个参数代表,不为bitmap分配内存空间,只记录一些该图片的信息(例如图片大小),说白了就是为了内存优化
options.inJustDecodeBounds = true;
// 通过创建图片的方式,取得options的内容(这里就是利用了java的地址传递来赋值)
BitmapFactory.decodeStream(temp, null, options);
// 关闭流
temp.close();
// 生成压缩的图片
int i = 0;
Bitmap bitmap = null;
while (true) {
// 这一步是根据要设置的大小,使宽和高都能满足
if ((options.outWidth >> i <= size)
&& (options.outHeight >> i <= size)) {
// 重新取得流,注意:这里一定要再次加载,不能二次使用之前的流!
temp = new FileInputStream(path);
// 这个参数表示 新生成的图片为原始图片的几分之一。
options.inSampleSize = (int) Math.pow(2.0D, i);
// 这里之前设置为了true,所以要改为false,否则就创建不出图片
options.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeStream(temp, null, options);
break;
}
i += 1;
}
return bitmap;
}}package com.example.drawline;import com.example.drawline.R.layout;import android.app.Activity;
import android.os.Bundle;
import android.text.Layout;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.Toast;public class MainActivity extends Activity {
private DrawLine bDrawl; // private int action;
OnClickListener listener = new OnClickListener() { @Override
public void onClick(View v) {

bDrawl.saveToLocal();
Toast.makeText(getApplicationContext(), "保存成功MainActivity", 1000).show();
}
};

private class saveThread implements Runnable{ @Override
public void run() {
bDrawl.saveToLocal();

}

} /*void createView() { DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
bDrawl = new DrawLine(this, dm.widthPixels, dm.heightPixels); }
*/

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// bDrawl = new DrawLine(this, dm.widthPixels, dm.heightPixels, action); setContentView(R.layout.activity_main);// 将view视图放到Activity中显示
LinearLayout mainLayout = (LinearLayout) findViewById(R.id.mainLayout);

bDrawl = new DrawLine(this); mainLayout.addView(bDrawl); Button saveButton = (Button) findViewById(R.id.save);
saveButton.setOnClickListener(listener);
}}
canvas位图图片bitmapsave