计算机变现图片的形式:
计算机在表现图像时是以像素点来表示的。每一个像素点代表一个颜色,每一个颜色是由6个十六位进制的数据表示如:0001。所以一个颜色就是6*4bit。所以一个分辨率为240*320的图片实际大小是可以这也计算的:240*320*24bit再进行换算。。。
由于手机分辨率比较低的问题,所以如果高分辨率的图片直接加载到手机中会出现:java.lang.OutOfMemoryError:内存溢出、内存泄露。
解决办法是:根据手机屏幕和原图大小的比例缩放图片。
代码:
//获取ImageView控件
iv=(ImageView) findViewById(R.id.onimage);
//首先获取屏幕的分辨率
WindowManager wm=(WindowManager) getSystemService(WINDOW_SERVICE);
Display ds=wm.getDefaultDisplay();
long width=ds.getWidth();
long height=ds.getHeight();
//获得图片的分辨率
Options opts=new Options();
//如果置为true,表示只绑定图片的大小
opts.inJustDecodeBounds = true;
Bitmap bitmap=BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/nianhui.JPG", opts);
long wid=opts.outWidth;
long hei=opts.outHeight;
//获得屏幕和图片分辨率的比例
int w=(int) (wid/width);
int h=(int) (hei/height);
if(w>=1&&w>h)
{
len=w;
}else if(h>=1&&h>w)
{
len=h;
}
//设置为true表示把图片显示出来
opts.inJustDecodeBounds=false;
//设置缩放比例
opts.inSampleSize=len;
//缩放图片显示到屏幕上
Bitmap bm2=BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/nianhui.JPG", opts);
iv.setImageBitmap(bm2);
在Android的实际开发过程中,我们通常会需要对图形进行其他的处理。如:平移、缩放、倒影、镜面、旋转等。而由于在Android系统中,是不允许直接对原图进行操作的,所以最常用的一种方式是给原图来创建一份副本,这也即使副本操作失败了,也不会影响原图的效果。
那么给图像创建副本的方式及步骤:
1.找到原图:
Bitmap bm=BitmapFactory.decodeResource(getResources(), R.drawable.pre0);
2.参照原图创建一张白纸
Bitmap bitmap=Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
3.参照白纸创建一个画板
Canvas canvas=new Canvas(bitmap);
4.创建一支画笔,并为它设置颜色
Paint paint=new Paint();
paint.setColor(Color.BLACK);
5.在画板上开始画画
//bm表示临摹的原图
//Matrix()操作图形的矩阵对象
//paint画笔
canvas.drawBitmap(bm,new Matrix(), paint);
iv.setImageBitmap(bitmap);
当有了副本之后我们就可以对图片进行操作了。操作的方法是在第4个步骤后面创建一个矩阵对象,然后通过矩阵对象来对图形进行其他操作。例如下面这个平移的方法:
//平移
public void Translate(View view)
{
//1.得到原图
Bitmap bm=BitmapFactory.decodeResource(getResources(), R.drawable.chengbi);
//2.参考原图创建一张白纸
Bitmap bitmap=Bitmap.createBitmap(bm.getWidth()+50, bm.getHeight()+50, bm.getConfig());
//3.参考白纸创建一个画板
Canvas canvas=new Canvas(bitmap);
//4.创建一支画笔,并设置颜色
Paint paint=new Paint();
paint.setColor(Color.BLACK);
//处理图形
Matrix matrix=new Matrix();
//移动图形
matrix.setTranslate(50, 50);
//5.开始在画板上画画
//bm 代表临摹参照的原图
//Matrix 矩阵,处理图形临摹
//paint 画笔
canvas.drawBitmap(bm,matrix, paint);
copyiv.setImageBitmap(bitmap);
}
总结:在Android中操作图形时我们需要谨记2个要素:
1、在Android中不可以直接操作原图,我们只能通过创建副本的方式,来操作图形。
2、Matrix,我们对图形的很多操作,如平移、缩放、倒影、镜面、旋转等。都是通过这个矩阵类来进行操作的。
3、Options,这个类,当我们需要图片的各种信息,比如大小、格式等,需要把opts.inJustDecodeBounds = true;而在处理完图片,需要显示图片之前,需要重新设置这个属性为false:opts.inJustDecodeBounds=false;