将 QR 导出到矢量 NSImage & CGPDFContextCreate - macOS ObjC



我一直在想如何将我的小项目上的二维码导出为矢量。

我从最初生成图像的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;
}

复制自如何使用EPSInsideRect矢量而不是矢量格式的位图制作数据?:创建一个屏幕外视图,设置视图的绘制方法以包含图形,然后使用NSViewdataWithEPSInsideRect:方法。

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

@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];

相关内容

  • 没有找到相关文章

最新更新