图片pixelMap传到native层,进行旋转、缩放

图片pixelMap传到native层,进行旋转、缩放

HarmonyOS
2024-05-21 22:11:22
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
克里斯蒂东

本文主要介绍Ark层将pixelMap数据传到native层做出修改,在ui层进行展示。主要是了解如何使用Native Image接口

相关核心API

Image

NativeWindow

核心代码介绍

1.创建pixelMap数据

async 
aboutToAppear() { 
  let resourceManager = getContext(this).resourceManager 
  let imageArray = await resourceManager.getMediaContent($r('app.media.beer')); 
  let imageResource = image.createImageSource(imageArray.buffer); 
  let opts: image.DecodingOptions = { editable: true } 
  this._pixelMap = await imageResource.createPixelMap(opts); 
}

2.注册Native,暴露方法

static 
napi_module 
demoModule = { 
  . 
  nm_version = 1, 
  . 
  nm_flags = 0, 
  . 
  nm_filename = nullptr, 
  . 
  nm_register_func = Init, 
  . 
  nm_modname = "entry", 
  . 
  nm_priv = ((void *) 
  0 
  ), 
  . 
  reserved = { 0 }, 
}; 
extern 
"C" 
__attribute__((constructor)) 
void RegisterEntryModule(void) { 
  napi_module_register( & demoModule 
  ) 
  ; 
} 
 
static 
napi_value 
Init(napi_env 
env, napi_value 
exports 
) 
{ 
  napi_property_descriptor 
  desc[] = { 
    { 
    "transform", 
    nullptr, 
    Transform, 
    nullptr, 
    nullptr, 
    nullptr, 
    napi_default, 
    nullptr 
  }, 
} 
; 
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 
return exports; 
}

3.在CMakeLists.txt添加依赖

target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so libpixelmap_ndk.z.so)

4.对 PixelMap 数据进行处理。

napi_value Transform(napi_env env, napi_callback_info info) { 
    napi_value thisVar = nullptr; 
    napi_value argValue[1] = {0}; 
    size_t argCount = 1; 
 
    if (napi_get_cb_info(env, info, &argCount, argValue, &thisVar, nullptr) != napi_ok || argCount < 1 || 
        argValue[0] == nullptr) { 
        return nullptr; 
    } 
    napi_value result = nullptr; 
    napi_get_undefined(env, &result); 
 
    // 初始化PixelMap对象数据。 
    NativePixelMap *native = OH_PixelMap_InitNativePixelMap(env, argValue[0]); 
    if (native == nullptr) { 
        return result; 
    } 
 
    // 获取图片信息。 
    struct OhosPixelMapInfos pixelmapInfo; 
    OH_PixelMap_GetImageInfo(native, &pixelmapInfo); 
 
    // 获取PixelMap对象每行字节数。 
    int32_t rowBytes; 
    OH_PixelMap_GetBytesNumberPerRow(native, &rowBytes); 
 
    // 获取PixelMap对象是否可编辑的状态。 
    int32_t editable = 0; 
    OH_PixelMap_GetIsEditable(native, &editable); 
 
    // 获取PixelMap对象是否支持Alpha通道。 
    int32_t supportAlpha = 0; 
    OH_PixelMap_IsSupportAlpha(native, &supportAlpha); 
 
    // 设置PixelMap对象的Alpha通道。 
    int32_t alphaAble = 0; 
    OH_PixelMap_SetAlphaAble(native, alphaAble); 
 
    // 获取PixelMap对象像素密度。 
    int32_t densityG; 
    OH_PixelMap_GetDensity(native, &densityG); 
 
    // 设置缩放比例。 
    // scaleX: 宽为原来的0.5。 
    // scaleY: 高为原来的0.5。 
    float scaleX = 0.1; 
    float scaleY = 0.1; 
    OH_PixelMap_Scale(native, scaleX, scaleY); 
 
 
    // 设置顺时针旋转90度。 
    float angle = 90; 
    OH_PixelMap_Rotate(native, angle); 
 
    void *pixelAddr = nullptr; 
    OH_PixelMap_AccessPixels(native, &pixelAddr); 
 
    // 释放PixelMap对象数据的内存锁。 
    OH_PixelMap_UnAccessPixels(native); 
 
    return result; 
}

5.展示图片

if (this.with!=0) { 
  Image(this._pixelMap) 
    .width(this.with) 
    .height(this.hight) 
}else { 
  Image(this._pixelMap) 
}

实现效果

适配版本信息

IDE:DevEco Studio 4.0.1.501

SDK:HarmoneyOS 4.0.0.38

分享
微博
QQ
微信
回复
2024-05-22 20:47:24
相关问题
从本机获取图片进行传到spring后端
2294浏览 • 1回复 待解决
PixelMap数据处理(Native)
1101浏览 • 1回复 待解决
如何实现图片裁剪、旋转
350浏览 • 1回复 待解决
如何在native获取屏幕亮度
1772浏览 • 1回复 待解决
native创建socket异常
313浏览 • 1回复 待解决
如何将点击事件透传到下一
1806浏览 • 1回复 待解决
HarmonyOS native是否支持curl和openSSL
273浏览 • 1回复 待解决
native多进程场景的调试
240浏览 • 1回复 待解决
如何在Native加载so库
1023浏览 • 1回复 待解决
PixelMap怎么保存成图片文件
301浏览 • 1回复 待解决
如何用PixelMap处理图片
1679浏览 • 1回复 待解决
Native Image模块API-OH_PixelMap_CreatePixelMap
1598浏览 • 1回复 待解决
通过Native 调用c++实现文本绘制
887浏览 • 1回复 待解决
HarmonyOS Native获取应用路径的方式
282浏览 • 1回复 待解决
HarmonyOS获取图片旋转值一直报错
352浏览 • 1回复 待解决