對接門禁分享門禁二維碼圖片報錯

  咳咳,很久沒更新博客了,身爲一個ios程序員,懶成這樣,真的是無藥可救。這一年遇的坑解決了也沒發上博客,真是恥辱啊。可是,今天這個經過友盟分享圖片分享不出去的這個坑埋完後必定要發出來,省得後來者又入坑。ios

  1.入坑條件:程序員

  (1)首先你想本身經過字符串生成圖片;(本人是經過對接門禁返回的二維碼字符串生成圖片)微信

  (2)而後你就網上百度了生成圖片或二維碼的方法,生成CIImage再轉成圖片;spa

  (3)最後你成功生成圖片後沾沾自喜的時候要分享出去。code

  結果:orm

  

  而後你翻友盟開發文檔,呵呵,找不到,沒這種答案。而後你又去百度,呵呵,仍是找不到。。。。blog

  

  

  2.開始填坑:圖片

  一開始我以爲多是生成圖片過大,分享不出去,而後我就去調用開發

  NSData *data=UIImagePNGRepresentation(myimage);文檔

  結果,data = nil;

  what???????

  而後我就點進去看了下UIImagePNGRepresentation的說明,結果發現可靠的信息: 

  百度查了一下那句話的意思是,若是圖像沒有CGImageRef或者位圖格式無效,能夠返回nil 。

  恍然大悟。。。。。

  爲了驗證一下,特意調用了一下image.CGImage,果真不出我所料,image.CGImage = nil;

  

  接下來,個人想法就是看生成圖片的方法了。

  我發現,我生成二維碼圖片時,是這樣的:

  //建立二維碼濾鏡

      CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];

      [qrFilter setValue:strData forKey:@"inputMessage"];

      [qrFilter setValue:@"H" forKey:@"inputCorrectionLevel"];

      CIImage *qrImage = qrFilter.outputImage;

    UIImage *codeImage = [UIImage imageWithCIImage:[qrImage imageByApplyingTransform:CGAffineTransformMakeScale(scale, scale)]];

  有沒發現什麼?是否是沒看到任何有關CGImageRef的?

  而後我查了一下什麼是CGImageRef:

  CGImageRef: 位圖的基本概念,能夠點擊看他的源碼,是用C語言定義的。

                     能夠經過它來建立像素位圖,經過操做儲存像素位圖已達到裁剪圖片的目的。

  這不就是咱們大學學的位圖嗎?而後我又接着去查了一下,如何將經過CIImage去生成CGIamgeRef,果真,

  CGRect extent = CGRectIntegral(image.extent);

  CIContext *context = [CIContext contextWithOptions:nil];

  CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];

   

  到這裏就恍然大悟了,直接經過獲得的位圖去生成image:

  image = [UIImage imageWithCGImage:scaledImage];

  而後驗證一下,果真,image.CGImage不爲空。

  點擊分享,彈出微信,大功告成!!!!

  

  一切就這麼簡單,歡迎各位大神吐槽。

相關文章
相關標籤/搜索