咳咳,好久没更新博客了,身为一个ios程序员,懒成这样,真的是无药可救。这一年遇的坑解决了也没发上博客,真是耻辱啊。但是,今天这个通过友盟分享图片分享不出去的这个坑埋完后一定要发出来,免得后来者又入坑。
1.入坑条件:
(1)首先你想自己通过字符串生成图片;(本人是通过对接门禁返回的二维码字符串生成图片)
(2)然后你就网上百度了生成图片或二维码的方法,生成CIImage再转成图片;
(3)最后你成功生成图片后沾沾自喜的时候要分享出去。
结果:
然后你翻友盟开发文档,呵呵,找不到,没这种答案。然后你又去百度,呵呵,还是找不到。。。。
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不为空。
点击分享,弹出微信,大功告成!!!!
一切就这么简单,欢迎各位大神吐槽。