【问题标题】:ANE, iOS and BitmapDataANE、iOS 和 BitmapData
【发布时间】:2012-01-21 09:39:47
【问题描述】:

是否有任何将位图数据传递到 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;

}

【问题讨论】:

  • 作为替代方案,您可以在 ActionScript 内部使用 github.com/mikechambers/as3corelib 将位图转换为 JPEG
  • 它适用于 flex 移动设备,并且在 actionscript 中速度太慢 - 我想我已经破解了,一旦测试过就会很快发布。

标签: ios actionscript air air-native-extension


【解决方案1】:

交换红色和蓝色像素的位置

您从 iOS 获得的格式是:0xAARRGGBB
预计将在 AIR 应用程序上显示的是:0xAABBGGRR

【讨论】:

    【解决方案2】:

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

    肖恩

    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;
    

    }

    【讨论】:

    • 能否贴出检索 BitmapData 的 AS3 代码?
    【解决方案3】:

    除了 jpeg 中的红色是蓝色之外,这有点工作,并且不确定我是否发布了所有内容。

    那就是明天的战斗。

    肖恩

    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          = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst;
     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 );
    
     return NULL;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-13
      • 2015-11-24
      • 1970-01-01
      • 2013-11-28
      • 2015-11-15
      • 2014-07-06
      • 2015-11-15
      • 2015-04-02
      • 1970-01-01
      相关资源
      最近更新 更多