将 QR 导出为矢量 NSImage 和 CGPDFContextCreate - macOS ObjC

Exporting a QR to vector NSImage & CGPDFContextCreate - macOS ObjC

我一直在想办法将我的小项目中的 QR 码导出为矢量。

我从最初生成图像的 qrImageForString 函数开始,并将其作为位图。

有问题的主要两行是:

CGContextRef ctx = CGBitmapContextCreate(0, size, size, 8, size * 4, colorSpace,kCGImageAlphaPremultipliedLast);
CGImageRef qrCGImage = CGBitmapContextCreateImage(ctx);

对于第一个,我认为这可能是替代品:

NSRect rect = CGRectMake(0.0, 0.0, 750.0, 750.0);
CGContextRef ctx = CGPDFContextCreate(dataConsumer, &rect, NULL);

但是我不确定如何替换第二行以使其成为矢量。

完整函数为:

+ (NSImage *)qrImageForString:(NSString *)string imageSize:(CGFloat)size {
    if (![string length]) {
        return nil;
    }
    
    int str1;
      
    QRcode *code = QRcode_encodeString([string UTF8String], 0, str1, QR_MODE_8, 1);
    
    
    // create context
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef ctx = CGBitmapContextCreate(0, size, size, 8, size * 4, colorSpace, kCGImageAlphaPremultipliedLast);
    
    NSRect rect = CGRectMake(0.0, 0.0, 750.0, 750.0);

    
    NSMutableData* outputData = [[NSMutableData alloc] init];
    CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData((CFMutableDataRef)outputData);
      
    CGAffineTransform translateTransform = CGAffineTransformMakeTranslation(0, -size);
    CGAffineTransform scaleTransform = CGAffineTransformMakeScale(1, -1);
    CGContextConcatCTM(ctx, CGAffineTransformConcat(translateTransform, scaleTransform));
    
    // draw QR on this context
    [MainClass drawQRCode:code context:ctx size:size];
    
    // get image
    CGImageRef qrCGImage = CGBitmapContextCreateImage(ctx);

    
    
    NSImage *qrImage = [[NSImage alloc] initWithCGImage:qrCGImage size:NSZeroSize];
  
    
    // some releases
    CGContextRelease(ctx);
    CGImageRelease(qrCGImage);
    CGColorSpaceRelease(colorSpace);
    QRcode_free(code);
    
    return qrImage;
}

复制:创建一个屏幕外视图,设置视图的绘制方法以包含您的图形,然后使用 NSViewdataWithEPSInsideRect: 方法。

我将mdDrawQRCode:context:size:fillColor:设为视图的实例方法,但它可以是不同class的方法。观点:

@interface MyView : NSView

@property (strong) NSString *qrString;

@end


@implementation MyView

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

    if (!self.qrString)
        return;

    CGContextRef cgContext = [[NSGraphicsContext currentContext] CGContext];
    CGContextSaveGState(cgContext);

    QRcode *code = QRcode_encodeString([self.qrString UTF8String], 0, QR_ECLEVEL_L, QR_MODE_8, 1);
    [self mdDrawQRCode:code context:cgContext size:self.bounds.size.width fillColor:[NSColor blackColor]];
    QRcode_free(code);

    CGContextRestoreGState(cgContext);
}

@end

使用如下视图:

MyView *myView = [[MyView alloc] initWithFrame:NSMakeRect(0, 0, 100.0, 100.0)];
myView.qrString = @"Hello World!";
NSData *data = [myView dataWithEPSInsideRect:myView.bounds];