将 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。
在我的原生 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。