欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android WebP的使用

程序员文章站 2022-06-30 15:24:29
...

参考:https://blog.csdn.net/m13984458297/article/details/70159464

1、webp介绍:

webp是Google于2010年提出了一种新的图片压缩格式 — WebP,给图片的优化提供了新的可能。

WebP为网络图片提供了无损和有损压缩能力,同时在有损条件下支持透明通道。
	据官方实验显示:无损WebP相比PNG减少26%大小;有损WebP在相同的SSIM
	(Structural Similarity Index,结构相似性)下相比JPEG减少25%~34%的大小;
	有损WebP也支持透明通道,大小通常约为对应PNG的1/3。
	
参考:https://blog.csdn.net/f2006116/article/details/53141207

2、github下载webp源码:

      github源码地址:https://github.com/EverythingMe/webp-android

3、android导入webp源码,编译生成.so可用文件:

        (1)、android studio直接open打开下载解压好的 webp-android-master
                    Android WebP的使用
        (2)、由于源码是17年之前搞得,所以gradle需要修改下,不然会报错 

apply plugin: 'com.android.library'

buildscript {
    repositories {
        mavenCentral()
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
        classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1'
    }
}
allprojects {
    repositories {
        mavenCentral()
        google()
        jcenter()
        maven { url 'https://maven.google.com' }
        maven {
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        maven { url "https://jitpack.io" }
    }
}

android {
    compileSdkVersion 26
    buildToolsVersion "28.0.2"

    defaultConfig {
        targetSdkVersion 26
        minSdkVersion 4
        versionCode 1
        versionName "1.0.4"
    }

    sourceSets {
        main {
            jni.srcDirs = []
            jniLibs.srcDirs = ['src/main/libs/']
        }
    }

    archivesBaseName=getName()
    version='1.0.'+(System.getenv('BUILD_NUMBER') ? System.getenv('BUILD_NUMBER') : '0-LOCAL')

    //rename the aar to {archivesBaseName}-{version}.aar
//    libraryVariants.all { variant ->
//        variant.outputs.each { output ->
//            def outputFile = output.outputFile
//            if (outputFile != null && outputFile.name.endsWith('.aar')) {
//                def fileName = "${archivesBaseName}-${version}.aar"
//                output.outputFile = new File(outputFile.parent, fileName)
//            }
//        }
//    }
    libraryVariants.all { variant ->
        variant.outputs.all {
            def fileName = "webp${archivesBaseName}_${version}.aar"
            outputFileName = fileName
        }
    }
}

// call regular ndk-build(.cmd) script from app directory
task ndkBuild(type: Exec) {
    String ndkDir = android.ndkDirectory
    commandLine "$ndkDir/ndk-build", '-j8', '-C', file('src/main/jni').absolutePath
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn ndkBuild
}
task cleanExtra(type: Delete) {
    delete 'src/main/obj'
}
clean.dependsOn(cleanExtra)

group = 'me.everything'

apply plugin: 'com.jfrog.artifactory-upload'
apply plugin: 'android-maven'

        (3)、ndk的版本当前太新会导致编译不成功,我这里下载了一个旧版的来用
        
            # 下载旧版本的ndk来支持webp:https://developer.android.google.cn/ndk/downloads/older_releases.html
            Android WebP的使用
            # 配置android中的local.properties改成下载的ndk路径:
              Android WebP的使用
            # 配置环境变量:
             Android WebP的使用
        (4)、terminal 中cd到jni路径执行命令如下:
            ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk NDK_APPLICATION_MK=./Application.mk

           参考:http://www.bubuko.com/infodetail-3256499.html
            Android WebP的使用

4、android项目使用webp的.so文件:

        (1)、android项目,libs中放入生成的.so文件
        (2)、gradle中添加libs资源路径

android {
	...
	sourceSets {
		main {
			jniLibs.srcDirs = ['libs']//设置目标的so存放路径
		}
	}
}

        (3)、copy源码中的webp工具类:
                WebPDecoder.java/WebpImageView.java
                Android WebP的使用
        (4)、布局中使用:

               Android WebP的使用

5、注意的点:

(1)、android导入源码的时候可能会有错误,需要更新自己的gradle信息

(2)、webp的动图加载,图片兼容框架就只有 fresco 

编译的源码