ANE,iOS和BitmapData

有没有任何例子传入位图数据到iOS并返回一个modfified副本。 我试图将位图转换成JPEG格式 – 类似于Windows中的示例http://blog.magicalhobo.com/2011/09/12/air-3-native-extension-imagepro cessor /但它每次都崩溃。

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

肖恩

PS下面是我的尝试:

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; 

}

压轴版本 – 似乎工作正常 – 编码好,我认为清理后自己好。

肖恩

 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; 

}

这有点工程,除了红色是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; } 

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

你从iOS获得的格式是: 0xAARRGGBB
而预计在AIR应用上显示的0xAABBGGRR是: 0xAABBGGRR