Android图片处理(入门)

概述

图片格式概述:

  • BMP:高质量绘图 保证原图质量,用于相机等
    BMP格式图片是有一个一个的像素点组成,每一个像素都是一个颜色.而每一个像素显示的颜色用的二进制位也不相同,这个像素位称之为位深,位深越大,表示每一个像素点所用的二进制位越多,显示的图像也就越清晰。
    png:较高质量绘图 体积小,适用于网络传输
    png图片是将bmp图片进行压缩,其压缩格式类似于rar压缩——将相同的byte信息合并表示。png图片可以还原,是无损的压缩方式。
    jpg:良好的绘图质量 体积小,便于传输
    jpg格式图片也是对bmp图片进行压缩,因为眼睛的精度是有限的,jpg利用这一点将很多颜色相近的用同一颜色标识,而对于一大块相同的颜色,则用一个值表示。jpg格式图片不能被还原。

根据图片信息计算图片大小:
(像素长 * 像素宽 * 位深) / 8
普通颜色值是用rgb格式表示一个色值,但是Android中表示色值则使用argb,即多了一个透明度,因此,在计算的时候,若计算机中位深为24,则Android中位深为32

加载大图

/**
 * 将图像加载到内存中
 *     Android为此操作提供了多种输入源:
 * `BitmapFactory.decodeByteArray(data, offset, length);
 *  BitmapFactory.decodeFile(pathName);
 *  BitmapFactory.decodeFile(pathName, opts);
 *  BitmapFactory.decodeStream(is);
 *  等方法,可以根据图片源所在的位置不同使用不同的方法进行加载
 * */
Bitmap bm = BitmapFactory.decodeFile("mnt/sdcard/1.jpg");
//将内存中的图像显示在ImageView控件上
iv.setImageBitmap(bm);

但是上述方法只适合加载比较小的图片,真正加载一张高清大图的时候就会出现内存溢出,解决方案如下:

ImageView iv = (ImageView) findViewById(R.id.iv);
/**
 *  在Android中,每一个应用程序所占用的内存空间大小都会有一个固定的大小限制
 *  假设此处加载的图片是2560*1440像素,图片位深是24的jpg格式图像
 *  虽然此图占用的磁盘空间是1.3M,但图片在加载到内存中时,实际上会先转换成位图图像
 *  那么这张图片加载到内存中的大小就是2560*1440*32(位深24,windows系统中,使用24位字节表示一个颜色值:#000000,
 *  但在Android中,每一个颜色值是用32位字节表示一个颜色值:#00000000),因此,这张图片加载到内存中所需要占用的内存
 *  大小约为:14M,因此,占用内存是极大的.若是直接将图片加载到内存中,容易造成内存溢出
 *  解决方案:按比例压缩图片
 *按比例压缩图片首先就是要获取图片的大小
 * */
String path = "mnt/sdcard/1.jpg";
//用于设置图片渲染器参数

BitmapFactory.Options options = new Options();
//设置图片加载属性:不加载图片内容,只获取图片信息
options.inJustDecodeBounds = true;
//加载图片信息
BitmapFactory.decodeFile(path,options);
//获取图片宽高
int picwidth = options.outWidth;
int picheight = options.outHeight;
//获取屏幕大小
//获取窗口管理器
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);   
//获取默认显示设备
Display dis =wm.getDefaultDisplay();
//获取屏幕宽高
//dis.getSize(outSize);此方法适用于新版本Android系统
int diswidth = dis.getWidth();
int disheight = dis.getHeight();
//计算压缩比
int wr = picwidth/diswidth;
int hr = picheight/disheight;
int  r = 1;
if(wr>hr && wr>1){
  r = wr;
}
if(hr>wr && hr>1){
  r = hr;
}
//压缩图片
options.inSampleSize = r;//设置压缩比
options.inJustDecodeBounds = false;//设置加载图片内容
Bitmap bm = BitmapFactory.decodeFile(path,options);
iv.setImageBitmap(bm);

复制图像

ImageView iv = (ImageView) findViewById(R.id.iv);
/**
 *  复制图片:作用
 *  在Android中,直接从资源文件加载到的图片是不能进行操作的,只能进行显示
 *  想要进行操作,可以复制一张图片到内存,然后操作复制到的图片
 * */
//加载原图
Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/1.jpg");
//搞一个一样大小一样样式的复制图
Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
//获取复制图的画布
Canvas canvas = new Canvas(copybm);
//获取一个画笔,设置颜色
Paint paint = new Paint();
paint.setColor(Color.RED);
//向画布绘制,绘制原图内容
canvas.drawBitmap(bitmap, new Matrix(), paint);
//canvas.drawPoint(10, 10, paint); 向指定位置画一个点
iv.setImageBitmap(copybm);

图片旋转

ImageView iv = (ImageView) findViewById(R.id.iv);
/**
 *     图片旋转:
 *Android中原图是不能进行操作的,必须要先复制一张图到内存,然后再操作
 *旋转是在绘制过程中进行的
 * */
//加载原图
Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/1.jpg");
//搞一个一样大小一样样式的复制图
Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
//获取复制图的画布
Canvas canvas = new Canvas(copybm);
//获取一个画笔,设置颜色
Paint paint = new Paint();
paint.setColor(Color.RED);
//设置图片绘制角度——设置矩阵
Matrix matrix = new Matrix();
     /**       
matrix.setValues(new float[]{//这是矩阵的默认值
1.5f,0,0,
0,1,0,
0,0,1
});
而旋转其实是将每个点坐标和sinx  cosx进行计算...
    */
//安卓提供了便捷方法
matrix.setRotate(30,bitmap.getWidth()/2,bitmap.getHeight()/2);
//向画布绘制,绘制原图内容
canvas.drawBitmap(bitmap, matrix, paint);
//canvas.drawPoint(10, 10, paint); 向指定位置画一个点
iv.setImageBitmap(copybm);

改变图片大小和位置

ImageView iv = (ImageView) findViewById(R.id.iv);
//加载原图
Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/1.jpg");
//搞一个一样大小一样样式的复制图
Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
//获取复制图的画布
Canvas canvas = new Canvas(copybm);
//获取一个画笔,设置颜色
Paint paint = new Paint();
paint.setColor(Color.RED);
//设置图片绘制角度——设置矩阵
Matrix matrix = new Matrix();         
matrix.setValues(new float[]{//这是矩阵的默认值
1,0,0,
0,1,0,
0,0,1
});
/**
位置矩阵计算公式(以默认值为例,计算x、y、z轴的值):
x = 1x+0y+0z;
y = 0x+1y+0z;
z = 0x+0y+1z;
通过改变矩阵值可以修改图片
//图像的缩放也可以使用Android中自带的方法进行设置
matrix.setScale(0.5f, 0.5f);
    */
//向画布绘制,绘制原图内容
canvas.drawBitmap(bitmap, matrix, paint);
iv.setImageBitmap(copybm);

镜像

Matrix matrix = new Matrix();         
matrix.setValues(new float[]{//这是矩阵的默认值
-1,0,0,
0,1,0,
0,0,1
});
//镜像完还要平移回来
matrix.postTranslate(bitmap.getWidth(), 0);
//向画布绘制,绘制原图内容
canvas.drawBitmap(bitmap, matrix, paint);

倒影

Matrix matrix = new Matrix();         
matrix.setValues(new float[]{//这是矩阵的默认值
1,0,0,
0,-1,0,
0,0,1
});
//镜像完还要平移回来
matrix.postTranslate(0, bitmap.getHeight());
//向画布绘制,绘制原图内容
canvas.drawBitmap(bitmap, matrix, paint);
iv.setImageBitmap(copybm);

颜色处理

//加载原图
Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/1.jpg");
//搞一个一样大小一样样式的复制图
Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
//获取复制图的画布
Canvas canvas = new Canvas(copybm);
//获取一个画笔,设置颜色
Paint paint = new Paint();
paint.setColor(Color.RED);
ColorMatrix cm = new ColorMatrix();
cm.set(//默认颜色矩阵,通过修改rgba来对图片颜色进行处理
new float[]{
1,0,0,0,0,
0,1,0,0,0,
0,0,1,0,0,
0,0,0,1,0,
}
);
/*
颜色矩阵计算公式:
red   = 1*128 + 0*128 + 0*128 + 0*0 +0
blue  = 0*128 + 1*128 + 0*128 + 0*0 +0
green = 0*128 + 0*128 + 1*128 + 0*0 +0
alpha = 0*128 + 0*128 + 0*128 + 1*0 +0  透明度
*/
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(bitmap,new Matrix(), paint);
iv.setImageBitmap(copybm);

相关链接:
图片处理(进阶)

如以上内容有任何错误或补充,欢迎加QQ:1195211669 ,验证信息:简书

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容