官方Api文档:https://android-dot-google-developers.gonglchuangl.net/reference/androidx/heifwriter/package-summary
Android 9(P)新的图片格式HEIF,仅展示使用Bitmap 转 HEIF 格式照片,使用方法
HeifWriterApi heifWriterApi = new HeifWriterApi();
findViewById(R.id.button).setOnClickListener((v) -> {
try {
heifWriterApi.submit(this);
} catch (Exception e) {
throw new RuntimeException(e);
}
});
public class HeifWriterApi {
private static final String TAG = "HeifWriterApi";
private final ExecutorService executorService;
private final Handler handler;
private final Semaphore semaphore = new Semaphore(2, true);
public HeifWriterApi() {
executorService = Executors.newFixedThreadPool(2);
HandlerThread handlerThread = new HandlerThread("HeifEncoderThread", -2);
handlerThread.start();
handler = new Handler(handlerThread.getLooper());
}
public void submit(Context context) {
executorService.submit(() -> {
long eTime = System.currentTimeMillis();
try {
Log.i(TAG, "init2, 1111111111111111111111111 myTid = " + Process.myTid() + ", E");
semaphore.acquire();
String pathA = context.getFilesDir().getPath() + File.separator + "aaaa.heif";
String bitmapPath = context.getFilesDir().getPath() + File.separator + "IMG_20230907_170526.jpg";
//String bitmapPath = context.getFilesDir().getPath() + File.separator + "wallhaven-1pqyyw.jpg";
Bitmap bitmap = BitmapFactory.decodeFile(bitmapPath);
Log.i(TAG, "init2: pathA = " + pathA);
Log.i(TAG, "init2: bitmapPath = " + bitmapPath);
Log.i(TAG, "init2: bitmap w*h = " + bitmap.getWidth() + "*" + bitmap.getHeight());
HeifWriter heifWriter = new HeifWriter.Builder(pathA, bitmap.getWidth(), bitmap.getHeight(), HeifWriter.INPUT_MODE_BITMAP)
.setQuality(85)
//.setHandler(handler)
.build();
heifWriter.start();
heifWriter.addBitmap(bitmap);
heifWriter.stop(0);
heifWriter.close();
} catch (Exception e) {
Log.e(TAG, "init2: ", e);
throw new RuntimeException(e);
} finally {
semaphore.release();
Log.i(TAG, "init2, 1111111111111111111111111 myTid = " + Process.myTid() + ", X time = " + (System.currentTimeMillis() - eTime));
}
});
}
}
log输出
2023-10-21 23:36:18.403 5191-5221 HeifWriterApi com.zyk.android_zhaoyk I init2, 1111111111111111111111111 myTid = 5221, E
2023-10-21 23:36:18.636 5191-5221 HeifWriterApi com.zyk.android_zhaoyk I init2: pathA = /data/user/0/com.zyk.android_zhaoyk/files/aaaa.heif
2023-10-21 23:36:18.637 5191-5221 HeifWriterApi com.zyk.android_zhaoyk I init2: bitmapPath = /data/user/0/com.zyk.android_zhaoyk/files/wallhaven-1pqyyw.jpg
2023-10-21 23:36:18.639 5191-5221 HeifWriterApi com.zyk.android_zhaoyk I init2: bitmap w*h = 3840*2160
2023-10-21 23:36:20.885 5191-5221 HeifWriterApi com.zyk.android_zhaoyk I init2, 1111111111111111111111111 myTid = 5221, X time = 2482
多线程调用,当Bitmap过大的时候可能会出现以下报错
Codec reported err 0xfffffff4/NO_MEMORY, actionCode 0, while in state 5/STARTING
这个错误信息表示编解码器报告了一个内存不足的错误,错误代码为0xffffffff4/NO_MEMORY。在状态5/STARTING时发生了这个错误。
为了解决这个问题,你可以尝试以下方法:
1.使用单线程处理大图格式转换。
2. 关闭其他占用大量内存的程序,以释放更多内存供编解码器使用。
3. 增加系统可用内存,例如通过增加物理内存或调整虚拟内存设置。
4. 如果可能的话,尝试升级硬件设备,以提高内存容量。
Codec reported err 0x80000000/UNKNOWN_ERROR, actionCode 0, while in state 6/STARTED
这个错误信息表示编解码器报告了一个未知错误,错误代码为0x80000000/UNKNOWN_ERROR。在状态6/STARTED时发生了这个错误。
为了解决这个问题,你可以尝试以下方法:
1. 检查你的编解码器是否正确安装和配置。
2. 确保你的系统资源充足,如内存、处理器等。
3. 尝试更新编解码器的驱动程序或软件。
4. 如果问题仍然存在,建议查阅相关文档或寻求技术支持。