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