前言
最近在做鸿蒙原生APP的开发,过程中遇到一个很蛋疼的问题,其提供的Api没有办法做到对图片进行镜像处理。在网上搜了一波,并没有找到有关的解决方案,最接近的也仅仅是利用canvas在展示的时候进行镜像,并不能满足我的需求
由于我项目中需要镜像的图片是byte[]格式的比特流,我一开始想着直接解析比特流自己做镜像,但是在搜索资料的过程中发现使用Android SDK的Api可以很容易实现图片的镜像,于是乎我产生了将Android SDK提供的jar包放到工程中调用Android Api的想法
在鸿蒙项目中添加Android依赖
首先我们下个Android Studio,在其中配置好Android的SDK(没有找到直接下SDK的方法),然后在对应文件夹把android.jar文件复制到鸿蒙项目的libs目录下
然后修改entry gradle的配置文件build.gradle
dependencies {
// implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) // 原来的配置
compileOnlyfileTree(dir:'libs', include: ['*.jar', '*.har']) // 更改后
testImplementation'junit:junit:4.13.1'
ohosTestImplementation'com.huawei.ohos.testkit:runner:2.0.0.400'
}
修改的目的在于不要将整个jar包打包到应用中去,减小冗余
然后我们重新构建一下项目,就可以愉快的在原生鸿蒙应用中使用Android的Api了
图片镜像安卓实现
/**
* 使用Android的api对图片进行处理
*/
publicclassImageUtil {
/**
* 图片的比特流转Bitmap
* @param bytes 图片源比特流
* @return 图片的Bitmap
*/
publicstaticBitmapbyte2Bitmap(byte[] bytes) {
returnBitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
/**
* 将Bitmap保存到文件
* @param bmp
* @param file 保存文件位置
*/
publicstaticvoidBitmapSave(Bitmapbmp, Filefile) {
FileOutputStreamout=null;
try {
out=newFileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch (IOExceptione) {
e.printStackTrace();
}
}
/**
* 对Bitmap进行水平镜像
*
* @param bmp 原图Bitmap
* @return 镜像后的Bitmap
*/
publicstaticBitmapmirror(Bitmapbmp) {
inth=bmp.getHeight();
intw=bmp.getWidth();
Matrixmatrix=newMatrix();
matrix.postScale(-1f, 1f); // 水平镜像翻转
returnBitmap.createBitmap(bmp, 0, 0, w, h, matrix, true);
}
/**
* 对Bitmap进行指定角度的旋转
* @param bmp 原图Bitmap
* @param degree 旋转角度,顺时针
* @return 旋转后的Bitmap
*/
publicstaticBitmaprotate(Bitmapbmp, floatdegree) {
inth=bmp.getHeight();
intw=bmp.getWidth();
Matrixmatrix=newMatrix();
matrix.postRotate(degree); // 旋转指定角度
returnBitmap.createBitmap(bmp, 0, 0, w, h, matrix, true);
}
}