Я хочу закодировать Bitmap
в webp на устройстве Android 2.x с помощью libwebp
. Ниже мой тестовый код
public static int createWebPImage(Bitmap bitmap, String outFilePath) {
Log.d(TAG, "create webp image");
ByteBuffer buffer = ByteBuffer.allocateDirect(BitmapCompat.getAllocationByteCount(bitmap));
bitmap.copyPixelsToBuffer(buffer);
return nativeCreateWebPImage(buffer, bitmap.getWidth(), bitmap.getHeight(), outFilePath);
}
И реализация jni
nativeCreateWebPImage(JNIEnv *env, jclass type, jobject directBuffer, jint width, jint height, jstring outFilePath_) {
const char *outFilePath = env->GetStringUTFChars(outFilePath_, 0);
int ret = 0;
FILE* file = NULL;
if ((file = fopen(outFilePath, "w+")) != NULL) {
uint8_t* buffer = (uint8_t *) env->GetDirectBufferAddress(directBuffer);
LOGD("size of the bitmap %lu", (unsigned long) env->GetDirectBufferCapacity(directBuffer));
uint8_t* output = (uint8_t *) malloc((size_t) env->GetDirectBufferCapacity(directBuffer));
size_t n = WebPEncodeRGBA(buffer, width, height, width, 0.9, &output);
if (n <= 0) {
LOGD("webp encode failed");
ret = -1;
} else {
LOGD("write to file");
if (fwrite(output, sizeof(uint8_t), n, file) != n) {
LOGD("write file error");
ret = -1;
}
}
free(output);
fclose(file);
} else {
LOGD("open file error %s", outFilePath);
ret = -1;
}
env->ReleaseStringUTFChars(outFilePath_, outFilePath);
return ret;
}
Результирующий файл был успешно создан, но закодированное изображение было полностью повреждено. Изображение кажется заполненным неправильными данными. Неверные параметры при вызове WebPEncodeRGBA
? Конфигурация растрового изображения — Bitmap.Config.ARGB_8888
.
Как я могу правильно закодировать Bitmap
в webp с помощью вызова API WebPEncodeRGBA
?