图形图像子系统ChangeLog

cl.图形图像.1 Image NDK接口OH_GetImageInfo()、OH_PixelMap_GetImageInfo()变更

访问级别

公开接口

变更原因

Jpeg图片支持硬解码,申请的内存为DMA内存,是一块对齐的内存。因此更改了OH_GetImageInfo()、OH_PixelMap_GetImageInfo()的rowSize计算方式。

变更影响

该变更为非兼容变更,NDK接口OhosPixelMapInfos和OhosPixelMapInfo的rowSize计算方式变化。

API Level

<11>

变更发生版本

从OpenHarmony SDK 4.1.3.1开始。

rowSize组件

变更前:

rowSize,每行的byte数,计算方式:图片的宽 * 每个像素字节数。

变更后:

rowSize,每行的byte数,计算方式:DMA内存为图片的宽 * 每个像素字节数的64倍向上取整(每行末尾会自动补齐);其他内存为图片的宽 * 每个像素字节数。

适配指导

场景:通过NDK接口如OH_PixelMap_AccessPixels(),获取到pixelmap的内存地址,直接操作内存时,需要对rowSize进行适配。

案例1:openCV在处理pixelmap的位图数据时需要通过pixelmap的位图数据构建openCV中的cv::Mat, 需要增加step入参,

变更前:

cv::Mat srv(rows: bitmap.height, cols: bitmap.width, type: CV_8UC4, data: imagePixels);

变更后:

cv::Mat srv(rows: bitmap.height, cols: bitmap.width, type: CV_8UC4, data: imagePixels, step: rowSize);

案例2:拷贝pixelmap的位图数据,需要跳过padding区域。

for (int i = 0; i < imageInfo_.size.height; ++i) {
    errno_t ret = memcpy_s(dst, rowDataSize_, src_ + i * rowStride_, rowDataSize_);
    if (ret != 0) {
        Hilog::Error(LABLE, "read pixels by buffer memcpy the pixelmap data to dst fail, error:%{public}d", ret);
        return ERROR_IMAGE_READ_PIXECLMAP_FAILED;
    }
    dst += rowDataSize_;
}