重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
图片有三种存在形式:硬盘上时是file,网络传输时是stream,内存中是stream或bitmap,所谓的质量压缩,它其实只能实现对 file的影响,你可以把一个file转成bitmap再转成file,或者直接将一个bitmap转成file时,这个最终的file是被压缩过的,但 是中间的bitmap并没有被压缩(或者说几乎没有被压缩,我不确定),因为bigmap在内存中的大小是按像素计算的,也就是width * height,对于质量压缩,并不会改变图片的像素,所以就算质量被压缩了,但是bitmap在内存的占有率还是没变小,但你做成file时,它确实变小 了;
创新互联长期为成百上千客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为秀英企业提供专业的成都网站制作、网站设计,秀英网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。
而尺寸压缩由于是减小了图片的像素,所以它直接对bitmap产生了影响,当然最终的file也是相对的变小了;
private
void
small()
{
int
bmpWidth=bmp.getWidth();
int
bmpHeight=bmp.getHeight();
Log.i(TAG,
"bmpWidth
=
"
+
bmpWidth
+
",
bmpHeight
=
"
+
bmpHeight);
/*
设置图片缩小的比例
*/
double
scale=0.8;
/*
计算出这次要缩小的比例
*/
scaleWidth=(float)
(scaleWidth*scale);
scaleHeight=(float)
(scaleHeight*scale);
/*
产生reSize后的Bitmap对象
*/
Matrix
matrix
=
new
Matrix();
matrix.postScale(scaleWidth,
scaleHeight);
Bitmap
resizeBmp
=
Bitmap.createBitmap(bmp,0,0,bmpWidth,
bmpHeight,matrix,true)
1. BitmapFactory.Options
options.inSampleSize,它的取值应该是2的次方:1、2、4、8…
表示宽高都是原来的1/1, 1/2, 1/4, 1/8…
如果设置的值 1,那么效果就和 =1是一样的
再调用BitmapFactory的相关decode方法,传入options参数,即可得到一张缩小后的图片。
附上一段计算inSampleSize的方法:
static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height reqHeight || width reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; while ((halfHeight / inSampleSize) reqHeight
(halfWidth / inSampleSize) reqWidth) {
inSampleSize *= 2;
}
} return inSampleSize;
}
2. Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
以source的x,y为起点,宽w高h的范围,进行matrix变化。
这里只讨论缩放,那么matrix肯定是添加了scale操作。
要注意的是这里的参数x、y、width、height都是相对于source原图的。
如果x=y=0; w=source.getWidth()/2, h=source.getHeight()/2;scale=2;
那么最后的效果,只是取原图的左上四分之一的部份…并对这部份进行2倍放大
3. Bitmap.createScaledBitmap(bitmap, w, h, boolean filter);
以w,h为目标对bitmap进行缩放,filter表示是否要对位图进行过滤(滤波)处理
这个方法的效果就类似于ImageView.ScaleType.FIT_XY
scaleType:CENTER /center 在视图中心显示图片,并且不缩放图片CENTER_CROP / centerCrop 按比例缩放图片,使得图片长 (宽)的大于等于视图的相应维度CENTER_INSIDE / centerInside 按比例缩放图片,使得图片长 (宽)的小于等于视图的相应维度FIT_CENTER / fitCenter 按比例缩放图片到视图的最小边,居中显示FIT_END / fitEnd 按比例缩放图片到视图的最小边,显示在视图的下部分位置FIT_START / fitStart 把图片按比例扩大/缩小到视图的最小边,显示在视图的上部分位置FIT_XY / fitXY 把图片不按比例缩放到视图的大小显示MATRIX / matrix 用矩阵来绘制 到安卓巴士网站查看回答详情
带,但同时你也要自己写事件监听,有方法可以实现。可以直接调用.流程是得到一个view,然后view.setImageMatrix(Matrix m).然后创建一个matrix,matrix.postScale(s1,s2,x,y);s1,s2是横向缩放比例,s2是纵向缩放比例,x,y是中心点的坐标。缩放比例大于1,就是放大,小于1是缩小 .
用matrix类进行缩放 然后canvas画出来好了
1.使用的图片最好用png格式
2.如果你的图片仍然大的话可以在项目里面点击右键选择convert to Webp,转成webp格式图片可以变小很多!