非常に経験豊富な iOS 開発者への質問です。
Core Graphics 関数CGImageMaskCreateは、グレースケール イメージから CG イメージ マスクを作成します。グレースケールとしてエクスポートされた JPG を使用しています。私は再確認しました:Photoshopで開くとき、画像>モード>に行くと「グレースケール」と表示されます。
次のメソッドは、UIImage カテゴリの一部です。マスクUIImage(グレースケールJPGのみ)を取り、その目標はそれ自体(JPG写真であるUIImage)をマスクして、結果の画像に透明性を持たせることです。
すべての 4 インチ デバイスと iPad 4 で動作します。ただし、CGImageMaskCreate の出力は、iOS 6 または iOS 7 を搭載した 3.5 インチ デバイスでは機能しません。つまり、結果の画像は 100% 透明になります。iPhoneシミュレーター3.5インチ(Xcode 5)でも同じです。理由はわかりません。これは iOS 7 の問題だと言う人もいますが、iOS 7 を搭載した iPhone 5 および 5S で動作します。PNG-8 グレースケールでも同じ結果が得られました。
Apple からの既知の TN またはこのバグの回避策はありますか?
- (UIImage*)maskedImageWithMask:(UIImage *)maskImage {
CGImageRef imageRef = self.CGImage;
CGImageRef maskRef = maskImage.CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, NO);
CGImageRef maskedImageRef = CGImageCreateWithMask(imageRef, mask);
UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef scale:self.scale orientation:self.imageOrientation];
CGImageRelease(mask);
CGImageRelease(maskedImageRef);
return maskedImage;
}
編集:
3.5 インチの iPhone シミュレーターおよびデバイスでは、CGImageIsMask(マスク) は NO を返します。4 インチ シミュレータおよびデバイスでは、YES が返されます。そのため、CGImageMaskCreate は絶対にマスクを作成しない場合があります。