iOS 5のCoreImageフレームワークを見てみると、画像全体に効果を追加するのは簡単であることがわかりました。画像の特殊な部分(長方形)に効果を加えられるのではないかと思います。たとえば、画像の一部にグレースケール効果を追加します/
どうぞよろしくお願いいたします。
ありがとう、ホイ
iOS 5のCoreImageフレームワークを見てみると、画像全体に効果を追加するのは簡単であることがわかりました。画像の特殊な部分(長方形)に効果を加えられるのではないかと思います。たとえば、画像の一部にグレースケール効果を追加します/
どうぞよろしくお願いいたします。
ありがとう、ホイ
WWDC 2012 ビデオのセッション 510 をご覧ください。にマスクを適用する方法を紹介しますCIImage
。フィルターを連鎖させる方法を学ぶ必要があります。特に以下をご覧ください。
CICrop
, CILinearGradient
, CIRadialGradient
(マスクの作成に使用できます)CISourceOverCompositing
(マスク画像をまとめて)CIBlendWithMask
(最終イメージを作成)フィルタは次の場所に文書化されています。
あなたの最善の策は、CIImage をコピーすることです (これで 2 つになりました)。 2 つの古い CIImages。
大変な作業のように思えますが、これらすべてが一連の GPU シェーダーとしてセットアップされていることを理解すると、はるかに理にかなっています。
typedef enum {
ALPHA = 0,
BLUE = 1,
GREEN = 2,
RED = 3
}ピクセル;
- (UIImage *)convertToGrayscale:(UIImage *) originalImage inRect: (CGRect) rect{
CGSize size = [originalImage size];
int width = size.width;
int height = size.height;
// the pixels will be painted to this array
uint32_t *pixels = (uint32_t *) malloc(width * height * sizeof(uint32_t));
// clear the pixels so any transparency is preserved
memset(pixels, 0, width * height * sizeof(uint32_t));
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
// create a context with RGBA pixels
CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace,
kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast);
// paint the bitmap to our context which will fill in the pixels array
CGContextDrawImage(context, CGRectMake(0, 0, width, height), [originalImage CGImage]);
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
uint8_t *rgbaPixel = (uint8_t *) &pixels[y * width + x];
if(x > rect.origin.x && y > rect.origin.y && x < rect.origin.x + rect.size.width && y < rect.origin.y + rect.size.height) {
// convert to grayscale using recommended method: http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale
uint32_t gray = 0.3 * rgbaPixel[RED] + 0.59 * rgbaPixel[GREEN] + 0.11 * rgbaPixel[BLUE];
// set the pixels to gray in your rect
rgbaPixel[RED] = gray;
rgbaPixel[GREEN] = gray;
rgbaPixel[BLUE] = gray;
}
}
}
// create a new CGImageRef from our context with the modified pixels
CGImageRef image = CGBitmapContextCreateImage(context);
// we're done with the context, color space, and pixels
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
free(pixels);
// make a new UIImage to return
UIImage *resultUIImage = [UIImage imageWithCGImage:image];
// we're done with image now too
CGImageRelease(image);
return resultUIImage;
}
UIImageViewでテストできます。
imageview.image = [self convertToGrayscale:imageview.image inRect:CGRectMake(50, 50, 100, 100)];