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

相关文章
|
3月前
|
负载均衡 安全 网络协议
|
22天前
|
网络协议 Shell 网络安全
解决两个 Android 模拟器之间无法网络通信的问题
让同一个 PC 上运行的两个 Android 模拟器之间能相互通信,出(qiong)差(ren)的智慧。
22 3
|
2月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
64 20
Android经典面试题之图片Bitmap怎么做优化
|
3月前
|
安全 网络安全 Android开发
安卓与iOS开发:选择的艺术网络安全与信息安全:漏洞、加密与意识的交织
【8月更文挑战第20天】在数字时代,安卓和iOS两大平台如同两座巍峨的山峰,分别占据着移动互联网的半壁江山。它们各自拥有独特的魅力和优势,吸引着无数开发者投身其中。本文将探讨这两个平台的特点、优势以及它们在移动应用开发中的地位,帮助读者更好地理解这两个平台的差异,并为那些正在面临选择的开发者提供一些启示。
127 56
|
28天前
|
光互联
常见网络电缆类型详解
【10月更文挑战第14天】
54 0
|
2月前
|
负载均衡 5G UED
蜂窝网络中的切换(Handover)及其类型详解
蜂窝网络中的切换(Handover)及其类型详解
205 12
|
3月前
|
数据中心
网络拓扑包括哪些类型?
【8月更文挑战第19天】网络拓扑包括哪些类型?
82 1
|
3月前
网络拓扑有哪些类型?
【8月更文挑战第19天】网络拓扑有哪些类型?
67 1
|
2月前
|
存储 传感器 物联网
|
2月前
|
SQL 安全 网络安全