Android获取Bitmap网络图片类型

简介: Android获取Bitmap网络图片类型

常见的获取图片格式的方式

Android中常见的图片格式有png、jpeg(jpg)、gif、webp,不同格式的图片,那么如何获取图片类型呢?

常见的有两种方式,一种是在Bitmap加载过程中,通过BitmapFactory.Options#outMimeType来获取图片对应的格式,另一种是通过文件头信息来判断。

效果图:

jpeg

png

gif

webp

具体实现

因为我们这里针对的是网络图片,所以第一步是将图片下载到本地。

通过[BitmapFactory.Options#outMimeType]获取图片格式

接着我们可以通过BitmapFactory.decodeFile(String pathName, Options opts)方法,从opts中获取对应的outMimeType,然后根据outMimeType即可判断对应的类型了。

具体代码如下:

Observable.create<File> {
    val fileTask = Glide.with(this)
        .asFile()
        .load(jpgUrl)
        .submit()
    val file = fileTask.get()
    it.onNext(file)
    it.onComplete()
}
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .map {
        ivJpeg.setImageBitmap(BitmapFactory.decodeFile(it.absolutePath))
        it
    }
    .observeOn(Schedulers.io())
    .map({
        getBmpTypeByOptions(it.absolutePath)
    })
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(object : Observer<String> {
        override fun onComplete() {
            LogUtils.e(TAG, "onComplete")
        }

        override fun onSubscribe(d: Disposable?) {
            LogUtils.e(TAG, "onSubscribe")
        }

        override fun onNext(t: String?) {
            LogUtils.e(TAG, "onNext")
            LogUtils.e(TAG, "onNext mimeType:" + t)
            tvJpegInfoByBmpOptions.text = tvJpegInfoByBmpOptions.text.toString() + t
        }

        override fun onError(e: Throwable?) {
            LogUtils.e(TAG, "onError")
        }

    })

核心代码:

fun getBmpTypeByOptions(filePath: String): String {
    val options = BitmapFactory.Options()
    options.inJustDecodeBounds = true
    BitmapFactory.decodeFile(filePath, options)
    return options.outMimeType
}
通过文件头信息来判断图片格式
Observable.create<File> {
    var fileTask = Glide.with(this)
        .asFile()
        .load(gifUrl)
        .submit()
    val file = fileTask.get()
    it.onNext(file)
    it.onComplete()
}
    .subscribeOn(Schedulers.io())
    .observeOn(Schedulers.io())
    .map({
        FileTypeUtil.getMimeType(it.absolutePath)
    })
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(object : Observer<String> {
        override fun onComplete() {
            LogUtils.e(TAG, "onComplete")
        }

        override fun onSubscribe(d: Disposable?) {
            LogUtils.e(TAG, "onSubscribe")
        }

        override fun onNext(t: String?) {
            LogUtils.e(TAG, "onNext")
            LogUtils.e(TAG, "onNext mimeType:" + t)
            tvGifInfoByHead.text = tvGifInfoByHead.text.toString() + t
        }

        override fun onError(e: Throwable?) {
            LogUtils.e(TAG, "onError")
        }

    })

核心代码在FileTypeUtil中,具体请看FileTypeUtil.java

项目地址

tinyvampirepudge/AndroidStudy

具体页面地址: BitmapTypeActivity.kt

参考

https://my.oschina.net/ososchina/blog/1610685?nocache=1591319567444

相关文章
|
API 数据处理 Android开发
Android网络请求演变:从Retrofit到Flow的转变过程。
通过这个比喻,我们解释了 Android 网络请求从 Retrofit 到 Flow 的转变过程。这不仅是技术升级的体现,更是反映出开发者在面对并发编程问题时,持续探索和迭求更好地解决方案的精神。未来,还会有更多新的技术和工具出现,我们期待一同 witness 这一切的发展。
441 36
|
11月前
|
Web App开发 缓存 JavaScript
Android网络小说阅读器的实现
小说阅读Demo,。此Demo使用Jsoup解析HTML,实现小说数据抓取(数据源自网络),并包含自定义View、六章小说缓存等功能,但未实现下载。项目还包括屏幕适配、字体设置等,借助第三方框架完成优化。以下是主页、详情页、阅读页等界面展示。
329 0
|
机器学习/深度学习 数据采集 算法
基于MobileNet深度学习网络的MQAM调制类型识别matlab仿真
本项目基于Matlab2022a实现MQAM调制类型识别,使用MobileNet深度学习网络。完整程序运行效果无水印,核心代码含详细中文注释和操作视频。MQAM调制在无线通信中至关重要,MobileNet以其轻量化、高效性适合资源受限环境。通过数据预处理、网络训练与优化,确保高识别准确率并降低计算复杂度,为频谱监测、信号解调等提供支持。
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
486 15
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
295 20
Android经典面试题之图片Bitmap怎么做优化
|
机器学习/深度学习 算法 数据安全/隐私保护
基于深度学习网络的宝石类型识别算法matlab仿真
本项目利用GoogLeNet深度学习网络进行宝石类型识别,实验包括收集多类宝石图像数据集并按7:1:2比例划分。使用Matlab2022a实现算法,提供含中文注释的完整代码及操作视频。GoogLeNet通过其独特的Inception模块,结合数据增强、学习率调整和正则化等优化手段,有效提升了宝石识别的准确性和效率。
|
存储 安全 物联网
计算机网络的类型
本文介绍了网络的分类,涵盖按覆盖范围(PAN、LAN、MAN、WAN)、使用场景(公网、外网、内网)、传输介质(有线、无线)、特殊类型(VLAN、SAN、网络桥接、接入网)及拓扑结构(总线型、星型、树型、环型、网状型)和交换方式(电路交换、报文交换、分组交换)等,详细阐述了各类网络的特点和技术。
1920 2
|
安全 Linux 网络安全
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息。本文分三部分介绍 nmap:基本原理、使用方法及技巧、实际应用及案例分析。通过学习 nmap,您可以更好地了解网络拓扑和安全状况,提升网络安全管理和渗透测试能力。
951 5
|
网络协议 Shell 网络安全
解决两个 Android 模拟器之间无法网络通信的问题
让同一个 PC 上运行的两个 Android 模拟器之间能相互通信,出(qiong)差(ren)的智慧。
382 3
|
负载均衡 5G UED
蜂窝网络中的切换(Handover)及其类型详解
蜂窝网络中的切换(Handover)及其类型详解
2135 12

热门文章

最新文章