iOS-将分享链接转为二维码

2016-04-20  本文已影响304人  细雨听风

因为项目需求,需要一个显示将分享的链接转换为二维码

代码如下:
- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
CGRect extent = CGRectIntegral(image.extent);
CGFloat scale = MIN(size/CGRectGetWidth(extent),size/CGRectGetHeight(extent));
// create a bitmap image that we'll draw into a bitmap context at the desired size;
size_t width = CGRectGetWidth(extent) * scale;
size_t height = CGRectGetHeight(extent) * scale;
CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent, bitmapImage);
// Create an image with the contents of our bitmap
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
// Cleanup
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage imageWithCGImage:scaledImage];
}

   - (CIImage *)createQRForString:(NSString *)qrString {
  // Need to convert the string to a UTF-8 encoded NSData object
  NSData *stringData = [qrString dataUsingEncoding:NSUTF8StringEncoding];
  // Create the filter
  CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
  // Set the message content and error-correction level
  [qrFilter setValue:stringData forKey:@"inputMessage"];
  [qrFilter setValue:@"M" forKey:@"inputCorrectionLevel"];
  // Send the image back
  return qrFilter.outputImage;
  }


void ProviderReleaseData (void *info, const void *data, size_t size){
    free((void*)data);
}
- (UIImage*)imageBlackToTransparent:(UIImage*)image withRed:(CGFloat)red andGreen:(CGFloat)green andBlue:(CGFloat)blue{
  const int imageWidth = image.size.width;
  const int imageHeight = image.size.height;
  size_t      bytesPerRow = imageWidth * 4;
  uint32_t* rgbImageBuf = (uint32_t*)malloc(bytesPerRow * imageHeight);
  // create context
  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  CGContextRef context = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight, 8, bytesPerRow, colorSpace,
                                             kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
  CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), image.CGImage);
  // traverse pixe
  int pixelNum = imageWidth * imageHeight;
  uint32_t* pCurPtr = rgbImageBuf;
  for (int i = 0; i < pixelNum; i++, pCurPtr++){
      if ((*pCurPtr & 0xFFFFFF00) < 0x99999900){
          // change color
          uint8_t* ptr = (uint8_t*)pCurPtr;
          ptr[3] = red; //0~255
          ptr[2] = green;
          ptr[1] = blue;
      }else{
          uint8_t* ptr = (uint8_t*)pCurPtr;
          ptr[0] = 0;
      }
  }
  // context to image
  CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight, ProviderReleaseData);
  CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight, 8, 32, bytesPerRow, colorSpace,
                                    kCGImageAlphaLast | kCGBitmapByteOrder32Little, dataProvider,
                                    NULL, true, kCGRenderingIntentDefault);
  CGDataProviderRelease(dataProvider);
  UIImage* resultUIImage = [UIImage imageWithCGImage:imageRef];
  // release
  CGImageRelease(imageRef);
  CGContextRelease(context);
  CGColorSpaceRelease(colorSpace);
  return resultUIImage;
}

使用如下:

UIImage *qrcode = [self createNonInterpolatedUIImageFormCIImage:[self createQRForString:@"heiheihei�123123.3453,213"] withSize:250.0f];
UIImage *customQrcode = [self imageBlackToTransparent:qrcode withRed:0.0f andGreen:0.0f andBlue:0.0f];
self.qrcodeView.image = customQrcode;
上一篇下一篇

猜你喜欢

热点阅读