Android操作图片
一、图片的一些基础知识:
计算机保存一幅图片,就是保存其每一个像素点上的色彩信息。最高品质就是使用32位保存一个像素的透明度和RGB数据,也就是32位的bmp图片(bitmap位图)。但是这样的图片非常占空间,所以就出现了24位(没有透明度信息),8位(只有黑白两种颜色);还有就是一些压缩的算法,对应的就是JPG,PNG等格式的图片。总结来说就是一幅图片的像素数越多,保存每一个像素信息所使用的容量越多,那么这幅图片就越大。
在内存中打开一幅图片所需的内存空间与图片在磁盘上的大小并不直接相关,而是等于横像素*宽像素*位数。还有一些额外信息。
分辨率指的是单位长度中,所表达或撷取的像素数目。通常有两种衡量标准:摄取时的分辨率,就是拍摄设备等的输入分辨率,单位是ppi;打印时的分辨率,使用的是dpi。普通情况下可以将两者看做是相同的。
参考:http://blog.csdn.net/wuyao721/article/details/5286753.
二、Android加载图片:
Android中显示图片用的是ImageView控件,给其动态设置图片有三种方法:setImageResource,setImageDrawable,setImageBitmap。
①第一个加载图片是在UI(主)线程中的,而后两者是在子线程中进行的
②以上方法最终都直接或间接的调用setImageDrawable。
③一幅图片在内存中占有的大小就是上面红色字所说明的,而在Android系统中,提供给每一个应用所使用的内存大小通常是16M或24M,这时如果有过多的图片就很容易引发OOM (Out Of Memory)
有关三者的区别参考:http://jingyan.baidu.com/article/6525d4b1332117ac7d2e9433.html。
http://www.th7.cn/Program/Android/201311/159566.shtml。
三、操作图片:
上面说到使用setImageBitmap加载图片,需要一个Bitmap类型的参数。这是Android中操作图片的一个重要的类,用BitmapFactory配合Options来获取。
通过一个Bitmap对象的createBitmap方法可以创建一个以此Bitmap为参考的副本,这个方法有多个重载,但是需要注意的是大多返回一个不可修改的Bitmap,有些返回的Bitmap可以修改。操作图片通常是在副本上进行的,而且是在可修改的副本上进行操作,通常是Bitmap.createBitmap(width,height,config),返回的是一个空白的拷贝。
进行图像变换使用的是Matrix对象(矩阵对象),可以改变形状,颜色等
1 import android.media.MediaPlayer; 2 import android.os.Bundle; 3 import android.app.Activity; 4 import android.graphics.Bitmap; 5 import android.graphics.BitmapFactory; 6 import android.graphics.Canvas; 7 import android.graphics.Color; 8 import android.graphics.Matrix; 9 import android.graphics.Paint; 10 import android.view.Menu; 11 import android.view.MotionEvent; 12 import android.view.View; 13 import android.view.View.OnTouchListener; 14 import android.widget.ImageView; 15 16 public class MainActivity extends Activity { 17 private ImageView iv; 18 // 可以修改的位图 19 private Bitmap alertBitmap; 20 private Canvas canvas; 21 22 @Override 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.activity_main); 26 iv = (ImageView) findViewById(R.id.iv); 27 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), 28 R.drawable.pre); 29 30 // 创建一个空白的原图的拷贝 31 alertBitmap = Bitmap.createBitmap(bitmap.getWidth(), 32 bitmap.getHeight(), bitmap.getConfig()); 33 //使用画图API为空白图进行绘制 34 canvas = new Canvas(alertBitmap); 35 Paint paint = new Paint(); 36 paint.setColor(Color.BLACK); 37 canvas.drawBitmap(bitmap, new Matrix(), paint); 38 iv.setImageBitmap(alertBitmap); 39 40 iv.setOnTouchListener(new OnTouchListener() { 41 @Override 42 public boolean onTouch(View v, MotionEvent event) { 43 switch (event.getAction()) { 44 case MotionEvent.ACTION_DOWN:// 手指按下屏幕 45 System.out.println("action down"); 46 break; 47 case MotionEvent.ACTION_MOVE:// 手指在屏幕上移动 48 int x = (int) event.getX(); 49 int y = (int) event.getY(); 50 System.out.println("设置("+x+","+y+")透明颜色"); 51 //1、下面是将触摸点一定范围的点全部变透明,这样效果明显 52 for(int i=-4;i<5;i++){ 53 for(int j=-4;j<5;j++){ 54 //2、这里的异常是处理范围超过控件的范围而报的异常, 55 try{ 56 alertBitmap.setPixel(x+i, y+j, Color.TRANSPARENT); 57 }catch (Exception e) { 58 } 59 } 60 } 61 iv.setImageBitmap(alertBitmap); 62 break; 63 case MotionEvent.ACTION_UP:// 手指离开屏幕 64 MediaPlayer.create(getApplicationContext(), R.raw.higirl).start(); 65 break; 66 } 67 return true;//3、返回true指可以重复循环的处理事件,否则只能处理一个事件(按下/移动/离开) 68 } 69 }); 70 } 71 72 }
参考:http://www.open-open.com/lib/view/open1333418945202.html
http://www.cnblogs.com/igrl/archive/2010/07/30/Bitmap_createBitmap.html。
原文:http://www.cnblogs.com/songfeilong2325/p/4856474.html