0

10.10 まで動作していた画像編集アプリケーションがありますが、10.11 でバグが発生しました。

CIImageで作成したものを表示すると-imageWithCGLayer、10.11 でのみ (正しいサイズの) 空の画像として表示されます。

   CGSize size =  NSSizeToCGSize(rect.size);
    size_t width = size.width;
    size_t height = size.height;
    size_t bitsPerComponent = 8;
    size_t bytesPerRow = (width * 4+ 0x0000000F) & ~0x0000000F; // 16 byte aligned is good
    size_t dataSize = bytesPerRow * height;
   void* data = calloc(1, dataSize);

    CGColorSpaceRef colorspace = [[[_imageController document] captureColorSpace] CGColorSpace];
    CGContextRef bitmapContext = CGBitmapContextCreate(data, width, height, bitsPerComponent, bytesPerRow, colorspace, kCGImageAlphaNone | kCGBitmapByteOrder32Host);

   CGLayerRef canvasLayer = CGLayerCreateWithContext(bitmapContext, scaledRect.size, NULL);

   [self drawCanvasInLayer:canvasLayer inRect:scaledRect];
   CIImage *test = [CIImage imageWithCGLayer:canvasLayer];
   NSLog(@"%@",test);

そのため、10.10 で表示CIImage *testすると、希望どおりに正確に表示されます。10.11 では、同じサイズの空白のイメージです。CGLayer と CIImage の API 差分を調べてみましたが、ドキュメントが濃すぎます。他の誰かがこの問題に出くわしましたか? CGContextRefコード内の他のすべてはサイズに関連しているため、 の初期化を伴うものに違いないと思います

4

1 に答える 1

1

その特定の API はしばらく前に廃止され、macOS 10.11 で完全に削除されました。だからあなたの結果が期待されています。

既に bitmapContext があるため、-drawCanvasInLayer:メソッドを変更してビットマップに直接描画し、bitmpap コンテキストを使用して画像を作成します。

CGImageRef tmpCGImage = CGBitmapContextCreateImage( bitmapContext );
CIImage*   myCIImage  = [[CIImage alloc] initWithCGImage: myCIImage];

CIImage を使い終わったら忘れずに実行してCGImageRelease( tmpCGImage ) ください

私は最近、まさにこの問題を解決し、サンプルの Objective-C プロジェクトを投稿して、この API の損失を回避しました。

http://www.blinddogsoftware.com/goodies/#DontSpillTheBitsを参照してください。

また、その API が宣言されているヘッダー ファイルを読むことを忘れないでください。非常に有用な情報がそこにあることがよくあります (Xcode では、特定の API を Command+クリックします)。

于 2017-03-17T02:56:55.593 に答える