1# 图片绘制(C/C++) 2 3<!--Kit: ArkGraphics 2D--> 4<!--Subsystem: Graphics--> 5<!--Owner: @hangmengxin--> 6<!--Designer: @wangyanglan--> 7<!--Tester: @nobuggers--> 8<!--Adviser: @ge-yafang--> 9 10位图是一种用于在内存中存储和表示图像的数据结构,它是一个未经过压缩的像素集合,而JPEG或PNG等图片是压缩格式的,两者并不相同。如果需要将JPEG或PNG绘制到屏幕上,需要先解码成位图格式,具体可参考[图片处理服务(Image Kit)](../media/image/image-overview.md)图片解码相关章节。 11 12 13目前Drawing(C/C++)中位图绘制需要依赖PixelMap,它可以用于读取或写入图像数据以及获取图像信息。详细的API介绍请参考[drawing_pixel_map.h](../reference/apis-arkgraphics2d/capi-drawing-pixel-map-h.md)。 14 15 16有多个API接口可以创建PixelMap,下文以使用OH_Drawing_PixelMapGetFromOhPixelMapNative()为例。 17 18 191. 添加链接库。 20 21 在Native工程的src/main/cpp/CMakeLists.txt,添加如下链接库: 22 23 ```c++ 24 target_link_libraries(entry PUBLIC libnative_drawing.so) 25 target_link_libraries(entry PUBLIC libhilog_ndk.z.so libpixelmap.so) 26 ``` 27 282. 导入依赖的相关头文件。 29 30 ```c++ 31 #include<multimedia/image_framework/image/pixelmap_native.h> 32 ``` 33 343. 创建OH_PixelmapNative像素图对象。 35 36 PixelMap需要从图像框架定义的像素图对象(OH_PixelmapNative)中获取,所以需要先通过OH_PixelmapNative_CreatePixelmap()创建OH_PixelmapNative。该函数接受4个参数,第一个参数为图像像素数据的缓冲区,用于初始化PixelMap的像素。第二个参数是缓冲区长度。第三个参数是位图格式(包括长、宽、颜色类型、透明度类型等)。第四个参数即OH_PixelmapNative对象,作为出参使用。 37 38 ```c++ 39 // 图片宽高 40 uint32_t width = 600; 41 uint32_t height = 400; 42 // 字节长度,RGBA_8888每个像素占4字节 43 size_t bufferSize = width * height * 4; 44 uint8_t *pixels = new uint8_t[bufferSize]; 45 for (uint32_t i = 0; i < width*height; ++i) { 46 // 遍历并编辑每个像素,从而形成红绿蓝相间的条纹 47 uint32_t n = i / 20 % 3; 48 pixels[i*4] = 0x00; 49 pixels[i*4+1] = 0x00; 50 pixels[i*4+2] = 0x00; 51 pixels[i*4+3] = 0xFF; 52 if (n == 0) { 53 pixels[i*4] = 0xFF; 54 } else if (n == 1) { 55 pixels[i*4+1] = 0xFF; 56 } else { 57 pixels[i*4+2] = 0xFF; 58 } 59 } 60 // 设置位图格式(长、宽、颜色类型、透明度类型) 61 OH_Pixelmap_InitializationOptions *createOps = nullptr; 62 OH_PixelmapInitializationOptions_Create(&createOps); 63 OH_PixelmapInitializationOptions_SetWidth(createOps, width); 64 OH_PixelmapInitializationOptions_SetHeight(createOps, height); 65 OH_PixelmapInitializationOptions_SetPixelFormat(createOps, PIXEL_FORMAT_RGBA_8888); 66 OH_PixelmapInitializationOptions_SetAlphaType(createOps, PIXELMAP_ALPHA_TYPE_UNKNOWN); 67 // 创建OH_PixelmapNative对象 68 OH_PixelmapNative *pixelMapNative = nullptr; 69 OH_PixelmapNative_CreatePixelmap(pixels, bufferSize, createOps, &pixelMapNative); 70 ``` 71 724. 创建PixelMap。 73 74 通过OH_Drawing_PixelMapGetFromOhPixelMapNative()函数从OH_PixelmapNative中获取PixelMap。 75 76 ```c++ 77 OH_Drawing_PixelMap *pixelMap = OH_Drawing_PixelMapGetFromOhPixelMapNative(pixelMapNative); 78 ``` 79 805. 绘制PixelMap。 81 82 需要通过OH_Drawing_CanvasDrawPixelMapRect()绘制位图PixelMap。函数接受5个参数,分别为画布Canvas、PixelMap对象、PixelMap中像素的截取区域、画布中显示的区域以及采样选项对象。 83 84 其中采样选项对象(OH_Drawing_SamplingOptions)表示了从原始像素数据(即Bitmap)中采样以生成新的像素值的具体方式,具体可见[drawing_sampling_options.h](../reference/apis-arkgraphics2d/capi-drawing-sampling-options-h.md)。 85 86 ```c++ 87 // PixelMap中像素的截取区域 88 OH_Drawing_Rect *src = OH_Drawing_RectCreate(0, 0, 600, 400); 89 // 画布中显示的区域 90 OH_Drawing_Rect *dst = OH_Drawing_RectCreate(200, 200, 800, 600); 91 // 采样选项对象 92 OH_Drawing_SamplingOptions* samplingOptions = OH_Drawing_SamplingOptionsCreate( 93 OH_Drawing_FilterMode::FILTER_MODE_LINEAR, OH_Drawing_MipmapMode::MIPMAP_MODE_LINEAR); 94 // 绘制PixelMap 95 OH_Drawing_CanvasDrawPixelMapRect(canvas, pixelMap, src, dst, samplingOptions); 96 ``` 97 986. 绘制完成后释放相关对象。 99 100 ```c++ 101 OH_PixelmapNative_Release(pixelMapNative); 102 delete[] pixels; 103 ``` 104 105 绘制效果如下: 106 107  108 109<!--RP1--> 110## 相关实例 111 112针对Drawing(C/C++)的开发,有以下相关实例可供参考: 113 114- [NDKGraphicsDraw (API14)](https://gitcode.com/openharmony/applications_app_samples/tree/master/code/DocsSample/Drawing/NDKGraphicsDraw) 115<!--RP1End-->