生成灰色,棕色,反色图片

2016-12-09  本文已影响0人  alohasingle

//生成灰色,棕色,反色图片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;

}

上一篇下一篇

猜你喜欢

热点阅读