【发布时间】:2015-02-04 16:06:21
【问题描述】:
在我的原生 Objective-c 代码中,我有一个 NSImage。如何将其发送到 as3 代码,以便在我的 as3 项目中使用 addChild(NSImageFromNative) 方法?
【问题讨论】:
标签: objective-c macos actionscript-3 air-native-extension
在我的原生 Objective-c 代码中,我有一个 NSImage。如何将其发送到 as3 代码,以便在我的 as3 项目中使用 addChild(NSImageFromNative) 方法?
【问题讨论】:
标签: objective-c macos actionscript-3 air-native-extension
除了您的解决方案之外,您还可以像这样在本机代码中创建 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。
【讨论】:
好的,我找到了解决方案。不确定这是否是最好的解决方案,但它对我有用。 我只是在像素上粉碎图像并将其组合到动作脚本代码中。
首先,我们需要将 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 毫秒。
对不起我的英语。
【讨论】: