将NSImage发送到AS3。 AIR Native Extension(ANE)

时间:2015-02-04 16:06:22

标签: objective-c macos actionscript-3 air-native-extension

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

2 个答案:

答案 0 :(得分:0)

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

首先,我们需要将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毫秒。

抱歉我的英语。

答案 1 :(得分:0)

除了您的解决方案,您还可以使用本机代码创建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。