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

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

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 陽の光 闇の月 陽も月も異なれど、同じように地上を照らす。けれど、両者は決してまみえることはない。陽が輝くとき月は...
    波沙诺瓦阅读 2,274评论 0 7
  • 1.暗闇より夜魔来たる-1あなたはきっとこんな私をお許しにはならないでしょう…ですが、私はあなたを守る以外の何かを...
    波沙诺瓦阅读 1,950评论 1 2
  • 1.暗闇より夜魔来たる-1あなたはきっとこんな私をお許しにはならないでしょう…ですが、私はあなたを守る以外の何かを...
    波沙诺瓦阅读 3,286评论 0 7
  • ——秀水奇石班简讯一则 为了巩固军训周成果养成孩子良好习惯,秀水奇石班布置了第二个周末一份实...
    火红的石榴暖暖阅读 4,847评论 1 6
  • 最近折腾了Swift的语音录制识别和转码,这块还是比较坑的,由于语音识别的准确度实测大概也就80%左右,所以还是需...
    offbye西涛阅读 1,301评论 0 5