• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - ANE、iOS 和 BitmapData

[复制链接]
菜鸟教程小白 发表于 2022-12-13 10:15:26 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

是否有任何将位图数据传递到 iOS 并返回修改后副本的示例。我正在尝试将位图转换为 jpeg - 类似于 Windows http://blog.magicalhobo.com/2011/09/12/air-3-native-extension-imagepro 中的此示例cessor/但它每次都崩溃了。

我很确定我做错了一些基本错误但不是 iOS/Objective C 程序员我真的只是在尝试魔法咒语,我找不到任何好的例子。任何帮助表示赞赏?

肖恩

附:以下是我的尝试:

FREObject encodeJPEG(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
  FREObject     objectBitmapData = argv[0];
  FREBitmapData bitmapData;

  FREAcquireBitmapData(objectBitmapData, &bitmapData);

  int width       = bitmapData.width;
  int height      = bitmapData.height;
  int stride      = bitmapData.lineStride32 * 4;
  uint32_t* input = bitmapData.bits32;

  FREReleaseBitmapData(objectBitmapData);


  UIImage *myImage = [UIImage imageWithData:input];
  NSData *jpgData  = UIImageJPEGRepresentation(myImage, 0.9);    

  FREObject    objectByteArray = argv[1];
  FREByteArray byteArray;

  FREObject length;

  FRENewObjectFromUint32(jpgData.length, &length);

  FRESetObjectProperty(objectByteArray, (const uint8_t*) "length", length, NULL);

  FREAcquireByteArray(objectByteArray, &byteArray);

  memcpy(byteArray.bytes, jpgData.bytes, jpgData.length);
  FREReleaseByteArray(objectByteArray);

  return NULL;

}



Best Answer-推荐答案


最终版本 - 似乎工作正常 - 编码正常,我认为自己可以清理。

肖恩

FREObject encodeJPEG( FREContext ctx, void* funcData, uint32_t argc, FREObject argv[] )
{
FREObject       objectBitmapData = argv[ 0 ];
FREBitmapData2  bitmapData;

FREAcquireBitmapData2( objectBitmapData, &bitmapData );

int width       = bitmapData.width;
int height      = bitmapData.height;
int stride      = bitmapData.lineStride32 * 4;
uint32_t* input = bitmapData.bits32;

// make data provider from buffer
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, bitmapData.bits32, (width * height * 4), NULL);

// set up for CGImage creation
int                     bitsPerComponent    = 8;
int                     bitsPerPixel        = 32;
int                     bytesPerRow         = 4 * width;
CGColorSpaceRef         colorSpaceRef       = CGColorSpaceCreateDeviceRGB();    
CGBitmapInfo            bitmapInfo;

if( bitmapData.hasAlpha )
{
    if( bitmapData.isPremultiplied )
        bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst; 
    else
        bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaFirst;            
}
else
{
    bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst;  
}

CGColorRenderingIntent  renderingIntent     = kCGRenderingIntentDefault;
CGImageRef              imageRef            = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);

// make UIImage from CGImage
UIImage *myImage = [UIImage imageWithCGImage:imageRef];    
NSData* jpgData  = UIImageJPEGRepresentation( myImage, 0.9 );    

FREReleaseBitmapData( objectBitmapData );

FREObject    objectByteArray = argv[ 1 ];               
FREByteArray byteArray;
FREObject    length;

FRENewObjectFromUint32( jpgData.length, &length );
FRESetObjectProperty( objectByteArray, ( const uint8_t* ) "length", length, NULL );
FREAcquireByteArray( objectByteArray, &byteArray );

memcpy( byteArray.bytes, jpgData.bytes, jpgData.length );

FREReleaseByteArray( objectByteArray );

// release bits
CGColorSpaceRelease(colorSpaceRef);
CGImageRelease(imageRef);
CGDataProviderRelease(provider);    
return NULL;

}

关于ios - ANE、iOS 和 BitmapData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8524388/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap