canvas保存图片的问题,保存后的图片下面一部分是黑的

JiXianWanMei999 2013-09-05 03:51:28

通过手机里面的路径找到一张图片将它画到画布上面,然后保存,保存后的图片西面是黑的,我想要保存后的图片大小和我放上去的图片的大小一样,求高手解决

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);
}

}




...全文
1215 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
danielinbiti 2013-09-05
  • 打赏
  • 举报
回复
引用 1 楼 JiXianWanMei999 的回复:
我的qq 1257998163欢迎大神联系我http://www.eoeandroid.com/thread-303246-1-1.html 不知道怎么上传附件拉个链接放这里了 代码的第53行的path要改成自己手机里面的存在的图片的路径
canvas变量不统一
JiXianWanMei999 2013-09-05
  • 打赏
  • 举报
回复
我的qq 1257998163欢迎大神联系我http://www.eoeandroid.com/thread-303246-1-1.html 不知道怎么上传附件拉个链接放这里了 代码的第53行的path要改成自己手机里面的存在的图片的路径

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧