zoukankan      html  css  js  c++  java
  • Android学习笔记进阶18之画图并保存图片到本地

    1、首先创建一个Bitmap图片,并指定大小;
     
    2、在该图片上创建一个新的画布Canvas,然后在画布上绘制,并保存即可;
     
    3、需要保存的目录File,注意如果写的目录如“/sdcard/song/”如果不存在的话,要先创建(file.mkdirs).。


    4、需要添加权限:<uses-permission Android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    Canvas是一个画布,你可以建立一个空白的画布,就直接new一个Canvas对象,不需要参数。也可以先使用BitmapFactory创建一个Bitmap对象,作为新的Canvas对象的参数,也就是说这个画布不是空白的,如果你想保存图片的话,最好是Bitmap是一个新的,而不是从某个文件中读入进来的,或者是Drawable对象。然后使用Canvas画第一张图上去,在画第二张图上去,最后使用Canvas.save(int flag)的方法进行保存,注意save方法里面的参数可以保存单个图层,如果是保存全部图层的 话使用 save( Canvas.ALL_SAVE_FLAG )。

    关于图片旋转问题不懂的话,请看博文:Android学习笔记之Bitmap位图的旋转
                                    这是原图片和旋转后图片

     

                                                                         这是保存到本地的图片800*600 JPG格式

     

    具体实现:

    1. package xiaosi.bitmap;  
    2.   
    3. import android.app.Activity;  
    4. import android.os.Bundle;  
    5.   
    6. public class mianActivity extends Activity  
    7. {  
    8.   
    9.     private BitmapView bitmapView = null;  
    10.     @Override  
    11.     protected void onCreate(Bundle savedInstanceState)  
    12.     {  
    13.         super.onCreate(savedInstanceState);  
    14.         bitmapView = new BitmapView(this);  
    15.         setContentView(bitmapView);  
    16.     }  
    17. }  


    BitmapView.Java

    1. package xiaosi.bitmap;  
    2.   
    3. import java.io.File;  
    4. import java.io.FileOutputStream;  
    5.   
    6. import android.content.Context;  
    7. import android.content.res.Resources;  
    8. import android.graphics.Bitmap;  
    9. import android.graphics.Bitmap.Config;  
    10. import android.graphics.BitmapFactory;  
    11. import android.graphics.Canvas;  
    12. import android.graphics.Color;  
    13. import android.graphics.Matrix;  
    14. import android.view.View;  
    15.   
    16. public class BitmapView extends View  
    17. {  
    18.     private Matrix matrix = null;  
    19.     public BitmapView(Context context)  
    20.     {  
    21.         super(context);  
    22.     }  
    23.   
    24.     public void onDraw(Canvas canvas)  
    25.     {  
    26.           
    27.         // 获取资源文件的引用res  
    28.         Resources res = getResources();   
    29.         // 获取图形资源文件  
    30.         Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.h);  
    31.         // 设置canvas画布背景为白色  
    32.         canvas.drawColor(Color.BLACK);  
    33.         canvas.drawBitmap(bmp, 0, 0, null);  
    34.         // 定义矩阵对象  
    35.         matrix = new Matrix();  
    36.         //旋转30度  
    37.         matrix.postRotate(30);  
    38.         Bitmap bitmap = Bitmap.createBitmap(bmp, 0, 50, bmp.getWidth(), bmp.getHeight()/2,  
    39.                 matrix, true);  
    40.         canvas.drawBitmap(bitmap, 0, 250, null);  
    41.         SaveBitmap(bitmap);  
    42.     }  
    43.     //保存到本地  
    44.     public void SaveBitmap(Bitmap bmp)  
    45.     {  
    46.         Bitmap bitmap = Bitmap.createBitmap(800, 600, Config.ARGB_8888);    
    47.         Canvas canvas = new Canvas(bitmap);  
    48.         //加载背景图片  
    49.         Bitmap bmps = BitmapFactory.decodeResource(getResources(), R.drawable.playerbackground);  
    50.         canvas.drawBitmap(bmps, 0, 0, null);  
    51.         //加载要保存的画面  
    52.         canvas.drawBitmap(bmp, 10, 100, null);  
    53.         //保存全部图层  
    54.         canvas.save(Canvas.ALL_SAVE_FLAG);  
    55.         canvas.restore();  
    56.         //存储路径  
    57.         File file = new File("/sdcard/song/");  
    58.         if(!file.exists())  
    59.             file.mkdirs();  
    60.             try {  
    61.                 FileOutputStream fileOutputStream = new FileOutputStream(file.getPath() + "/xuanzhuan.jpg");  
    62.                 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);  
    63.                 fileOutputStream.close();  
    64.                 System.out.println("saveBmp is here");  
    65.             } catch (Exception e) {  
    66.                         e.printStackTrace();  
    67.         }  
    68.     }  
    69. }  

    源代码下载:点击打开链接

  • 相关阅读:
    nginx: [emerg] the size 10485760 of shared memory zone "cache_one" conflicts with already declared size 0
    ruby 删除文件夹(包括文件夹中的文件夹和文件)
    nisi 脚本示例
    将node-expat扩展编译至node.exe中
    将odbc扩展编译至nodejs程序集中
    微信小程序数据传递基本
    Java环境配置
    Angular环境配置
    mysql中常用的数据类型
    html中a标签的4个伪类样式
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6722145.html
Copyright © 2011-2022 走看看