一.图像的两种分类
位图:也被称为点阵图像或者绘制图像,是由像素的一系列单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,从而使得线条和形状显得参差不齐。
矢量图:也被称为面向对象的图像或绘图图像,在数学上定义为一系列由先连接的点。也就是常说的数学函数的轨迹。
二.图像的加载
1.普通图片加载到内存
先将一张小图片拷贝到内存卡中,布局就一个ImageView和Button,点击Button加载出图像。
Button的点击事件:
public void loadImage(View view){
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
String path=Environment.getExternalStorageDirectory()+"/img_small_1.jpg";
Bitmap bitmap =BitmapFactory.decodeFile(path);
iv.setImageBitmap(bitmag);
}
}
2.大图片加载
如今的图片像素往往比手机屏幕还要大,若是将大图片显示到这样的手机屏幕上容易内存溢出(以前),而且还不能完美的展示图片的精度。这里涉及到一个加载大图片需要用到的“采样率”。
我们需要先获取当前设备的屏幕信息,再获取需要加载的图片的大小,计算出采样率,加载图片。
public void loadImage(View view){
if(Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED)){
String path=Environment.getExternalStorageDirectory()+"/img_big_1.jpg";
Options options=new Options();
//设置图片的采样率
//获取屏幕的宽高
WindowManager windowManager=(WindowManager) getSystemService(WINDOW_SERVICE);
// int screenwidth=windowManager.getDefaultDisplay().getWidth();
// int screenheigh=windowManager.getDefaultDisplay().getHeight();
Display display=windowManager.getDefaultDisplay();
Point point=new Point();
display.getSize(point);
int screenWidth=point.x;
int screenHeigh=point.y;
System.out.println(screenWidth);
System.out.println(screenHeigh);
//获取原图的宽高
try {
ExifInterface exifInterface=new ExifInterface(path);
int imageWidth=exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, 0);
int imageHeigth=exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, 0);
int sampleWidth=(int)(imageWidth*1.0f/screenWidth+0.5f);//加0.5就是为了四舍五入
int sampleHeight=(int)(imageHeigth*1.0f/screenHeigh+0.5f);
int sample=(int)(Math.sqrt(sampleWidth*sampleWidth+sampleHeight*sampleHeight)+0.5f);//采样率公式
options.inSampleSize=sample;//原宽*1/4,原长*1/4
Bitmap bitmap=BitmapFactory.decodeFile(path,options);
iv.setImageBitmap(bitmap);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
options.inSampleSize=2;//原宽*1/4,原长*1/4
}
}
三.图像的操作处理
首先先讲一下如何画出和原来图像一模一样的图片:
private ImageView iv;
//图纸
private Bitmap baseBitmap,copyBitmap;
//画板
private Canvas canvas;
//画笔
private Paint paint;
public void btn(View view){
//拿到原图
baseBitmap =BitmapFactory.decodeResource(getResources(), R.drawable.img_small_1);
//先拿到一张与原图大小一样的纸
copyBitmap=Bitmap.createBitmap(baseBitmap.getWidth(),baseBitmap.getHeight(),baseBitmap.getConfig());
//将这张纸固定在画板上
canvas=new Canvas(copyBitmap);
//找画笔
paint=new Paint();
//按照一定规则处理图片
Matrix matrix=new Matrix();//1:1缩放
matrix.setScale(0.5f, 1.0f);//宽和长不同缩放设置
matrix.setTranslate(100f, 50f);//平移操作设置
canvas.drawBitmap(baseBitmap, matrix, paint);参数分别表示参照图片,处理效果,画笔
//放到组件上
iv.setImageBitmap(copyBitmap);
在Android中对图像进行处理,那么一定用到Matrix这个类。Matrix对图像的处理可分为五种基本变换。
1.图像的缩放处理
matrix.setScale(0.5f, 1.0f);
2.图像的位移处理
matrix.setTranslate(100f, 50f);//图片在画板中移动,原点是左上角,整数表示往右和下方移动
3.图像的旋转处理
1.matrix.setRotate(-45);//顺时针旋转多少度,圆点是左上角,若是要逆时针旋转,角度设置成负数
2.matrix.setRotate(45,baseBitmap.getWidth()/2,baseBitmap.getHeight()/2);//设置以某个圆点顺时针(正数表示顺时针方向)旋转,后边两个参数分别表示x坐标和y坐标
4.图像的镜面处理
matrix.setScale(-1f,1f);//缩放处理,翻转,往左翻了了个(即把宽翻了个个),翻转后图片在画布的左方,需要再次进行平移操作
matrix.postTranslate(baseBitmap.getWidth(),0);//如果要对图片进行多次操作,那么要用postxxx方法,不能直接用setxxx方法追加
5.图像的倒影处理
matrix.setScale(1f,-1f);将图片以y轴进行缩放处理,翻了个个,翻转后图片在画布的上方,需要将其下移操作
matrix.postTranslate(0, baseBitmap.getHeight());
时间: 2024-10-11 05:42:46