7

Xcode 7に更新され、操作で画像がレンダリングされている間に次の (警告?) メッセージが表示されます。

CreateWrappedSurface() は、データ プロバイダーに基づく CGImageRef で失敗しました。

Xcode 6.4 では、このようなメッセージはありませんでした。

メッセージをスローしたコード部分を取得しました。

if (!self.originalImage) // @property (nonatomic, strong) UIImage *originalImage;
        return;

CGImageRef originalCGImage = self.originalImage.CGImage;
NSAssert(originalCGImage, @"Cannot get CGImage from original image");
CIImage *inputCoreImage = [CIImage imageWithCGImage:originalCGImage]; // this results the console message

UIImage から直接取得するように CIIImage 作成者を置き換えました。

CIImage *originalCIImage = self.originalImage.CIImage;
NSAssert(originalCIImage, @"Cannot build CIImage from original image");

この場合、コンソール メッセージは表示されませんでしたが、「originalCIImage は nil でした」というアサートがありました。

UIImage のクラス リファレンスには次のように書かれています。

@property(nonatomic, readonly) CIImage *CIImage

UIImage オブジェクトが CGImageRef を使用して初期化された場合、プロパティの値は nil です。

だから私は元のコードをフォールバックとして使用しています:

CIImage *originalCIImage = self.originalImage.CIImage;
if (!originalCIImage) {
    CGImageRef originalCGImageRef = self.originalImage.CGImage;
    NSAssert(originalCGImageRef, @"Unable to get CGimageRef of originalImage");
    originalCIImage = [CIImage imageWithCGImage:originalCGImageRef];
}
NSAssert(originalCIImage, @"Cannot build CIImage from original image");

問題は、コンソールにまだ警告メッセージが表示されることです。

以前にこのメッセージを受け取った人はいますか? その警告(?)メッセージを消すための解決策は何ですか?

ありがとう、 アダム

4

1 に答える 1

8

最後に答えを見つけました。CIImage がどのように機能するかについて調べたエラーに興味があります ( https://uncorkedstudios.com/blog/image-filters-with-core-graphics )

CGImageRef は、事前に乗算された値 (RGB と A) でデータプロバイダーに支えられていることに気付きました。

CIImage にロードしている CGImage (使用しているの[CIImage imageWithCGImage:originalCGImage];は RGB のみで、RGBA ではありません) だと思いました。案の定、標準を使用してビューのスナップショットを取得してこのイメージを作成してUIGraphicsBeginImageContextWithOptionsいて、不透明なパラメーターを「YES」に設定していました。

私は単に変更しました:

UIGraphicsBeginImageContextWithOptions(bounds, YES, 1.0f);

UIGraphicsBeginImageContextWithOptions(bounds, NO, 1.0f);

そのため、RGB 画像ではなく RGBA 画像を作成しています。

今、CGImage を CIImage に変換すると、CIImage NOW には適切なデータプロバイダーのバッキングがあり、エラーはなくなります。


:

ガウスぼかしの目的で CIClamp フィルターを使用していましたが、不透明度を NO に設定すると、クランプが効果的に機能しません。opaque を YES のままにし、ログ警告を無視することにしました。実際には何もしていないようです。)

于 2015-09-21T06:11:29.983 に答える