objective-c - 将 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;
}
解决方案
复制自如何制作 dataWithEPSInsideRect 向量而不是向量格式的位图?:创建一个离屏视图,设置视图的绘制方法以包含您的图形,然后使用NSView
'dataWithEPSInsideRect:
方法。
我做了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];
推荐阅读
- python - 部署谷歌云功能时出现EOFError
- c# - 更新页面时出现 Blazor Server System.ObjectDisposedException 问题
- python - 将 python 转换为包含单个单元格的 jupyter
- docker - 无法在 docker 容器内跟踪 .log 文件
- sql-server - 如何执行数据库 A/Server A 中存在的存储过程并同时查询数据库 B/Server B?
- docker - 是否可以将帧从 docker 容器重定向到wireshark?
- amazon-web-services - 如何在 python AWS CDK 中使用 s3 LifecycleRule tag_filters
- html - 如何使用 CSS 更改颜色
- ruby - Ruby 在另一个模块中包含错误模块 - 未初始化的常量错误
- java - 在 Hotspot JVM 中,为什么 CDS 需要 Compressed Oops?