将 NSImage 发送到 AS3。 AIR原生扩展(ANE)

Sending NSImage to AS3. AIR Native Extension(ANE)

在我的原生 objective-c 代码中,我有一个 NSImage。如何将它发送到 as3 代码,以便我可以在我的 as3 项目中使用 addChild(NSImageFromNative) 方法?

好的,我找到了解决方案。不确定这是否是最佳解决方案,但它对我有用。 我只是在像素上粉碎了图像并将其组合在动作脚本代码中。

首先,我们需要将 NSImage 转换为由十六进制像素颜色组成的 NSMutableArray:

NSImage *image = //Some image;

NSBitmapImageRep *imgRep = [[image representations] objectAtIndex: 0];
NSMutableArray *points = [[NSMutableArray alloc] init]; //Points array

for(int i=0; i < [imgRep pixelsHigh]; i++){
    NSMutableArray *rows = [[NSMutableArray alloc] init];
    for (int j=0; j<[imgRep pixelsWide]; j++){
        NSColor *color = [imgRep colorAtX:i y:j];
        NSString* hexString = [NSString stringWithFormat:@"%02X%02X%02X",
            (int) (color.redComponent * 0xFF),
            (int) (color.greenComponent * 0xFF),
            (int) (color.blueComponent * 0xFF)];
        [rows addObject:hexString];
        }
        [points addObject:rows];
    }

现在我们有了一个宽*高点数的数组。 然后我们需要将这个数组发送到我们的 as3 代码中:

DEFINE_ANE_FUNCTION(getPixelArray){

FREObject row;
FREObject array;

NSMutableArray *points = //points array
FRENewObject((const uint8_t*)"Array", 0, NULL, &array, NULL);
for (int i=0; i<[points count]; i++){
    FRENewObject((const uint8_t*)"Array", 0, NULL, &row, NULL);
    for (int j=0; j<[[points objectAtIndex:i] count]; j++){
        NSString *pixel = points[i][j];
        const char *utf8String = pixel.UTF8String;
        FREObject pixelColor;
        FRENewObjectFromUTF8( strlen(utf8String), (uint8_t*) utf8String, &pixelColor);
        FRESetArrayElementAt(row, j, pixelColor);
    }
    FRESetArrayElementAt(array, i, row);
}

return array;

}

现在我们可以像这样在 as3 代码中制作位图:

private function getImageFromNative: Bitmap{

    var ar: Array = extCtx.call("getPixelArray") as Array;
    var bm:BitmapData = new BitmapData(ar.length, (ar[0] as Array).length, false, 0);
    bm.lock();
    for (var i: int = 0; i<ar.length; i++){
        for (var j: int = 0; j<(ar[i] as Array).length; j++){
            var colorString: String = ar[i][j] as String;
            var color: uint = uint("0x" + colorString);
            bm.setPixel(i,j,color);
        }
    }
    bm.unlock()
    return new Bitmap(bm);
}

是啊!现在我们可以将这个位图从我们的项目添加到 DisplayObjectContainer。我们只需要使用这样的东西:

var na: MyAwesomeNativeExtension = new MyAwesomeNativeExtension();
this.addChild(na.getImageFromNative);

这样256x256的图片绘制时间为20~30毫秒

对不起我的英语。

除了您的解决方案之外,您还可以像这样在本机代码中创建一个 BitmapData:

// first get those values from NSImage
FREObject contructorArguments[4] = { width, height, transparent, fillColor };

// create an instance of BitmapData
FREObject freBitmapData;
FRENewObject((uint8_t *)"flash.display.BitmapData", 4, contructorArguments, &freBitmapData, NULL);

// now acquire the bitmap data in order to manipulate it
FREBitmapData acquiredFreBitmapData;
FREAcquireBitmapData(freBitmap, &acquiredFreBitmapData);

之后您可以将像素从 NSImage 复制到 FREBitmapData。