ResDrawableImgUtil【根据图片名称获取resID值或者Bitmap对象】

article/2025/8/15 16:37:39

版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

根据图片名称获取项目的res/drawable-xxdhpi中相应资源的ID值以及bitmap值的封装类。

效果图

代码分析

根据图片名称获取图片的resID值有两个方案,选其一即可。

使用步骤

一、项目组织结构图

注意事项:

1、导入类文件后需要change包名以及重新import R文件路径

2、Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

将ResDrawableImgUtil.java复制到项目中即可。

package com.why.project.resdrawableimgutildemo.util;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;import com.why.project.resdrawableimgutildemo.R;import java.lang.reflect.Field;/*** @Created HaiyuKing* @Used  根据图片名称获取resID值或者Bitmap对象* @参考资料 http://topmanopensource.iteye.com/blog/1600321* http://blog.csdn.net/wuzhipeng1991/article/details/17374561*/
public class ResDrawableImgUtil {public final static String FILE_EXTENSION_SEPARATOR = ".";//文件扩展名分割器/*** 根据图片名称获取图片的resID值(方案一)* @param imgName 图片名称*/public static int getResourceIdByIdentifier(Context context, String imgName){//判断imgName是否含有后缀int extenPosi = imgName.lastIndexOf(FILE_EXTENSION_SEPARATOR);if(extenPosi != -1){imgName = imgName.substring(0, extenPosi);}int imgResourceId = -1;imgResourceId = context.getResources().getIdentifier(imgName, "drawable" , context.getPackageName());return imgResourceId;}/*** 根据图片名称获取图片的resID值(方案二)* @param imgName 图片名称*/public static int getResourceIdByReflect(String imgName){//判断imgName是否含有后缀int extenPosi = imgName.lastIndexOf(FILE_EXTENSION_SEPARATOR);if(extenPosi != -1){imgName = imgName.substring(0, extenPosi);}int imgResourceId = -1;Class drawable = R.drawable.class;Field field = null;try {field = drawable.getField(imgName);imgResourceId = field.getInt(field.getName());} catch (Exception e) {}return imgResourceId;}/*** 根据图片的resID值获取图片名称* @param imgResId 图片的resID值*/public static String getResourceName(Context context,int imgResId){String imgName = "";imgName = context.getResources().getResourceName(imgResId);return imgName;}/*** 根据图片名称获取图片的Drawable* @param imgName 图片名称*/public static Drawable getDrawableByImgName(Context context, String imgName){//int imgResourceId = R.drawable.ic_launcher;//Eclipse写法int imgResourceId = R.mipmap.ic_launcher;//Android Studio写法imgResourceId = getResourceIdByIdentifier(context,imgName);//解析资源文件夹下,id为resID的图片return ContextCompat.getDrawable(context,imgResourceId);}/*** 根据图片名称获取图片的Bitmap* @param imgName 图片名称*/public static Bitmap getBitmapByImgName(Context context, String imgName){//int imgResourceId = R.drawable.ic_launcher;//Eclipse写法int imgResourceId = R.mipmap.ic_launcher;//Android Studio写法imgResourceId = getResourceIdByIdentifier(context,imgName);//解析资源文件夹下,id为resID的图片return BitmapFactory.decodeResource(context.getResources(),imgResourceId);}}

注意:黄色标记的地方,分别为Eclipse何Android studio两个开发环境下的写法。

三、使用方法

package com.why.project.resdrawableimgutildemo;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;import com.why.project.resdrawableimgutildemo.util.ResDrawableImgUtil;public class MainActivity extends AppCompatActivity {private Button btn_getId;private TextView tv_show;private ImageView img_show;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initViews();initEvents();}private void initViews() {btn_getId = (Button) findViewById(R.id.btn_getId);tv_show = (TextView) findViewById(R.id.tv_show);img_show = (ImageView) findViewById(R.id.img_show);}private void initEvents() {btn_getId.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String imgName = "icon.png";int resId = ResDrawableImgUtil.getResourceIdByIdentifier(MainActivity.this,imgName);tv_show.setText(tv_show.getText().toString() + resId);if(resId != -1){img_show.setBackgroundResource(resId);}}});}}

混淆配置

参考资料

Android根据图片文件名获取它的资源ID 的两种方式

Android中,根据图片名称获取res文件夹中的图片

项目demo下载地址

https://github.com/haiyuKing/ResDrawableImgUtilDemo


http://chatgpt.dhexx.cn/article/bjxU44UM.shtml

相关文章

Android - Context中的getText(int resId)方法和getString(int resId)方法的区别

Android开发中,经常在Activity中使用getText(int resId)和getString(int resId)这两个方法,那么这两个方法有什么区别和联系呢? 这两个方法的参数都是资源ID,区别在于getText(int resId)返回的是一个CharSequence,而ge…

Resources类中getString (int ResID)与getText (int ResID)的区别

Resources类中getString (int ResID)与getText (int ResID)的区别 getString (int ResID)和getText (int ResID)都是Resources类中方法,都是获取资源文件中的字符串资料。 getString (int ResID):是获得资源文件的字符串资源(XML文件中Strin…

【Redis】5. Resid数据类型综合实践案例

Resid数据类型综合实践案例 业务场景 1.计数器 解决方案 设计计数器,记录调用次数,用于控制业务执行次数。以用户id作为key,使用此时作为value在调用前获取次数,判断是否超过限定次数,不超过次数的情况下,每次调用计…

springboot打成jar后获取resources下文件失败, cannot be resolved to absolute file path because it does not resid

读取resources下的文件quotaShow.jasper 本地开发环境能正常下载: ClassPathResource resource new ClassPathResource("jasper" File.separator "quotaShow.jasper"); reportFile resource.getFile(); 打jar包发布至linux服务器时报错&am…

Resid作为缓存可能遇到的问题

1.缓存的执行流程 前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。 [外链图片转存失败,源站可能有…

动态修改android中的资源索引resId

目录 一、引言 1、为什么要动态修改资源索引 2、怎么修改资源索引 3、什么时候修改 二、处理Task及R文件 1、处理Task 2、修改R文件 三、处理编译后的二进制文件 1、编译后的文件在哪? 2、解压、压缩AP_文件 3、修改resources.arsc文件的pkgId 4、修改Xm…

Redis安装(Windows环境)

文章目录 一、Resid简介:二、下载Redis三、启动Redis服务四、设置Windows服务五、常用的Redis服务命令六、cmd启动服务:七、操作测试Redis 一、Resid简介: Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分…

Resid总结

Redis是什么? Redis:REmote DIctionary Server(远程字典服务器) 是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数…

Redis系列(一):各大厂都在用的Resid到底是什么?

一、redis是什么? 1.Redis的定义 先上一段官方定义:Redis 是开源免费(遵守BSD协议)、高性能的key-value数据库。 是不是觉得上面的一句话既熟悉又陌生,作者怎么想的为啥开源免费?BSD协议又是什么&#x…

opencv 实现图像高斯金字塔

函数: dst cv.pyrDown( src[, dst[, dstsize[, borderType]]] ) # 高斯金字塔下采样 参数: src 源图像. dst 输出图像;它有着指定的大小,和源图像有着相同的类型. dstsize 输出图像的大小. borderType 像素外延方法. 默认情况下&…

图像增强中的高斯金字塔/拉普拉斯金字塔 融合

1.高斯金字塔 注意区分:高斯金字塔层级越高,分辨率越低。但下层(第i层)得到上层(第i1层)的过程叫做下采样,有些地方用reduce描述这个过程。 图像的金字塔化过程实际上是先平滑、再下采样的过程…

python --opencv图像处理金字塔(高斯金字塔、拉普拉斯金字塔)

引言 前面的文章中,我们有用过图像方法或者缩小的函数 resize() ,这个函数既可以放大图像,也可以缩小图像,其中: 缩小图像:一版使用 CV_INETR_AREA (区域插值)来插值。放大图像&am…

高斯金字塔及拉普拉斯金字塔的Matlab实现

1、高斯金字塔计算步骤 (1)对第 i i i 层图像进行高斯内核卷积; (2)将所有偶数行和列去除(下采样),得到第 i 1 i1 i1 层图像; (3)对原始图像不…

【C++】高斯金字塔和拉普拉斯金字塔原理和实现

【C】高斯金字塔和拉普拉斯金字塔原理和实现 图像中各个像素与其相邻像素之间的有很强的相关性,包含的信息也十分丰富,目标的尺寸有大有小,对比度有强有弱,此时就需要一个“显微镜”或者“望远镜”-----多尺度图像技术。它可以在…

python 高斯金字塔_12、高斯金字塔、拉普拉斯金字塔与图片尺寸缩放(示例代码)...

一、引言 我们经常会将某种尺寸的图像转换为其他尺寸的图像,如果放大或者缩小图片的尺寸,笼统来说的话,可以使用OpenCV为我们提供的如下两种方式: (1)resize函数。这是最直接的方式, (2)pyrUp( )、pyrDown( )函数。即图…

高斯金字塔的构建步骤

转自:https://www.cnblogs.com/starfire86/p/5735061.html SIFT(Scale-Invariant Feature Transform,尺度不变特征转换)在目标识别、图像配准领域具有广泛的应用,下面按照SIFT特征的算法流程对其进行简要介绍对SIFT特征做简要介绍。 高斯金字…

图像处理(九)高斯金字塔及拉普拉斯金字塔

高斯滤波的核就是一个求平均值的卷积核 高斯金字塔也是一个高斯核,只是步长为2,卷积后图片缩小二倍。高斯金字塔的目的是在图像不同大小时可以获得不同的信息,比如说图像较小时可以获得轮廓,图像较大时可以获得细节 使用函数cv2.p…

OpenCV SIFT源码讲解——构建高斯金字塔

目录 一、构建方法 二、函数重要点注释 一、构建方法 高斯金字塔每层图像的尺度为:。理论上金字塔每层图像可以从原图做的高斯滤波得到。但是实际操作中,每组的第一张影像(除第一组)是上一组倒数第三张影像降采样得到&#xff0c…

OpenCV中的图像金字塔(高斯金字塔、拉普拉斯金字塔)

最近在看关于数字图像的知识点,目前在图像金字塔部分,实在是懒得用手作笔记了,就以其中比较出名的“高斯金字塔”和“拉普拉斯金字塔”为例,基于OpenCV的源代码作解析存个档;毕竟属于基础部分,以后有需要就…

python 高斯金字塔_Python OpenCV 之图像金字塔,高斯金字塔与拉普拉斯金字塔

Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。 基础知识铺垫 学习图像金字塔,发现网上的资料比较多,检索起来比较轻松。 图像金字塔是一张图像多尺度的表达,或者可以理解成一张图像不同分辨率展示。 金字塔越底层的…