首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Android】图片处理

【Android】图片处理

作者头像
三三是该溜子
发布2025-07-20 08:43:31
发布2025-07-20 08:43:31
14400
代码可运行
举报
文章被收录于专栏:该溜子的专栏该溜子的专栏
运行总次数:0
代码可运行

三三要成为安卓糕手

一:xml中设置图片

1:xml代码

代码语言:javascript
代码运行次数:0
运行
复制
    <ImageView
        android:layout_width="100dp"
        android:layout_height="150dp"
        android:alpha="0.5"     
        android:scaleType="centerInside"
        android:src="@drawable/bg_bitmap" />

2:效果展示

如果我们仅设置src,可以看到我们的图片与控件的尺寸并不完美匹配,这里我们就得优化一下了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3:代码分析

(1)alpha-透明度

参数0~1,值越小越透明

(2)scaleType

scaleType 本意翻译:缩放类型

控制图片的缩放模式,适应ImageView的边界

参数特性:

scaleType 值

使用

缩放规则

是否保持原图比例

是否裁剪图片

是否可能留白

核心特点

fitXY

强制拉伸图片宽高,使其完全匹配 ImageView 尺寸

❌ 不保持

❌ 不裁剪

❌ 无留白

填满容器但可能导致图片拉伸变形(如宽高比失调)

centerInside

按原图比例缩放,确保图片宽高均不超过 ImageView 尺寸,缩放后居中显示

✅ 保持

❌ 不裁剪

✅ 可能留白

完整显示图片,无变形,但容器与图片宽高比不同时会留空白

centerCrop

按原图比例缩放,使图片宽高至少填满 ImageView 尺寸,超出部分裁剪后居中显示

✅ 保持

✅ 裁剪

❌ 无留白

填满容器且不变形,但可能裁剪图片边缘(优先保证中间内容可见)

center

不缩放图片,直接将原图居中放置在 ImageView 中

✅ 保持(不缩放)

❌ 不裁剪

✅ 可能留白

图片尺寸小于容器时居中显示(留空白),大于容器时仅显示中间部分(等效于不缩放裁剪)

fitStart

按原图比例缩放至完全适配容器(宽或高其一匹配),缩放后靠左上角对齐

✅ 保持

❌ 不裁剪

✅ 可能留白

完整显示且不变形,图片位置靠容器起始端(左上角)

fitEnd

按原图比例缩放至完全适配容器,缩放后靠右下角对齐

✅ 保持

❌ 不裁剪

✅ 可能留白

完整显示且不变形,图片位置靠容器末端(右下角)

fitCenter

按原图比例缩放至完全适配容器,缩放后居中对齐(默认值)

✅ 保持

❌ 不裁剪

✅ 可能留白

完整显示、不变形且居中,是 centerInside 的 “适配容器优先” 版本(可能放大图片)

(3)src

传入参数@drawable/图片名字

二:Android中三种加载图片的方式

0:资源文件的命名

我们一般把图片放到res源文件的drawable文件夹下;

命名规则:必须由小写字母、数字和下划线构成;不能以数字开头,不能有空格和特殊字符,不能有关键字,长度不允许超过255个字符,不要有中文

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
代码语言:javascript
代码运行次数:0
运行
复制
public class ImageViewActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_view);

        /**
         * 三种获取图片的方式
         * 1:图片转drawable,再使用setImageDrawable()
         * 2:直接使用setImageResource(),传参源图片即可
         * 3:获取手机中图片的路径,转化为uri对象,在使用setImageURI()
         */
        ImageView ivTest = findViewById(R.id.iv_test);
        Drawable drawable = ContextCompat.getDrawable(ImageViewActivity.this, R.drawable.icon_face);
        ivTest.setImageDrawable(drawable);


        ivTest.setImageResource(R.drawable.icon_face);


        String path = "/data/data/com.xlong.myapplication/files/icon_face.png";
        Uri uri = Uri.fromFile(new File(path));
        ivTest.setImageURI(uri);
    }
}

1:图片转drawable

(1)xml代码
代码语言:javascript
代码运行次数:0
运行
复制
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/iv_test"/>
(2)java代码
代码语言:javascript
代码运行次数:0
运行
复制
        ImageView ivTest = findViewById(R.id.iv_test);
        Drawable drawable = ContextCompat.getDrawable(ImageViewActivity.this, R.drawable.icon_face);
        ivTest.setImageDrawable(drawable);

解释一下

①获取xml下ImageView对象

②上下文工具类把图片转化为Drawable对象

③把Drawable对象设置给ImageVIew

(3)效果
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
(4)ContextCompat.getDrawable

上下文工具类中的静态方法,获取drawable

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
(5)setImageDrawable

源码这部分咱们也看不懂啊xd,这里右边的图片调用了getDrawable()方法,能看懂一点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2:Res源加载图片

代码语言:javascript
代码运行次数:0
运行
复制
ImageView ivTest = findViewById(R.id.iv_test);
ivTest.setImageResource(R.drawable.icon_face);//拿到资源id对应的图片,在进行设置

这两句代码也很直观,直接获取res下的图片(res下的文件资源在系统加载的时候,会被转化为Drawable对象,可以这么简单的理解)

3:URI加载图片

代码语言:javascript
代码运行次数:0
运行
复制
		ImageView ivTest = findViewById(R.id.iv_test);
		String path = "/data/data/com.xlong.myapplication/files/icon_face.png";
        Uri uri = Uri.fromFile(new File(path));
        ivTest.setImageURI(uri);

在安卓当中去查看手机的文件可以在Device Explorer去查看,这里我们icon_face.png图片放了进去,复制了它的路径作为path

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
(1)源代码

了解即可窝里哇

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三:位图

1:简单介绍

图片的一种:简单记

优点:不会被压缩,细节更丰富,图片更为清晰(其实本质上就是没有被压缩,所以放大后的细节更好)

缺点:占用磁盘空间及运行内存较大(你想嘛,一个像素点就占用1~24个bit,896*1341就问你大不大吧)

加载到手机中,占用的是内存,想想一下子加载个千二八张的,手机直接起飞xd~~

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2:Java加载位图

(1)代码
代码语言:javascript
代码运行次数:0
运行
复制
        ImageView ivTest = findViewById(R.id.iv_test);
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg_bitmap);
        ivTest.setImageBitmap(bitmap);
(2)效果
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3:代码分析

(1)BitmapFactory.decodeResource

BitmapFactory.decodeResource 是 Android 开发中用于从资源中解码出 Bitmap 对象的一个静态方法

decode(解码)

BitmapFactory中有两种加载位图的方法

第一种方式:Resource:传入Resource资源和相应的图片id,系统就能识别到图片并解码成对应的位图

第二种方式:文件,传入图片的路径

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
(2)getResources 方法的作用

通过 getResources() 获取到的 Resources 对象,可用于加载和访问各种资源,在

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4:Drawable和Bitmap对比

特性

Drawable

Bitmap

内存占用

轻量级,仅存储绘制指令(如颜色、形状参数),不直接保存完整像素数据。

重量级,直接存储所有像素信息,占用内存高(尤其大图或高分辨率图像)。

缩放与适配

支持矢量图形(如 VectorDrawable),可无损缩放,完美适配不同屏幕密度。

缩放时易出现模糊(需手动处理多分辨率资源或使用 BitmapFactory 调整采样率)。

状态管理

内置状态切换支持(如 StateListDrawable),自动响应视图状态变化(按下、选中、禁用等)。

需手动编写代码处理不同状态下的图像切换。

动态修改

可在运行时修改属性(颜色、透明度、形状等),无需重建对象。

修改像素需重新创建 Bitmap 或使用 Canvas 绘制,操作复杂。

渲染方式

按需渲染(在绘制时生成像素),适合简单图形和频繁更新的场景。

预加载所有像素,适合静态图像或需要直接操作像素的场景(如图像处理)。

实现形式

多种类型:ColorDrawable、ShapeDrawable、VectorDrawable、NinePatchDrawable 等。

单一类型,直接表示位图数据。

性能开销

渲染简单图形时效率高,GPU 压力小。

渲染大型 Bitmap 时可能导致内存抖动或性能下降。

典型应用场景

图标、背景、状态按钮、动画效果、矢量图形。

相机拍照、图像处理、游戏贴图、复杂图像。

5:总结

上面的表格,看着就头大。

一句话,Drawable 在大多数 UI 场景中直接秒了,Bitmap 在需要直接操作像素的场景中可以Barking一下。

四:创建矢量图

这是一张png的图片,能看到图片中有非常明显的锯齿状纹路,这就是我们要解决的问题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1:矢量图的定义

vector asset [ˈvektə®] [ˈæset]

矢量资源 是一种图形

优势:在不影响图片质量的情况下可伸缩,体积小(减小了安装包的体积)

劣势:安卓5.0以上才支持,兼容性不够;相对于位图,图形细节效果不好(如模糊和阴影)

2:创建方式

一般图片资源都放置在drawable文件夹下

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

两种创建方式;本地会提供一些资源图标供使用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

传入SVG和PSD类型的图片生成矢量图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3:xml代码

实际上就是,在xml文件中定义的一组点线条和曲线及其关联的颜色信息

代码语言:javascript
代码运行次数:0
运行
复制
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="32dp"
    android:height="32dp"
    android:viewportWidth="1024"
    android:viewportHeight="1024">
  <path
      android:pathData="M291.3,396.3c0,29.7 24.1,53.8 53.8,53.8s53.8,-24.1 53.8,-53.8 -24.1,-53.8 -53.8,-53.8 -53.8,24.1 -53.8,53.8zM613.9,396.3c0,29.7 24.1,53.8 53.8,53.8s53.8,-24.1 53.8,-53.8 -24.1,-53.8 -53.8,-53.8 -53.8,24.1 -53.8,53.8zM506.4,772.6c-110.1,0 -206.8,-74.2 -234.5,-181.2 -3.6,-14.8 5.1,-29.7 20,-33.8 14.8,-3.6 29.7,5.1 33.8,20 25.6,100.9 128.5,161.3 228.9,135.7 66.6,-16.9 118.3,-69.1 135.7,-135.7 3.6,-14.8 18.9,-24.1 33.8,-20 14.8,3.6 24.1,18.9 20,33.8 -28.2,108 -126,182.8 -237.6,181.2zM918.5,343c-22.5,-53.2 -54.8,-100.9 -95.7,-141.8S734.2,128 681,105.5c-54.8,-23.6 -113.2,-34.8 -173.6,-34.8s-118.8,11.8 -173.6,34.8C280.6,128 233,160.3 192,201.2S119.8,290.3 97.3,343c-23.6,54.8 -34.8,113.2 -34.8,173.6s11.8,118.8 34.8,173.6c22.5,53.2 54.8,100.9 95.7,141.8s88.6,73.2 141.8,95.7c54.8,23.6 113.2,34.8 173.6,34.8s118.8,-11.8 173.6,-34.8c53.2,-22.5 100.9,-54.8 141.8,-95.7s73.2,-88.6 95.7,-141.8c23.6,-54.8 34.8,-113.2 34.8,-173.6 -1,-59.9 -12.8,-118.3 -35.8,-173.6zM777.7,786.9c-72.2,72.2 -167.9,111.6 -269.8,111.6s-198.1,-39.9 -269.8,-111.6c-72.2,-72.2 -111.6,-167.9 -111.6,-269.8s39.9,-198.1 111.6,-269.8 167.9,-111.6 269.8,-111.6 198.1,39.9 269.8,111.6 111.6,167.9 111.6,269.8 -39.4,197.6 -111.6,269.8z"
      android:fillColor="#bfbfbf"/>
</vector>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一:xml中设置图片
    • 1:xml代码
    • 2:效果展示
    • 3:代码分析
      • (1)alpha-透明度
      • (2)scaleType
      • (3)src
  • 二:Android中三种加载图片的方式
    • 0:资源文件的命名
    • 1:图片转drawable
      • (1)xml代码
      • (2)java代码
      • (3)效果
      • (4)ContextCompat.getDrawable
      • (5)setImageDrawable
    • 2:Res源加载图片
    • 3:URI加载图片
      • (1)源代码
  • 三:位图
    • 1:简单介绍
    • 2:Java加载位图
      • (1)代码
      • (2)效果
    • 3:代码分析
      • (1)BitmapFactory.decodeResource
      • (2)getResources 方法的作用
    • 4:Drawable和Bitmap对比
    • 5:总结
  • 四:创建矢量图
    • 1:矢量图的定义
    • 2:创建方式
    • 3:xml代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档