美文网首页
iOS-将分享链接转为二维码

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

作者: 细雨听风 | 来源:发表于2016-04-20 09:15 被阅读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;

    相关文章

      网友评论

          本文标题:iOS-将分享链接转为二维码

          本文链接:https://www.haomeiwen.com/subject/mpuzlttx.html