纠结了一周的位图颜色反转,终于在今天不完美解决

年前产品经理脑袋抽筋,要做夜间模式。做了一下技术预演,然后就开干了。

找到了网上最火的夜间开源框架DKNightVersion,已经完美解决了我们大部分的夜间需求。那么但是问题来了,往往最难解决的就是剩下的90%。

第一部分比较难解决的地方就是我们的在线做题。在线做题用的是唐巧大神的CoreText, 很佩服唐大神这套框架,从我们做在线做题就一直在用,一直都没有出过问题。直到夜间模式的切换。由于这套框架是在给数据之前对数据格式做的配置,所以在重新drawrect的时候需要读取最新的配置,我的做法是在config的时候给data一个colorpicker,每次更新的时候读取当前需要的color。还算完美的解决了这个问题,有需要这部分代码的可以跟我联系。

第二部分比较难解决的就是试题中一些公式的颜色的反转,之前没有涉及过图片相关的操作,所以开始了网上的搜索。。 最后找到三篇很不错的文章,一个是http://www.jianshu.com/p/a707e48e5238,另一个是:http://www.jianshu.com/p/c647d7edb301, 还有一个是:http://blog.csdn.net/u012519228/article/details/51491797

这两个都很详细的讲解了图片的格式和转换原理,了解了原理之后,就开始撸代码了。

但是图片并没有完美显示。感觉是因为一些图片参数配置的原因,之后又查了一些资料。写了一个位图颜色反转的demo,demo里很完美的反转了图片。以下是代码片段:

- (UIImage*) grayscale:(UIImage*)anImage {

CGImageRefimageRef;

imageRef = anImage.CGImage;

//const int width = anImage.size.width;

//const int height = anImage.size.height;

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ピクセルずつ画像を処理

for(NSIntegery =0; y < height; y++) {

for(NSIntegerx =0; x < width; x++) {

UInt8*tmp = buffer + y * bytesPerRow + x *4;// RGBAの4つ値をもっているので、1ピクセルごとに*4してずらす

// RGB値を取得

UInt8alpha,red,green,blue;

red = *(tmp +0);

green = *(tmp +1);

blue = *(tmp +2);

alpha = *(tmp +3);

if(alpha) {

*(tmp +0) =255- red;

*(tmp +1) =255- green;

*(tmp +2) =255- blue;

}

}

}

//効果を与えたデータ生成

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;

}

这个用的是一个日本的作者写的,不得不服,很完美。

然后把代码copy到我的项目里,发现运行闪退。。又开始了一番捉急的debug,找了好久还是找不到原因,后来旁边的同事说你把demo里的图片放进来试试,然后发现很完美的就显示出来了,然后我把这个图片的web url放进来发现还是不行,我在想是不是下载的图片有问题,之后尝试了用系统方法去下载图片,然后发现就没出现闪图,而且图片也很完美的显示出来了。虽然问题解决了 但是还是不明白为什么会这样,如果有遇到相同问题的可以一起讨论。

总之,上边代码可以做图片反转,还可以对图片做很多其他的操作,可以自己去发掘一下。


参考资料:http://blog.csdn.net/u012519228/article/details/51491797

http://www.jianshu.com/p/c647d7edb301

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 陽の光 闇の月 陽も月も異なれど、同じように地上を照らす。けれど、両者は決してまみえることはない。陽が輝くとき月は...
    波沙诺瓦阅读 2,243评论 0 7
  • 1.暗闇より夜魔来たる-1あなたはきっとこんな私をお許しにはならないでしょう…ですが、私はあなたを守る以外の何かを...
    波沙诺瓦阅读 1,916评论 1 2
  • 1.暗闇より夜魔来たる-1あなたはきっとこんな私をお許しにはならないでしょう…ですが、私はあなたを守る以外の何かを...
    波沙诺瓦阅读 3,250评论 0 7
  • 在很多年以前,有一位跟我母亲一样年龄的女人,跟我说:“她要跟她的丈夫离婚。问我怎么看。” 我当时的心有些惊讶,惊讶...
    智爱189阅读 265评论 0 0
  • 居斗室,坐对瓯江。闲云江影日悠悠。淡淡欣喜于时光的流转。 江水缓缓流淌,无声,却胜有声。想起多...
    蝶衣轻沾雪阅读 186评论 0 0