【问题标题】:Sending NSImage to AS3. AIR Native Extension(ANE)将 NSImage 发送到 AS3。 AIR 原生扩展(ANE)
【发布时间】:2015-02-04 16:06:21
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    除了您的解决方案之外,您还可以像这样在本机代码中创建 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。

    【讨论】:

      【解决方案2】:

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

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

      对不起我的英语。

      【讨论】:

        猜你喜欢
        • 2014-05-22
        • 2013-03-19
        • 2014-10-01
        • 2021-08-31
        • 2014-06-06
        • 2012-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多