首页 > 其他分享 >安卓Android 图片/Bitmap工具类

安卓Android 图片/Bitmap工具类

时间:2024-11-02 11:51:31浏览次数:5  
标签:return 安卓 bitmap BitmapFactory context new Android Bitmap

图片/Bitmap工具类

1、根据uri解码图片,通常用在从相册选择照片

(1)此方法包含了压缩Bitmap,根据目标尺寸缩放等

/**
     * 根据Uri解码图片
     *
     * @param selectedImage 图片的Uri
     * @return 解码后的Bitmap对象
     * @throws FileNotFoundException 如果文件找不到,则抛出此异常
     */
    public static Bitmap decodeUri(Context context, Uri selectedImage) throws FileNotFoundException
    {

        // 解码图片尺寸
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(context.getContentResolver().openInputStream(selectedImage), null, o);

        // 设置目标尺寸
        final int REQUIRED_SIZE = 400;

        // 计算正确的缩放比例,应该是2的幂次方
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;
        while (true) {
            if (width_tmp / 2 < REQUIRED_SIZE
                    || height_tmp / 2 < REQUIRED_SIZE) {
                break;
            }
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }

        // 按照缩放比例解码图片
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        Bitmap bitmap = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(selectedImage), null, o2);

        // 压缩Bitmap以确保其大小不超过1MB
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int quality = 100;
        bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
        while (baos.toByteArray().length > 1024 * 1024 && quality > 10) {
            baos.reset();
            quality -= 10;
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
        }

        // 回收原始Bitmap以释放内存
        if (bitmap != null && !bitmap.isRecycled()) {
            bitmap.recycle();
        }

        // 返回压缩后的Bitmap
        return BitmapFactory.decodeByteArray(baos.toByteArray(), 0, baos.toByteArray().length);
    }

(2)此方法为简单的根据uri解码图片

public static Bitmap getBitmapFromUri(Context context, Uri uri) throws IOException {
        ContentResolver contentResolver = context.getContentResolver();
        InputStream inputStream = contentResolver.openInputStream(uri);
        return BitmapFactory.decodeStream(inputStream);
    }

2、将图片的Bitmap转换为byte类型

public byte[] bitmapToByteArray(Bitmap bitmap) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
        return stream.toByteArray();
    }

3、将图片保存在文件中并返回地址(可用在不同的Activity中传递图片信息,详情请参考:写文章-CSDN创作中心

public static File saveBitmapToFile(Context context, Bitmap bitmap) {
        File imageFile = new File(context.getExternalCacheDir(), "selected_image.jpg");
        try (FileOutputStream fos = new FileOutputStream(imageFile)) {
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush();
            return imageFile;
        } catch (IOException e) {
            Log.e(TAG, "Failed to save bitmap to file: " + e.getMessage());
        }
        return null;
    }

4、将Bitmap转换为Base64字符串

    /**
     * 将Bitmap转换为Base64字符串
     * @param bitmap 要转换的Bitmap对象
     * @return 转换后的Base64字符串
     */
    public static String bitmapToBase64(Bitmap bitmap) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
        byte[] byteArray = byteArrayOutputStream.toByteArray();
        return Base64.encodeToString(byteArray, Base64.DEFAULT);
    }

5、将Bitmap转换为Base64字符串并进行URL编码(需用到上面的方法)

    /**
     *  将Bitmap转换为Base64字符串,并进行URL编码
     * @param bitmap 要转换的Bitmap对象
     * @return 转换后进行URL编码的字符串
     */
    public static String encodeAndPrepareImage(Bitmap bitmap) {
        String base64String = bitmapToBase64(bitmap);
        // 使用兼容的方式进行URL编码
        String encodedString = "";
        try {
            encodedString = URLEncoder.encode(base64String, StandardCharsets.UTF_8.name());
        } catch (UnsupportedEncodingException e) {
            // 处理异常情况
            e.printStackTrace();
        }
        return encodedString;
    }

标签:return,安卓,bitmap,BitmapFactory,context,new,Android,Bitmap
From: https://blog.csdn.net/m0_54198552/article/details/143363757

相关文章

  • 轻松观影,无水印抖音——TikTok for Android v37.1.4 海外版体验
    嘿,各位短视频爱好者!今天我要向大家推荐一个超赞的抖音版本——TikTokforAndroidv37.1.4去除水印海外版。是不是觉得视频上的水印有点碍眼?那就赶快来看看这个版本吧!......
  • 为什么安卓不去掉 Java 语言底层_2
    为什么安卓不去掉Java语言底层?在探讨为什么安卓不去掉Java语言底层时,我们可以立即指出几个核心原因:兼容性保持、开发生态成熟度、跨平台性能。其中,兼容性保持是最为关键的一点。Android平台自推出以来,就大量采用Java语言进行应用开发。这背后不仅仅是因为Java语言的广泛使用......
  • Android使用timer和thread实现定时器
    说明:两种方法实现android定时器,定时执行任务第一种方式:step1:packagecom.example.iosdialogdemo;importandroid.os.Bundle;importandroid.os.Handler;importandroidx.appcompat.app.AppCompatActivity;importjava.util.Timer;publicclassTimerActivityextends......
  • 浅谈android设备sysfs接口硬件调用之手电筒,马达,呼吸灯
    这篇文章我们来介绍下几个sysfs接口的调用。事实上,驱动接口一般有两种方式调用:ioctl()和read()/write()。前一种要么能读懂内核源码,要么照抄strace用户空间驱动得到的调用,因此不做研究。需要注意的是,由于安卓内核碎片化过于严重,各个厂商之间的代码差异过大,因此直接和内核交互来......
  • APP压力测试--Android sdk安装及虚拟机配置
    电脑系统:windows111、Androidsdk的下载安装( https://www.androiddevtools.cn/#google_vignette )如图:Androidsdk工具--SDKTools,选择windows对应的安装包,我下载的.zip包解压zip包(如解压到D盘),解压后目录如图2、AndroidSDKManager配置软件包双击SDKManager.exe‌......
  • 基于node.js+vue基于Android的答疑预约系统的设计与实现前(开题+程序+论文)计算机毕业设
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容选题背景关于答疑预约的研究,现有研究主要集中在传统的线下答疑预约或者基于网页端的答疑预约方式,专门针对基于Android平台的答疑预约系统的研究较少。随着移动设备的......
  • 基于node.js+vue基于Android的服装搭配APP(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于服装搭配的研究,现有研究主要以线下实体店搭配建议或时尚杂志推荐为主,专门针对基于Android平台开发服装搭配APP的研究较少。在国内外,虽然有一些关于......
  • 安卓APP开发中,如何使用加密芯片?
    加密芯片是一种专门设计用于保护信息安全的硬件设备,它通过内置的加密算法对数据进行加密和解密,以防止敏感数据被窃取或篡改。如下图HD-RK3568-IOT工控板,搭载ATSHA204A加密芯片,常用于有安全防护要求的工商业场景,下文将为大家介绍安卓APP开发中,如何使用此类加密芯片。1. Android......
  • Android本地广播工具类
    LocalBroadcastUtilimportandroid.content.BroadcastReceiverimportandroid.content.Contextimportandroid.content.Intentimportandroid.content.IntentFilterimportandroid.os.Bundleimportandroidx.localbroadcastmanager.content.LocalBroadcastManager/**......
  • 安卓dispatchKeyEvent事件
    示例:publicclassMyActivityextendsActivity{@OverridepublicbooleandispatchKeyEvent(KeyEventevent){//检查是否按下了回退键(通常是物理按键或者是导航键)if(event.getKeyCode()==KeyEvent.KEYCODE_BACK){//检查事件类......