当前位置:首页 » 安卓系统 » android图片的缩放比例缩放

android图片的缩放比例缩放

发布时间: 2023-03-08 08:35:37

Ⅰ android等比例缩放图片的方法

itmap icon = null;//原始图片
int width = icon.getWidth(), height = icon.getHeight();
float scaleRate = 0.8f;//缩小的比例
while(width >= 300 || width >= 300) {
Matrix matrix = new Matrix();
matrix.postScale(width * scaleRate, height * scaleRate);
// 得到新的图片
Bitmap newIcon = Bitmap.createBitmap(icon, 0, 0, width, height, matrix, true);
icon.recycle();
icon = newIcon;
width = icon.getWidth(), height = icon.getHeight();
}int width = icon.getWidth(), height = icon.getHeight();

if(width > 300 || width > 300) {
float scaleRate = width > height ? 300 / width : 300 / height;
Matrix matrix = new Matrix();
matrix.postScale(width * scaleRate, height * scaleRate);
// 得到新的图片
Bitmap newIcon = Bitmap.createBitmap(icon, 0, 0, width, height, matrix, true);
icon.recycle();
icon = newIcon;
}

Ⅱ Android黑科技,图片终极压缩

一、支持自定义配置、不失真和批量处理

二、图片上传为什么要压缩
1、图片服务器空间限制,磁盘昂贵
2、网络不稳定,大文件需要断点续传
3、尽可能避免安卓OOM异常
4、后台约定的规则<200KB
5、需要上传原图的应用有医院临床项目、金融银行

三、图片压缩流程
1、递归每张图片
2、设置图片格式 Bitmap.CompressFormat.JPG
png, jpg,webp
3、质量压缩bitmap.compress(format,quality,baos)
由于png是无损压缩,所以设置quality无效(不适合作为缩略图)
采样率压缩BitmapFactory.Options.inSampleSize
缩小图片分辨率,减少所占用磁盘空间和内存大小
缩放压缩canvas.drawBitmap(bitmap, null,rectF,null)
减少图片的像素,降低所占用磁盘空间大小和内存大小,可用于缓存缩略图
JNI调用JPEG库
Android的图片引擎使用的是阉割版的skia引擎,去掉了图片压缩中的哈夫曼算法
4、像素修复
5、返回压缩
6、完成压缩

demo: https://github.com/ApeCold/Learn_Compress_Sample

参考:
Luban框架 https://github.com/Curzibn/Luban
缺点
1、当没有设定压缩路径时,抛异常无闪退
2、源码中,压缩比率固定值60,无法修改
3、压缩配置,参数不太适应真实项目需求
4、不能指定压缩大小,比如100KB以内
https://github.com/zettsu/Compressor

Ⅲ android图片太大如何获取图片尺寸然后缩放

用这个方法吧
//加载需要操作的图片,这里是一张图片
bitmap
bitmaporg
=
bitmapfactory.decoderesource(getresources(),r.drawable.r);
//获取这个图片的宽和高
int
width
=
bitmaporg.getwidth();
int
height
=
bitmaporg.getheight();
//定义预转换成的图片的宽度和高度
int
newwidth
=
200;
int
newheight
=
200;
//计算缩放率,新尺寸除原始尺寸
float
scalewidth
=
((float)
newwidth)
/
width;
float
scaleheight
=
((float)
newheight)
/
height;
//
创建操作图片用的matrix对象
matrix
matrix
=
new
matrix();
//
缩放图片动作
matrix.postscale(scalewidth,
scaleheight);

Ⅳ android图片压缩避免OOM

简单吹下牛:很多app都会要加载图片,但是如果不压缩图片就很容易OOM,

个人看来OOM 出现原因总的来说分为两种:

一种是内存溢出(好像在扯淡,OOM本身就是内存溢出)

另一种是:图片过大,一个屏幕显示不完全造成,似乎也是一。。 如有错误纯属扯淡;

为了避免上面的情况:加载图片的时候可以进行压缩,上传的时候要可以进行压缩,在图片不可见的时候进行回收(onDetach()),再吹一句 用了fresco+压缩之后加载图片完全没问题了。

一、质量压缩方法:

privateBitmap compressImage(Bitmap image) {

ByteArrayOutputStream baos =newByteArrayOutputStream();

image.compress(Bitmap.CompressFormat.JPEG,100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中

intoptions =100;

while( baos.toByteArray().length /1024>100) {//循环判断如果压缩后图片是否大于100kb,大于继续压缩

baos.reset();//重置baos即清空baos

image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中

options -=10;//每次都减少10

}

ByteArrayInputStream isBm =newByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中

Bitmap bitmap = BitmapFactory.decodeStream(isBm,null,null);//把ByteArrayInputStream数据生成图片

returnbitmap;

}

二、图片按比例大小压缩方法(根据Bitmap图片压缩)

privateBitmap comp(Bitmap image) {

ByteArrayOutputStream baos =newByteArrayOutputStream();

image.compress(Bitmap.CompressFormat.JPEG,100, baos);

if( baos.toByteArray().length /1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出

baos.reset();//重置baos即清空baos

image.compress(Bitmap.CompressFormat.JPEG,50, baos);//这里压缩50%,把压缩后的数据存放到baos中

}

ByteArrayInputStream isBm =newByteArrayInputStream(baos.toByteArray());

BitmapFactory.Options newOpts =newBitmapFactory.Options();

//开始读入图片,此时把options.inJustDecodeBounds 设回true了

newOpts.inJustDecodeBounds =true;

Bitmap bitmap = BitmapFactory.decodeStream(isBm,null, newOpts);

newOpts.inJustDecodeBounds =false;

intw = newOpts.outWidth;

inth = newOpts.outHeight;

//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为

floathh = 800f;//这里设置高度为800f

floatww = 480f;//这里设置宽度为480f

//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可

intbe =1;//be=1表示不缩放

if(w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放

be = (int) (newOpts.outWidth / ww);

}elseif(w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放

be = (int) (newOpts.outHeight / hh);

}

if(be <=0)

be =1;

newOpts.inSampleSize = be;//设置缩放比例

//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了

isBm =newByteArrayInputStream(baos.toByteArray());

bitmap = BitmapFactory.decodeStream(isBm,null, newOpts);

returncompressImage(bitmap);//压缩好比例大小后再进行质量压缩

}

Ⅳ 图片压缩的三种方式

1、等比压缩,等比压缩是保持原图长宽比例的压缩,只是图片变小,展示的还是原图的所有内容(区别于第二种通过Matrix压缩,可以选取图片的一部分,类似于上传头像时,让你在图上选一块zoom的形式)。等比压缩用的的主要是BitmapFactory.Options,通过options缩放比例的设置,来生成缩略图:

2、通过Matrix进行更加灵活的缩放:这种方式主要是通过构建缩放矩阵和Bitmap.createBitmap方法来实现灵活缩放,宽和高缩放的比例可以不一致,而且通过Bitmap.createBitmap方法创建出来的是新的位图,这个位图可以是选取原图的一部分,而不是对原图进行整体缩放!类似于上传头像时,让你在原图上扣下来一块的效果,控制非常灵活。
3、无损压缩,无损压缩是说图片大小和清晰度看上去和原图没有什么差别,但是确实size缩小了,这里缩小的原理是牺牲了分辨率等其他直观看不到的东西,看起来和原图一样,但是一放大就立马失真了,不会和原图一样放大很多才会逐渐变得不清晰。无损压缩后的图片像素并不会减少,而Bitmap占用内存的定义就是像素点占的内存,所以以Bitmap的方式加载到内存中时,和压缩前占用的内存是同样大的,原来会oom的图片,质量压缩后同样会oom;但是,质量压缩后将流输出到文件中,文件的size会大幅度减小,所以质量压缩特别适合在 Android 端进行图片上传的时候进行图片压缩,既能保持上传后的清晰度,又能减小size。另外质量压缩不是可以无限缩小的,降低到一定程度,就算把quality设置的再小,size也不会再降低了。另外这种方式最好返回保存压缩后的图片保存的文件路径,而不要直接返回Bitmap,示例就懒得改了。

一张图片处理过程,建议先进行等比压缩或者Matrix压缩后,再进行质量压缩,这样组合使用,不管是生成缩略图还是图片上传,效果都不错

Ⅵ Android自定义控件之可平移、缩放、旋转图片控件

先上效果图

源码

单点拖动图片对图片进行平移操作。双手缩放图片大小和旋转图片到一定的角度。图片缩放的时候 不能大于最大的缩放因子和小于最小的缩放因子。大于最大缩放因子或者小于最小缩放因子需要对图像进行回弹。图片旋转的角度只能为90度的倍数,不满足90度要进行回弹。图片回弹要一个渐变的效果。

大体思路: 首先,Android中提供了Matrix类可以对图像进行处理。其次,要显示一张图片最容易想到的就是ImageView。回弹要求渐变的过程,可以通过属性动画进行设置。所以大体的思路是:继承ImageView,重写onTouchEvent()方法,判断事件类型,在对应的事件使用Matrix对图像进行变换。
Matrix是一个已经封装好的矩阵,最重要的作用就是对坐标点进行变换。
举个栗子:
1.某个点(x0,y0,1)通过单位矩阵E映射得到的点还是(x0,y0,1)。

3.点(x0,y0,1)通过矩阵T映射得到的点就会做如下的变换

可以看到点(x0,y0,1)经过T矩阵在x轴方向上平移了dx,在y轴方向上平移了dy。

通过以上的变换可以得到具体的思路: 我们维护一个图像对应的矩阵mCurrentMatrix,该矩阵主要是对ImageView中的图像的各个点进行映射。ImageView在容器位置摆放完成之后,置mCurrentMatrix矩阵为单位矩阵。当onTouchEvent()方法中触发单点触控并且手指进行平移的时候,调用矩阵mCurrentMatrix的postTranslate(dx,dy),对mCurrentMatrix进行变换。当手指抬起,利用变换结束后的矩阵对图像的各个点进行映射,从而得到平移变换后的图像。同理可得,在两只手指进行缩放旋转的时候,我们对矩阵mCurrentMatrix进行各种变换,当缩放旋转的事件结束再利用变换完的矩阵去映射图像的各个点,从而得到缩放、旋转后的图像。

安卓自定义View进阶 - Matrix原理
安卓自定义View进阶 - Matrix详解

首先理清事件的逻辑:

初始化图像大小和位置

缩放图像大小和控件大小自适应,平移图像中心和控件中心重合

onTouchEvent()函数

平移操作

将图像对应的矩阵进行变换。

缩放操作

mBoundRectF为记录图像边界的矩形。缩放的时候选取图像的中心进行缩放。

旋转操作

旋转的时候旋转的旋转中心也是图像的中心

图像中各个点的映射

调用ImageView的setImageMatrix(Matrix matrix)会让ImageView根据设置的matrix去重新绘制图像。

更新图像的矩形边界

获得图像的矩形,并根据矩阵映射矩形各个点的坐标。

缩放回弹

旋转回弹

一些计算方法

要求图像的变换是一个渐变的过程,很容易想到的就是属性动画。因为属性动画本身就是对值进行不断set的过程。而我们维护的矩阵也是一个值,所以很自然可以想到,如果得到回弹之前的矩阵的值以及回弹之后矩阵的值,就可以根据动画监听器中动画当前的系数值去改变矩阵的值。

对animator对象设置完监听器之后,就可以在手指抬起的时候调用属性动画的start()方法开启动画。

自定义可平移、缩放、旋转的控件主要点有两个方面:一是onTouchEvent()中判断平移、旋转、缩放的触发条件,平移位移量、缩放比例因子、旋转角度的计算。二是Matrix矩阵的应用。

Ⅶ android 系统中如何原比例的显示图片

这里面的参数你都试一下,应该有一个可以。x0dx0aImageView的ScaleType属性x0dx0aImageView的属性android:scaleType,即 ImageView.setScaleType(ImageView.ScaleType)属性如下:CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截 取图片的居中部分显示x0dx0aCENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长 (宽)等于或大于View的长(宽)x0dx0aCENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小 或原来的size使得图片长/宽等于或小于View的长/宽x0dx0aFIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示x0dx0aFIT_END / fitEnd 把 图片按比例扩大/缩小到View的宽度,显示在View的下部分位置x0dx0aFIT_START / fitStart 把 图片按比例扩大/缩小到View的宽度,显示在View的上部分位置x0dx0aFIT_XY / fitXY 把图片 不按比例 扩大/缩小到View的大小显示

Ⅷ android中有方法可以对图片进行缩放吗(不是缩放画布,是真的改变了原来图片的大小)

scaleType:CENTER /center 在视图中心显示图片,并且不缩放图片CENTER_CROP / centerCrop 按比例缩放图片,使得图片长 (宽)的大于等于视图的相应维度CENTER_INSIDE / centerInside 按比例缩放图片,使得图片长 (宽)的小于等于视图的相应维度FIT_CENTER / fitCenter 按比例缩放图片到视图的最小边,居中显示FIT_END / fitEnd 按比例缩放图片到视图的最小边,显示在视图的下部分位置FIT_START / fitStart 把图片按比例扩大/缩小到视图的最小边,显示在视图的上部分位置FIT_XY / fitXY 把图片不按比例缩放到视图的大小显示MATRIX / matrix 用矩阵来绘制 到安卓巴士网站查看回答详情>>

Ⅸ android画一张图片,缩放显示并且放大不失真

这个问题涉及图片呈现的一整套方案。归纳而言这个问题是:给定任意尺寸的图片如何在任意尺寸分辨率的机器上显示?并且能够保持图片原来的清晰度。一般采用如下方案来解决这个问题:
1、首先给原图片创建一块内存缓存副本。如果不创建缓存的话,那么任何一次图片的剪切、缩放等操作都将丢失图片信息,使得保持原有图片的滋味那是不可能的。当然对于一般的程序而言,这个操作只需要调用简单的API即可完成。例如Android,只需要创建一个对应图片的Bitmap对象即可。
2、如果想要在设备显示的初始化状态图片即为满屏,那么必须调用相关API动态获得设备的分辨率。然后按设备分辨率的大小对图片进行剪切并显示到设备上。
注意:在获得图片分辨率后,如果分辨率大于图片,那不用说,直接显示图片就好。但是如果小于图片,此时有多种选择。可以将图片缩放至屏幕分辨率(图片纵横比可能失真)也可以选择剪切图片的一部分显示到屏幕上。
3、对图片进行缩放或者移动
我们在图片第一次显示的时候无论是选择缩放还是剪切,都要记录下图片被缩放的比例或者剪辑的范围。这样在用户再次移动或者缩放的时候,根据之前的缩放比例和移动坐标,计算当前应该移动的位置和缩放比例。并且根据计算结果对缓存的图片进行剪辑并显示到屏幕上。
其实整个过程可以概括为如下流程:
——>图片的初始缩放比例和显示起点坐标——>用户触发缩放或者移动操作——>计算新的图片缩放比例和显示起点坐标——>根据新的缩放比例和显示起点坐标剪辑缓存图片并绘制到屏幕上......

热点内容
怎么引入安卓项目 发布:2025-05-14 21:26:39 浏览:823
游戏辅编程 发布:2025-05-14 21:18:49 浏览:686
三菱plc一段二段密码什么意思 发布:2025-05-14 21:17:16 浏览:527
电脑开机密码忘记了怎么破解 发布:2025-05-14 21:09:40 浏览:56
pythondict格式 发布:2025-05-14 21:09:38 浏览:885
落叶片拍摄脚本 发布:2025-05-14 20:40:49 浏览:798
安卓为什么不能用cmwap 发布:2025-05-14 20:40:43 浏览:657
jquery获取上传文件 发布:2025-05-14 20:27:57 浏览:44
云web服务器搭建 发布:2025-05-14 20:25:36 浏览:526
汽修汽配源码 发布:2025-05-14 20:08:53 浏览:743