[Objective-C] iphone UIImage 图片处理 灰度 反色 深棕色 →→→→→进入此内容的聊天室

来自 , 2020-12-14, 写在 Objective-C, 查看 133 次.
URL http://www.code666.cn/view/4206e389
  1. +(UIImage*) grayscale:(UIImage*)anImage type:(char)type {
  2.     CGImageRef  imageRef;
  3.     imageRef = anImage.CGImage;
  4.      
  5.     size_t width  = CGImageGetWidth(imageRef);
  6.     size_t height = CGImageGetHeight(imageRef);
  7.      
  8.     // ピクセルを構成するRGB各要素が何ビットで構成されている
  9.     size_t                  bitsPerComponent;
  10.     bitsPerComponent = CGImageGetBitsPerComponent(imageRef);
  11.      
  12.     // ピクセル全体は何ビットで構成されているか
  13.     size_t                  bitsPerPixel;
  14.     bitsPerPixel = CGImageGetBitsPerPixel(imageRef);
  15.      
  16.     // 画像の横1ライン分のデータが、何バイトで構成されているか
  17.     size_t                  bytesPerRow;
  18.     bytesPerRow = CGImageGetBytesPerRow(imageRef);
  19.      
  20.     // 画像の色空間
  21.     CGColorSpaceRef         colorSpace;
  22.     colorSpace = CGImageGetColorSpace(imageRef);
  23.      
  24.     // 画像のBitmap情報
  25.     CGBitmapInfo            bitmapInfo;
  26.     bitmapInfo = CGImageGetBitmapInfo(imageRef);
  27.      
  28.     // 画像がピクセル間の補完をしているか
  29.     bool                    shouldInterpolate;
  30.     shouldInterpolate = CGImageGetShouldInterpolate(imageRef);
  31.      
  32.     // 表示装置によって補正をしているか
  33.     CGColorRenderingIntent  intent;
  34.     intent = CGImageGetRenderingIntent(imageRef);
  35.      
  36.     // 画像のデータプロバイダを取得する
  37.     CGDataProviderRef   dataProvider;
  38.     dataProvider = CGImageGetDataProvider(imageRef);
  39.      
  40.     // データプロバイダから画像のbitmap生データ取得
  41.     CFDataRef   data;
  42.     UInt8*      buffer;
  43.     data = CGDataProviderCopyData(dataProvider);
  44.     buffer = (UInt8*)CFDataGetBytePtr(data);
  45.      
  46.     // 1ピクセルずつ画像を処理
  47.     NSUInteger  x, y;
  48.     for (y = 0; y < height; y++) {
  49.         for (x = 0; x < width; x++) {
  50.             UInt8*  tmp;
  51.             tmp = buffer + y * bytesPerRow + x * 4; // RGBAの4つ値をもっているので、1ピクセルごとに*4してずらす
  52.              
  53.             // RGB値を取得
  54.             UInt8 red,green,blue;
  55.             red = *(tmp + 0);
  56.             green = *(tmp + 1);
  57.             blue = *(tmp + 2);
  58.              
  59.             UInt8 brightness;
  60.              
  61.             switch (type) {
  62.                 case 1://モノクロ
  63.                     // 輝度計算
  64.                     brightness = (77 * red + 28 * green + 151 * blue) / 256;
  65.                      
  66.                     *(tmp + 0) = brightness;
  67.                     *(tmp + 1) = brightness;
  68.                     *(tmp + 2) = brightness;
  69.                     break;
  70.                      
  71.                 case 2://セピア
  72.                     *(tmp + 0) = red;
  73.                     *(tmp + 1) = green * 0.7;
  74.                     *(tmp + 2) = blue * 0.4;
  75.                     break;
  76.                      
  77.                 case 3://色反転
  78.                     *(tmp + 0) = 255 - red;
  79.                     *(tmp + 1) = 255 - green;
  80.                     *(tmp + 2) = 255 - blue;
  81.                     break;
  82.                      
  83.                 default:
  84.                     *(tmp + 0) = red;
  85.                     *(tmp + 1) = green;
  86.                     *(tmp + 2) = blue;
  87.                     break;
  88.             }
  89.              
  90.         }
  91.     }
  92.      
  93.     // 効果を与えたデータ生成
  94.     CFDataRef   effectedData;
  95.     effectedData = CFDataCreate(NULL, buffer, CFDataGetLength(data));
  96.      
  97.     // 効果を与えたデータプロバイダを生成
  98.     CGDataProviderRef   effectedDataProvider;
  99.     effectedDataProvider = CGDataProviderCreateWithCFData(effectedData);
  100.      
  101.     // 画像を生成
  102.     CGImageRef  effectedCgImage;
  103.     UIImage*    effectedImage;
  104.     effectedCgImage = CGImageCreate(
  105.                                     width, height,
  106.                                     bitsPerComponent, bitsPerPixel, bytesPerRow,
  107.                                     colorSpace, bitmapInfo, effectedDataProvider,
  108.                                     NULL, shouldInterpolate, intent);
  109.     effectedImage = [[UIImage alloc] initWithCGImage:effectedCgImage];
  110.      
  111.     // データの解放
  112.     CGImageRelease(effectedCgImage);
  113.     CFRelease(effectedDataProvider);
  114.     CFRelease(effectedData);
  115.     CFRelease(data);
  116.      
  117.     return effectedImage;
  118. }
  119. //objectc/5695

回复 "iphone UIImage 图片处理 灰度 反色 深棕色"

这儿你可以回复上面这条便签

captcha