//生成灰色,棕色,反色图片1灰,2棕,3反
- (UIImage*) grayscale:(UIImage*)anImage type:(char)type {
CGImageRefimageRef;
imageRef = anImage.CGImage;
size_twidth=CGImageGetWidth(imageRef);
size_theight =CGImageGetHeight(imageRef);
// ピクセルを構成するRGB各要素が何ビットで構成されている
size_tbitsPerComponent;
bitsPerComponent =CGImageGetBitsPerComponent(imageRef);
// ピクセル全体は何ビットで構成されているか
size_tbitsPerPixel;
bitsPerPixel =CGImageGetBitsPerPixel(imageRef);
// 画像の横1ライン分のデータが、何バイトで構成されているか
size_tbytesPerRow;
bytesPerRow =CGImageGetBytesPerRow(imageRef);
// 画像の色空間
CGColorSpaceRefcolorSpace;
colorSpace =CGImageGetColorSpace(imageRef);
// 画像のBitmap情報
CGBitmapInfobitmapInfo;
bitmapInfo =CGImageGetBitmapInfo(imageRef);
// 画像がピクセル間の補完をしているか
boolshouldInterpolate;
shouldInterpolate =CGImageGetShouldInterpolate(imageRef);
// 表示装置によって補正をしているか
CGColorRenderingIntentintent;
intent =CGImageGetRenderingIntent(imageRef);
// 画像のデータプロバイダを取得する
CGDataProviderRefdataProvider;
dataProvider =CGImageGetDataProvider(imageRef);
// データプロバイダから画像のbitmap生データ取得
CFDataRefdata;
UInt8*buffer;
data =CGDataProviderCopyData(dataProvider);
buffer = (UInt8*)CFDataGetBytePtr(data);
// 1ピクセルずつ画像を処理
NSUIntegerx, y;
for(y =0; y < height; y++) {
for(x =0; x < width; x++) {
UInt8*tmp;
tmp = buffer + y * bytesPerRow + x *4;// RGBAの4つ値をもっているので、1ピクセルごとに*4してずらす
// RGB値を取得
UInt8red,green,blue;
red = *(tmp +0);
green = *(tmp +1);
blue = *(tmp +2);
UInt8brightness;
switch(type) {
case1://モノクロ
// 輝度計算
brightness = (77* red +28* green +151* blue) /256;
*(tmp +0) = brightness;
*(tmp +1) = brightness;
*(tmp +2) = brightness;
break;
case2://セピア
*(tmp +0) = red;
*(tmp +1) = green *0.7;
*(tmp +2) = blue *0.4;
break;
case3://色反転
*(tmp +0) =255- red;
*(tmp +1) =255- green;
*(tmp +2) =255- blue;
break;
default:
*(tmp +0) = red;
*(tmp +1) = green;
*(tmp +2) = blue;
break;
}
}
}
// 効果を与えたデータ生成
CFDataRefeffectedData;
effectedData =CFDataCreate(NULL, buffer,CFDataGetLength(data));
// 効果を与えたデータプロバイダを生成
CGDataProviderRefeffectedDataProvider;
effectedDataProvider =CGDataProviderCreateWithCFData(effectedData);
// 画像を生成
CGImageRefeffectedCgImage;
UIImage*effectedImage;
effectedCgImage =CGImageCreate(
width, height,
bitsPerComponent, bitsPerPixel, bytesPerRow,
colorSpace, bitmapInfo, effectedDataProvider,
NULL, shouldInterpolate, intent);
effectedImage = [[UIImagealloc]initWithCGImage:effectedCgImage];
// データの解放
CGImageRelease(effectedCgImage);
CFRelease(effectedDataProvider);
CFRelease(effectedData);
CFRelease(data);
returneffectedImage;
}