# 概述
图片格式概述:
BMP:高质量绘图 保证原图质量,用于相机等
BMP格式图片是有一个一个的像素点组成,每一个像素都是一个颜色.而每一个像素显示的颜色用的二进制位也不相同,这个像素位称之为位深,位深越大,表示每一个像素点所用的二进制位越多,显示的图像也就越清晰。 png:较高质量绘图 体积小,适用于网络传输 png图片是将bmp图片进行压缩,其压缩格式类似于rar压缩——将相同的byte信息合并表示。png图片可以还原,是无损的压缩方式。 jpg:良好的绘图质量 体积小,便于传输 jpg格式图片也是对bmp图片进行压缩,因为眼睛的精度是有限的,jpg利用这一点将很多颜色相近的用同一颜色标识,而对于一大块相同的颜色,则用一个值表示。jpg格式图片不能被还原。
## 加载大图
<div class="top-box hide">
<div class="alert-info">
</div>
</div>
```
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); " data-snippet-id=“ext.f5fc8efb9581248b791731039403eb80” data-snippet-saved=“false” data-codota-status=“done”>`ImageView iv = (ImageView) findViewById(R.id.iv); <span class=“hljs-comment”>/**
- 在Android中,每一个应用程序所占用的内存空间大小都会有一个固定的大小限制
- 假设此处加载的图片是2560*1440像素,图片位深是24的jpg格式图像
- 虽然此图占用的磁盘空间是1.3M,但图片在加载到内存中时,实际上会先转换成位图图像
- 那么这张图片加载到内存中的大小就是2560144032(位深24,windows系统中,使用24位字节表示一个颜色值:#000000,
- 但在Android中,每一个颜色值是用32位字节表示一个颜色值:#00000000),因此,这张图片加载到内存中所需要占用的内存
- 大小约为:14M,因此,占用内存是极大的.若是直接将图片加载到内存中,容易造成内存溢出
- 解决方案:按比例压缩图片 *按比例压缩图片首先就是要获取图片的大小
- */</span> String path = <span class=“hljs-string”>“mnt/sdcard/1.jpg”</span>; <span class=“hljs-comment”>//用于设置图片渲染器参数</span>
BitmapFactory.Options options = <span class=“hljs-keyword”>new</span> Options();
<span class=“hljs-comment”>//设置图片加载属性:不加载图片内容,只获取图片信息</span>
options.inJustDecodeBounds = <span class=“hljs-literal”>true</span>;
<span class=“hljs-comment”>//加载图片信息</span>
BitmapFactory.decodeFile(path,options);
<span class=“hljs-comment”>//获取图片宽高</span>
<span class=“hljs-keyword”>int</span> picwidth = options.outWidth;
<span class=“hljs-keyword”>int</span> picheight = options.outHeight;
<span class=“hljs-comment”>//获取屏幕大小</span>
<span class=“hljs-comment”>//获取窗口管理器</span>
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
<span class=“hljs-comment”>//获取默认显示设备</span>
Display dis =wm.getDefaultDisplay();
<span class=“hljs-comment”>//获取屏幕宽高</span>
<span class=“hljs-comment”>//dis.getSize(outSize);此方法适用于新版本Android系统</span>
<span class=“hljs-keyword”>int</span> diswidth = dis.getWidth();
<span class=“hljs-keyword”>int</span> disheight = dis.getHeight();
<span class=“hljs-comment”>//计算压缩比</span>
<span class=“hljs-keyword”>int</span> wr = picwidth/diswidth;
<span class=“hljs-keyword”>int</span> hr = picheight/disheight;
<span class=“hljs-keyword”>int</span> r = <span class=“hljs-number”>1</span>;
<span class=“hljs-keyword”>if</span>(wr>hr && wr><span class=“hljs-number”>1</span>){
r = wr;
}
<span class=“hljs-keyword”>if</span>(hr>wr && hr><span class=“hljs-number”>1</span>){
r = hr;
}
<span class=“hljs-comment”>//压缩图片</span>
options.inSampleSize = r;<span class=“hljs-comment”>//设置压缩比</span>
options.inJustDecodeBounds = <span class=“hljs-literal”>false</span>;<span class=“hljs-comment”>//设置加载图片内容</span>
Bitmap bm = BitmapFactory.decodeFile(path,options);
iv.setImageBitmap(bm);
`
## 复制图像
<div class="top-box hide">
<div class="alert-info">
</div>
</div>
```
`ImageView iv = (ImageView) findViewById(R.id.iv);
<span class="hljs-comment">/**
* 复制图片:作用
* 在Android中,直接从资源文件加载到的图片是不能进行操作的,只能进行显示
* 想要进行操作,可以复制一张图片到内存,然后操作复制到的图片
* */</span>
<span class="hljs-comment">//加载原图</span>
Bitmap bitmap = BitmapFactory.decodeFile(<span class="hljs-string">"/mnt/sdcard/1.jpg"</span>);
<span class="hljs-comment">//搞一个一样大小一样样式的复制图</span>
Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
<span class="hljs-comment">//获取复制图的画布</span>
Canvas canvas = <span class="hljs-keyword">new</span> Canvas(copybm);
<span class="hljs-comment">//获取一个画笔,设置颜色</span>
Paint paint = <span class="hljs-keyword">new</span> Paint();
paint.setColor(Color.RED);
<span class="hljs-comment">//向画布绘制,绘制原图内容</span>
canvas.drawBitmap(bitmap, <span class="hljs-keyword">new</span> Matrix(), paint);
<span class="hljs-comment">//canvas.drawPoint(10, 10, paint); 向指定位置画一个点</span>
iv.setImageBitmap(copybm);
`
## 图片旋转
<div class="top-box hide">
<div class="alert-info">
</div>
</div>
```
`ImageView iv = (ImageView) findViewById(R.id.iv); <span class=“hljs-comment”>/**
图片旋转:
*Android中原图是不能进行操作的,必须要先复制一张图到内存,然后再操作 *旋转是在绘制过程中进行的
- /</span>
<span class=“hljs-comment”>//加载原图</span>
Bitmap bitmap = BitmapFactory.decodeFile(<span class=“hljs-string”>"/mnt/sdcard/1.jpg"</span>);
<span class=“hljs-comment”>//搞一个一样大小一样样式的复制图</span>
Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
<span class=“hljs-comment”>//获取复制图的画布</span>
Canvas canvas = <span class=“hljs-keyword”>new</span> Canvas(copybm);
<span class=“hljs-comment”>//获取一个画笔,设置颜色</span>
Paint paint = <span class=“hljs-keyword”>new</span> Paint();
paint.setColor(Color.RED);
<span class=“hljs-comment”>//设置图片绘制角度——设置矩阵</span>
Matrix matrix = <span class=“hljs-keyword”>new</span> Matrix();
<span class=“hljs-comment”>/*
matrix.setValues(new float[]{//这是矩阵的默认值 1.5f,0,0, 0,1,0, 0,0,1 }); 而旋转其实是将每个点坐标和sinx cosx进行计算… */</span> <span class=“hljs-comment”>//安卓提供了便捷方法</span> matrix.setRotate(<span class=“hljs-number”>30</span>,bitmap.getWidth()/<span class=“hljs-number”>2</span>,bitmap.getHeight()/<span class=“hljs-number”>2</span>); <span class=“hljs-comment”>//向画布绘制,绘制原图内容</span> canvas.drawBitmap(bitmap, matrix, paint); <span class=“hljs-comment”>//canvas.drawPoint(10, 10, paint); 向指定位置画一个点</span> iv.setImageBitmap(copybm); `
## 改变图片大小和位置
<div class="top-box hide">
<div class="alert-info">
</div>
</div>
```
`ImageView iv = (ImageView) findViewById(R.id.iv);
<span class="hljs-comment">//加载原图</span>
Bitmap bitmap = BitmapFactory.decodeFile(<span class="hljs-string">"/mnt/sdcard/1.jpg"</span>);
<span class="hljs-comment">//搞一个一样大小一样样式的复制图</span>
Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
<span class="hljs-comment">//获取复制图的画布</span>
Canvas canvas = <span class="hljs-keyword">new</span> Canvas(copybm);
<span class="hljs-comment">//获取一个画笔,设置颜色</span>
Paint paint = <span class="hljs-keyword">new</span> Paint();
paint.setColor(Color.RED);
<span class="hljs-comment">//设置图片绘制角度——设置矩阵</span>
Matrix matrix = <span class="hljs-keyword">new</span> Matrix();
matrix.setValues(<span class="hljs-keyword">new</span> <span class="hljs-keyword">float</span>[]{<span class="hljs-comment">//这是矩阵的默认值</span>
<span class="hljs-number">1</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,
<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">0</span>,
<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">1</span>
});
<span class="hljs-comment">/**
位置矩阵计算公式(以默认值为例,计算x、y、z轴的值):
x = 1x+0y+0z;
y = 0x+1y+0z;
z = 0x+0y+1z;
通过改变矩阵值可以修改图片
//图像的缩放也可以使用Android中自带的方法进行设置
matrix.setScale(0.5f, 0.5f);
*/</span>
<span class="hljs-comment">//向画布绘制,绘制原图内容</span>
canvas.drawBitmap(bitmap, matrix, paint);
iv.setImageBitmap(copybm);
`
## 镜像
<div class="top-box hide">
<div class="alert-info">
</div>
</div>
```
Matrix matrix = <span class="hljs-keyword">new</span> Matrix(); matrix.setValues(<span class="hljs-keyword">new</span> <span class="hljs-keyword">float</span>[]{<span class="hljs-comment">//这是矩阵的默认值</span> <span class="hljs-number">-1</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>, <span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">0</span>, <span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">1</span> }); <span class="hljs-comment">//镜像完还要平移回来</span> matrix.postTranslate(bitmap.getWidth(), <span class="hljs-number">0</span>); <span class="hljs-comment">//向画布绘制,绘制原图内容</span> canvas.drawBitmap(bitmap, matrix, paint);
## 倒影
<div class="top-box hide">
<div class="alert-info">
</div>
</div>
```
`Matrix matrix = <span class="hljs-keyword">new</span> Matrix();
matrix.setValues(<span class="hljs-keyword">new</span> <span class="hljs-keyword">float</span>[]{<span class="hljs-comment">//这是矩阵的默认值</span>
<span class="hljs-number">1</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,
<span class="hljs-number">0</span>,<span class="hljs-number">-1</span>,<span class="hljs-number">0</span>,
<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">1</span>
});
<span class="hljs-comment">//镜像完还要平移回来</span>
matrix.postTranslate(<span class="hljs-number">0</span>, bitmap.getHeight());
<span class="hljs-comment">//向画布绘制,绘制原图内容</span>
canvas.drawBitmap(bitmap, matrix, paint);
iv.setImageBitmap(copybm);
`
## 颜色处理
<div class="top-box hide">
<div class="alert-info">
</div>
</div>
```
<span class="hljs-comment">//加载原图</span> Bitmap bitmap = BitmapFactory.decodeFile(<span class="hljs-string">"/mnt/sdcard/1.jpg"</span>); <span class="hljs-comment">//搞一个一样大小一样样式的复制图</span> Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); <span class="hljs-comment">//获取复制图的画布</span> Canvas canvas = <span class="hljs-keyword">new</span> Canvas(copybm); <span class="hljs-comment">//获取一个画笔,设置颜色</span> Paint paint = <span class="hljs-keyword">new</span> Paint(); paint.setColor(Color.RED); ColorMatrix cm = <span class="hljs-keyword">new</span> ColorMatrix(); cm.<span class="hljs-built_in">set</span>(<span class="hljs-comment">//默认颜色矩阵,通过修改rgba来对图片颜色进行处理</span> <span class="hljs-keyword">new</span> <span class="hljs-keyword">float</span>[]{ <span class="hljs-number">1</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>, <span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>, <span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>, <span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">0</span>, } ); <span class="hljs-comment">/* 颜色矩阵计算公式: 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 透明度 */</span> paint.setColorFilter(<span class="hljs-keyword">new</span> ColorMatrixColorFilter(cm)); canvas.drawBitmap(bitmap,<span class="hljs-keyword">new</span> Matrix(), paint); iv.setImageBitmap(copybm);
## 圆角图
<div class="top-box hide">
<div class="alert-info">
</div>
</div>
```
`<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Bitmap <span class="hljs-title">getRoundedCornerBitmap</span><span class="hljs-params">(Bitmap bitmap, <span class="hljs-keyword">float</span> roundPx)</span> </span>{
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = <span class="hljs-keyword">new</span> Canvas(output);
<span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> color = <span class="hljs-number">0xff424242</span>;
<span class="hljs-keyword">final</span> Paint paint = <span class="hljs-keyword">new</span> Paint();
<span class="hljs-keyword">final</span> Rect rect = <span class="hljs-keyword">new</span> Rect(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, bitmap.getWidth(), bitmap.getHeight());
<span class="hljs-keyword">final</span> RectF rectF = <span class="hljs-keyword">new</span> RectF(rect);
paint.setAntiAlias(<span class="hljs-keyword">true</span>);
canvas.drawARGB(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(<span class="hljs-keyword">new</span> PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
<span class="hljs-keyword">return</span> output;
}
`
## 图片添加倒影效果
<div class="top-box hide">
<div class="alert-info">
</div>
</div>
```
`<span class=“hljs-comment”>/** * 获得带倒影的图片方法 */</span> <span class=“hljs-function”><span class=“hljs-keyword”>public</span> <span class=“hljs-keyword”>static</span> Bitmap <span class=“hljs-title”>createReflectionImageWithOrigin</span><span class=“hljs-params”>(Bitmap bitmap)</span> </span>{ <span class=“hljs-keyword”>final</span> <span class=“hljs-keyword”>int</span> reflectionGap = <span class=“hljs-number”>4</span>; <span class=“hljs-keyword”>int</span> width = bitmap.getWidth(); <span class=“hljs-keyword”>int</span> height = bitmap.getHeight();
Matrix matrix = <span class="hljs-keyword">new</span> Matrix();
matrix.preScale(<span class="hljs-number">1</span>, -<span class="hljs-number">1</span>);
Bitmap reflectionImage = Bitmap.createBitmap(bitmap, <span class="hljs-number">0</span>, height / <span class="hljs-number">2</span>,
width, height / <span class="hljs-number">2</span>, matrix, <span class="hljs-keyword">false</span>);
Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
(height + height / <span class="hljs-number">2</span>), Config.ARGB_8888);
Canvas canvas = <span class="hljs-keyword">new</span> Canvas(bitmapWithReflection);
canvas.drawBitmap(bitmap, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-keyword">null</span>);
Paint deafalutPaint = <span class="hljs-keyword">new</span> Paint();
canvas.drawRect(<span class="hljs-number">0</span>, height, width, height + reflectionGap, deafalutPaint);
canvas.drawBitmap(reflectionImage, <span class="hljs-number">0</span>, height + reflectionGap, <span class="hljs-keyword">null</span>);
Paint paint = <span class="hljs-keyword">new</span> Paint();
LinearGradient shader = <span class="hljs-keyword">new</span> LinearGradient(<span class="hljs-number">0</span>, bitmap.getHeight(), <span class="hljs-number">0</span>,
bitmapWithReflection.getHeight() + reflectionGap, <span class="hljs-number">0x70ffffff</span>,
<span class="hljs-number">0x00ffffff</span>, TileMode.CLAMP);
paint.setShader(shader);
<span class="hljs-comment">// Set the Transfer mode to be porter duff and destination in</span>
paint.setXfermode(<span class="hljs-keyword">new</span> PorterDuffXfermode(Mode.DST_IN));
<span class="hljs-comment">// Draw a rectangle using the paint with our linear gradient</span>
canvas.drawRect(<span class="hljs-number">0</span>, height, width, bitmapWithReflection.getHeight()
+ reflectionGap, paint);
<span class="hljs-keyword">return</span> bitmapWithReflection;
}
`
## 添加水印
<div class="top-box hide">
<div class="alert-info">
</div>
</div>
```
` <span class="hljs-comment">/**
* create the bitmap from a byte array 生成水印图片
*
* <span class="hljs-doctag">@param</span> src
* 要添加水印的图片
* <span class="hljs-doctag">@param</span> 水印
* <span class="hljs-doctag">@return</span> 添加了水印的图片
*/</span>
<span class="hljs-function"><span class="hljs-keyword">private</span> Bitmap <span class="hljs-title">createBitmap</span><span class="hljs-params">(Bitmap src, Bitmap watermark)</span> </span>{
String tag = <span class="hljs-string">"createBitmap"</span>;
Log.d(tag, <span class="hljs-string">"create a new bitmap"</span>);
<span class="hljs-keyword">if</span> (src == <span class="hljs-keyword">null</span>) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
}
<span class="hljs-keyword">int</span> w = src.getWidth();
<span class="hljs-keyword">int</span> h = src.getHeight();
<span class="hljs-keyword">int</span> ww = watermark.getWidth();
<span class="hljs-keyword">int</span> wh = watermark.getHeight();
<span class="hljs-comment">// create the new blank bitmap</span>
Bitmap newb = Bitmap.createBitmap(w, h, Config.ARGB_8888);<span class="hljs-comment">// 创建一个新的和SRC长度宽度一样的位图</span>
Canvas cv = <span class="hljs-keyword">new</span> Canvas(newb);
<span class="hljs-comment">// draw src into</span>
cv.drawBitmap(src, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-keyword">null</span>);<span class="hljs-comment">// 在 0,0坐标开始画入src</span>
<span class="hljs-comment">// draw watermark into</span>
cv.drawBitmap(watermark, w - ww + <span class="hljs-number">5</span>, h - wh + <span class="hljs-number">5</span>, <span class="hljs-keyword">null</span>);<span class="hljs-comment">// 在src的右下角画入水印</span>
<span class="hljs-comment">// save all clip</span>
cv.save(Canvas.ALL_SAVE_FLAG);<span class="hljs-comment">// 保存</span>
<span class="hljs-comment">// store</span>
cv.restore();<span class="hljs-comment">// 存储</span>
<span class="hljs-keyword">return</span> newb;
}
`
## View转成Bitmap
<div class="top-box hide">
<div class="alert-info">
</div>
</div>
```
` <span class=“hljs-comment”>/** * 把一个View的对象转换成bitmap */</span> <span class=“hljs-function”><span class=“hljs-keyword”>static</span> Bitmap <span class=“hljs-title”>getViewBitmap</span><span class=“hljs-params”>(View v)</span> </span>{
v.clearFocus();
v.setPressed(<span class="hljs-keyword">false</span>);
<span class="hljs-comment">// 能画缓存就返回false</span>
<span class="hljs-keyword">boolean</span> willNotCache = v.willNotCacheDrawing();
v.setWillNotCacheDrawing(<span class="hljs-keyword">false</span>);
<span class="hljs-keyword">int</span> color = v.getDrawingCacheBackgroundColor();
v.setDrawingCacheBackgroundColor(<span class="hljs-number">0</span>);
<span class="hljs-keyword">if</span> (color != <span class="hljs-number">0</span>) {
v.destroyDrawingCache();
}
v.buildDrawingCache();
Bitmap cacheBitmap = v.getDrawingCache();
<span class="hljs-keyword">if</span> (cacheBitmap == <span class="hljs-keyword">null</span>) {
Log.e(TAG, <span class="hljs-string">"failed getViewBitmap("</span> + v + <span class="hljs-string">")"</span>,
<span class="hljs-keyword">new</span> RuntimeException());
<span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
}
Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);
<span class="hljs-comment">// Restore the view</span>
v.destroyDrawingCache();
v.setWillNotCacheDrawing(willNotCache);
v.setDrawingCacheBackgroundColor(color);
<span class="hljs-keyword">return</span> bitmap;
}
`
</div>
</div>
</div>
<!-- 如果是付费文章,未购买,则显示购买按钮 -->
<!-- 连载目录项 -->
<!-- 如果是付费文章 -->
<!-- 如果是付费连载,已购买,且作者允许赞赏,则显示付费信息和赞赏 -->
<div id="free-reward-panel" class="support-author">
</div>
</div>
转自:https://www.jianshu.com/p/fe1955cdbc1f
</div>
💬 评论