ã«ã¡ã©ã¢ããªã®äœãæ¹ã¯ãä»åã§æçµåãšãªããæåŸã«èª¬æããã®ã¯ãæ®åœ±ããåçã«ãšãã§ã¯ãããããæ¹æ³ã ããã®ãšãã§ã¯ãã®çš®é¡ã§ãé¢çœãã«ã¡ã©ã¢ããªã«ãªããã©ãããæ±ºãŸãã ããã
CGImageãšç»åæ å ±ã®ååŸ
ç»åã«ãšãã§ã¯ãããããã«ã¯ãç»åãããããããããŒã¿ãšããŠåãåºãäºãå¿ èŠã«ãªãã ãããUIImagePickerControllerããã¯ãç»åã¯UIImageãªããžã§ã¯ããšããŠååŸããäºãã§ããããã®ã¯ã©ã¹ã¯ãã°ã©ãã£ãã¯ã·ã¹ãã ã®äžã§ã¯äžäœã«äœçœ®ã¥ããããŠãããç°¡åã«ç»é¢ã«è¡šç€ºã§ããåé¢ãããããããããŒã¿ãåãåºããããªäœã¬ãã«ãªæäœãè¡ãAPIã¯æäŸãããŠããªãã
ããã§ãCore Graphicsãã¬ãŒã ã¯ãŒã¯ã䜿ãããCore Graphicsã¯ãCocoaãããäœã¬ã€ã€ãŒã«äœçœ®ããã°ã©ãã£ãã¯ãã¬ãŒã ã¯ãŒã¯ã§ãçŽæ¥ç»åãæäœããããã®APIãè²ã ãšããã£ãŠãããã¡ãªã¿ã«ãCore Graphicsã§ã¯ãã¹ãŠã®APIã¯Cèšèªã§æäŸãããŠããã
Core Graphicsã§ç»åã衚ãã®ããCGImageãšåŒã°ãããªããžã§ã¯ãã ãUIImageãªããžã§ã¯ããããCGImageãªããžã§ã¯ããåãåºãäºãã§ãããUIImageãæã£ãŠããCGImageãšããããããã£ã䜿ãã
UIImage.h
@property(nonatomic, readonly) CGImageRef CGImage;
CGImageã䜿ããšãç»åã®è©³çŽ°ãªæ å ±ãååŸããäºãã§ãããããšãã°ãç»åã®å¹ ãé«ãããã¯ã»ã«ã®èŠçŽ æ¯ã®ãããæ°ããã¯ã»ã«æ¯ã®ãããæ°ãç»å1è¡ã®ãã€ãæ°ããªã©ã ã
次ã®ãããªãœãŒã¹ã³ãŒãã§ãUIImageããCGImageãåãåºããç»åæ å ±ã調ã¹ãäºãã§ããã
CameraViewController.m
...
// CGImageãååŸãã
CGImageRef cgImage;
cgImage = shrinkedImage.CGImage;
// ç»åæ
å ±ãååŸãã
size_t width;
size_t height;
size_t bitsPerComponent;
size_t bitsPerPixel;
size_t bytesPerRow;
CGColorSpaceRef colorSpace;
CGBitmapInfo bitmapInfo;
bool shouldInterpolate;
CGColorRenderingIntent intent;
width = CGImageGetWidth(cgImage);
height = CGImageGetHeight(cgImage);
bitsPerComponent = CGImageGetBitsPerComponent(cgImage);
bitsPerPixel = CGImageGetBitsPerPixel(cgImage);
bytesPerRow = CGImageGetBytesPerRow(cgImage);
colorSpace = CGImageGetColorSpace(cgImage);
bitmapInfo = CGImageGetBitmapInfo(cgImage);
shouldInterpolate = CGImageGetShouldInterpolate(cgImage);
intent = CGImageGetRenderingIntent(cgImage);
ããããããããŒã¿ãåãåºã
ç¶ããŠãç»åã®ããããããããŒã¿ãåãåºãæ¹æ³ã説æããããããã«ã¯ãCGDataProviderãšåŒã°ãããªããžã§ã¯ãã䜿ãã
Core Graphicsã§ã¯ãç»åãåãæ±ãããã«ãç»åãã®ãã®ã衚ãCGImageã«å ããŠãç»åããŒã¿ãæäŸããCGDataProviderãšãç»åããŒã¿ã®åŠçãè¡ãCGDataConsumerãšãããªããžã§ã¯ããçšæãããŠãããããããããããŒã¿ã®ãããªãç»åã®å ããŒã¿ãååŸãããšãã¯ãCGDataProviderã䜿ãã®ã ã
CGImageããCGDataProviderãåãåºãã«ã¯ãCGImageGetDataProviderãšããAPIã䜿ãã
CGImage.h
CGDataProviderRef CGImageGetDataProvider(CGImageRef image);
ãããŠCGDataProviderããããŒã¿ãåãåºãããã«ãCGDataProviderCopyDataãšããAPIããããããããç»åã®ããããããããŒã¿ãšãªãã®ã ã
CGDataProvider.h
CFDataRef CGDataProviderCopyData(CGDataProviderRef provider);
ãããŸã§ã®ãœãŒã¹ã³ãŒãã玹ä»ãããã
CameraViewController.m
...
// ããŒã¿ãããã€ããååŸãã
CGDataProviderRef dataProvider;
dataProvider = CGImageGetDataProvider(cgImage);
// ããããããããŒã¿ãååŸãã
CFDataRef data;
UInt8* buffer;
data = CGDataProviderCopyData(dataProvider);
buffer = (UInt8*)CFDataGetBytePtr(data);
ããããããããŒã¿ã¯CFDataã®åœ¢ã§ååŸã§ãããããã°ã©ãã³ã°ããããããã«ãçããŒã¿ã®ãã€ã³ã¿ãåãåºããŠããããããã§ãã€ãã«ç»åã®ããããããããŒã¿ãçŽæ¥è§Šããããã«ãªã£ãã
ãšãã§ã¯ããããã
ã§ã¯ãç»åã«ãšãã§ã¯ãããããŠããããããã§ã¯ãç»åã®ã¢ãã¯ãåãè¡ã£ãŠã¿ãã
ã¢ãã¯ãåãè¡ãããã«ãã䜿ãããææ³ã¯ããŸãç»åãRGBããYCCãŸãã¯YIQãã©ãŒããããžãšå€æããããããŠãèŒåºŠã§ããYä¿¡å·ã®å€ãRGBå€ãšããŠäœ¿ãããšãããã®ã ãYCCãã©ãŒãããã«å€æããäºã§ã人éã®ç®ã«ææãªèŒåºŠã®å€ãåãåºããããã«ãªããããã䜿ãäºã§ããããªã¢ãã¯ãç»åãäœãäºãã§ããã
ããã«ãããæ¬¡ã®ãããªãœãŒã¹ã³ãŒãã§ãšãã§ã¯ãããããŠã¿ãããèŒåºŠå€ã®èšç®ã®è©³çްã¯ãç»ååŠçããã°ã©ãã³ã°ã®ããã¹ããªã©ãåèã«ããŠã»ããã
CameraViewController.m
...
// ããããããã«å¹æãäžãã
NSUInteger i, j;
for (j = 0; j < height; j++) {
for (i = 0; i < width; i++) {
// ãã¯ã»ã«ã®ãã€ã³ã¿ãååŸãã
UInt8* tmp;
tmp = buffer + j * bytesPerRow + i * 4;
// RGBã®å€ãååŸãã
UInt8 r, g, b;
r = *(tmp + 3);
g = *(tmp + 2);
b = *(tmp + 1);
// èŒåºŠå€ãèšç®ãã
UInt8 y;
y = (77 * r + 28 * g + 151 * b) / 256;
// èŒåºŠã®å€ãRGBå€ãšããŠèšå®ãã
*(tmp + 1) = y;
*(tmp + 2) = y;
*(tmp + 3) = y;
}
}
æåŸã«ã广ãäžããããããããããŒã¿ãããç»åãªããžã§ã¯ããäœãããããã¯ãããŸãŸã§ã®äœæ¥ã®éã«ãªãããŸããããããããããŒã¿ã䜿ã£ãŠCFDataãªããžã§ã¯ããäœããããã䜿ã£ãŠCGDataProviderãäœããããã«CGImageãäœãããããŠãCGImageããUIImageãäœãã°å®æã ã
CameraViewController.m
...
// 广ãäžããããŒã¿ãäœæãã
CFDataRef effectedData;
effectedData = CFDataCreate(NULL, buffer, CFDataGetLength(data));
// 广ãäžããããŒã¿ãããã€ããäœæãã
CGDataProviderRef effectedDataProvider;
effectedDataProvider = CGDataProviderCreateWithCFData(effectedData);
// ç»åãäœæãã
CGImageRef effectedCgImage;
UIImage* effectedImage;
effectedCgImage = CGImageCreate(
width, height,
bitsPerComponent, bitsPerPixel, bytesPerRow,
colorSpace, bitmapInfo, effectedDataProvider,
NULL, shouldInterpolate, intent);
effectedImage = [[UIImage alloc] initWithCGImage:effectedCgImage];
[effectedImage autorelease];
// ç»åã衚瀺ãã
_imageView.image = effectedImage;
ããã§ããšãã§ã¯ãããããUIImageãªããžã§ã¯ãã®åºæ¥äžããã ãããã衚瀺ããã°ãæ®åœ±ããåçãã¢ãã¯ãã«ãªã£ãŠããã¯ãã ã
ããã§ãã«ã¡ã©ã¢ããªãšããŠã®åºæ¬çãªåäœã¯å®çŸã§ãããããšã¯ãæ§ã ãªãšãã§ã¯ãã远å ããã°ããã£ãšé åçãªã«ã¡ã©ã¢ããªã«ä»äžããã ããã
ãããŸã§ã®ãœãŒã¹ã³ãŒã: Camera-4.zip
