NDK ImageDecoder
API มี
API มาตรฐานสำหรับแอป Android C/C++ เพื่อถอดรหัสรูปภาพโดยตรง จำนวนนักพัฒนาแอป
จำเป็นต้องใช้ Java API (ผ่าน JNI) หรือการถอดรหัสรูปภาพของบุคคลที่สามอีกต่อไป
ห้องสมุด API นี้ พร้อมกับฟังก์ชันการเข้ารหัสใน
โมดูลบิตแมปจะเปิดใช้สิ่งต่อไปนี้
- แอปที่มาพร้อมเครื่องและไลบรารีอาจมีขนาดเล็กลงเนื่องจากไม่จำเป็นต้องลิงก์อีกต่อไป ไลบรารีการถอดรหัสของตนเอง
- แอปและไลบรารีจะได้รับประโยชน์โดยอัตโนมัติจากการอัปเดตความปลอดภัยของแพลตฟอร์มเป็น การถอดรหัสไลบรารีไฟล์
- แอปสามารถถอดรหัสรูปภาพไปยังหน่วยความจำที่มีให้ได้โดยตรง จากนั้นแอปสามารถ หลังประมวลผลข้อมูลภาพ (หากต้องการ) และส่งไปยัง OpenGL หรือ แบบ 3 มิติ
หน้านี้จะอธิบายวิธีใช้ API เพื่อถอดรหัสรูปภาพ
ความพร้อมใช้งานและความสามารถ
ImageDecoder
API พร้อมใช้งานในแอปที่กำหนดเป้าหมายเป็น Android 11 (API ระดับ 30)
หรือสูงกว่า การใช้งานจะอยู่ในไฟล์ต่อไปนี้
imagedecoder.h
สำหรับตัวถอดรหัสbitmap.h
สำหรับโปรแกรมเปลี่ยนไฟล์libjnigraphics.so
API รองรับรูปแบบรูปภาพต่อไปนี้
- JPEG
- PNG
- GIF
- WebP
BMP
ICO
WBMP
HEIF
ผลลบดิจิทัล (ผ่าน DNG SDK)
เพื่อให้ครอบคลุมการใช้งานทั้งหมดของรูปภาพดิบที่ถอดรหัสแล้ว API นี้จะไม่ ให้วัตถุระดับสูงขึ้น เช่น วัตถุที่สร้างขึ้นจากรูปภาพที่ถอดรหัสแล้วด้านใน เฟรมเวิร์ก Java เช่น
Drawable
ออบเจ็กต์NinePatch
: หากมีใน ระบบจะไม่สนใจรูปภาพที่เข้ารหัส NinePatch บางส่วน- ความหนาแน่นของบิตแมป:
AImageDecoder
ไม่ได้ทำการปรับขนาดโดยอัตโนมัติตาม ความหนาแน่นของหน้าจอ แต่อนุญาตให้ถอดรหัสเป็นขนาดอื่นได้ผ่านทางAImageDecoder_setTargetSize()
- ภาพเคลื่อนไหว: จะถอดรหัสเฉพาะเฟรมแรกของไฟล์ GIF แบบเคลื่อนไหวหรือ WebP
ถอดรหัสรูปภาพ
การถอดรหัสจะเริ่มต้นด้วยอินพุตบางรูปแบบที่แสดงถึงรูปภาพที่เข้ารหัส
AImageDecoder
ยอมรับอินพุตหลายประเภท:
AAsset
(ดังที่แสดงด้านล่าง)- ข้อบ่งชี้ไฟล์
- บัฟเฟอร์
โค้ดต่อไปนี้แสดงวิธีเปิดรูปภาพ Asset
จากไฟล์และถอดรหัส
จากนั้นจึงกำจัดตัวถอดรหัสและเนื้อหาอย่างเหมาะสม หากต้องการดูตัวอย่างของ
การแสดงภาพที่ถอดรหัสแล้ว ให้ดู
ตัวอย่างกาน้ำชา
AAssetManager* nativeManager = AAssetManager_fromJava(env, jAssets);
const char* file = // Filename
AAsset* asset = AAssetManager_open(nativeManager, file, AASSET_MODE_STREAMING);
AImageDecoder* decoder;
int result = AImageDecoder_createFromAAsset(asset, &decoder);
if (result != ANDROID_IMAGE_DECODER_SUCCESS) {
// An error occurred, and the file could not be decoded.
}
const AImageDecoderHeaderInfo* info = AImageDecoder_getHeaderInfo(decoder);
int32_t width = AImageDecoderHeaderInfo_getWidth(info);
int32_t height = AImageDecoderHeaderInfo_getHeight(info);
AndroidBitmapFormat format =
(AndroidBitmapFormat) AImageDecoderHeaderInfo_getAndroidBitmapFormat(info);
size_t stride = AImageDecoder_getMinimumStride(decoder); // Image decoder does not
// use padding by default
size_t size = height * stride;
void* pixels = malloc(size);
result = AImageDecoder_decodeImage(decoder, pixels, stride, size);
if (result != ANDROID_IMAGE_DECODER_SUCCESS) {
// An error occurred, and the file could not be decoded.
}
// We’re done with the decoder, so now it’s safe to delete it.
AImageDecoder_delete(decoder);
// The decoder is no longer accessing the AAsset, so it is safe to
// close it.
AAsset_close(asset);
// Draw the pixels somewhere
// Free the pixels when done drawing with them
free(pixels);