美文网首页
在图片上绘制线并保存

在图片上绘制线并保存

作者: 蛋蛋不哭 | 来源:发表于2016-04-22 10:50 被阅读36次

    我们的做法是把一张图片当作位图,在这张图片上绘制线。
    具体实现如下:

    • 布局文件(3个控件)

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:text="启动Gallery" />
    
        <ImageView
            android:id="@+id/imageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/button1"
            android:layout_below="@+id/button1" />
    
        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="保存" />
    
    
    • 代码文件

    public class MainActivity extends Activity implements OnClickListener,
            OnTouchListener {
    
        private Button btn, btn_save;
        private ImageView iv;
        private float downx, downy, upx, upy;
        private Canvas cv;
        private Bitmap alter;
        private Paint paint;
        FileOutputStream fos = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            iviview();
        }
    
        private void iviview() {
            btn = (Button) findViewById(R.id.button1);
            btn_save = (Button) findViewById(R.id.button2);
            iv = (ImageView) findViewById(R.id.imageView);
            btn.setOnClickListener(this);
            btn_save.setOnClickListener(this);
            iv.setOnTouchListener(this);
        }
    
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (v == btn) {
                // 利用意图调用内置的画廊
                Intent i = new Intent(
                        Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(i, 0);
            } else if (v == btn_save) {
                if (alter != null) {
                    // 往SD卡里面保存图片
                    // "/aa"是文件名
                    File f = new File(Environment.getExternalStorageDirectory()
                            .getAbsoluteFile() + "/aa");
                    try {
                        // 创建一个新文件
                        f.createNewFile();
                        fos = new FileOutputStream(f);
                        // format格式 quality像素 stream输出流
                        alter.compress(CompressFormat.JPEG, 100, fos);
                        Toast.makeText(this, "文件保存成功", 1).show();
                    } catch (Exception e) {
                    }
                }
            }
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            // TODO Auto-generated method stub
            super.onActivityResult(requestCode, resultCode, data);
    
            // 将你在画廊中选中的图片信息返回,取出,并且以合适的尺寸绘制在IV
            if (resultCode == RESULT_OK) {
                Uri imageUri = data.getData();
    
                Display display = getWindowManager().getDefaultDisplay();
                int wd = display.getWidth();
                int hd = display.getHeight();
    
                // 我们要获得图片尺寸,,,如果你直接把这幅图加载到内存的话,如果图很大,可能导致内存溢出。
                // 加载图片的尺寸而并非是图片本身
                BitmapFactory.Options bo = new BitmapFactory.Options();
                bo.inJustDecodeBounds = true;
                try {
                    Bitmap bmp = BitmapFactory.decodeStream(getContentResolver()
                            .openInputStream(imageUri), null, bo);
    
                    int widthRadio = (int) Math.ceil((float) bo.outWidth
                            / (float) wd);
                    int heightRadio = (int) Math.ceil((float) bo.outHeight
                            / (float) hd);
                    if (widthRadio > 1 || heightRadio > 1) {
                        // 表示图片尺寸大于显示尺寸要进行处理
                        if (widthRadio > heightRadio) {
                            bo.inSampleSize = widthRadio;
                            // inSampleSize 成员变量,可以根据图形的实际宽高 和期望宽高来计算一个合适的尺寸。
                        } else {
                            bo.inSampleSize = heightRadio;
                        }
                    }
    
                    // 处理完尺寸之后,我要加载图片
                    bo.inJustDecodeBounds = false;
                    bmp = BitmapFactory.decodeStream(getContentResolver()
                            .openInputStream(imageUri), null, bo);
    
                    // 把得到的图片的宽高当作位图
                    alter = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(),
                            bmp.getConfig());
                    cv = new Canvas(alter);
                    paint = new Paint();
                    paint.setColor(Color.BLUE);
                    paint.setStrokeWidth(3);
                    // 开始画
                    cv.drawBitmap(bmp, 0, 0, paint);
                    iv.setImageBitmap(alter);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    
        @Override
        public boolean onTouch(View arg0, MotionEvent m) {
            int action = m.getAction();
            switch (action) {
            case MotionEvent.ACTION_DOWN:
    
                downx = m.getX();
                downy = m.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                upx = m.getX();
                upy = m.getY();
                cv.drawLine(downx, downy, upx, upy, paint);
                iv.invalidate();
                downx = upx;
                downy = upy;
                break;
            case MotionEvent.ACTION_UP:
                upx = m.getX();
                upy = m.getY();
                cv.drawLine(downx, downy, upx, upy, paint);
                iv.invalidate();
                break;
            default:
                break;
            }
            return true;
        }
    }
    
    
    
    • 操作

    photo.jpg

    相关文章

      网友评论

          本文标题:在图片上绘制线并保存

          本文链接:https://www.haomeiwen.com/subject/gyqxrttx.html