我一直試圖弄清楚如何將我的小專案中的二維碼作為矢量匯出。
我從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;
}
uj5u.com熱心網友回復:
復制自How to make dataWithEPSInsideRect vector 而不是矢量格式的位圖?:創建一個離屏視圖,設定視圖的繪制方法以包含您的圖形,然后使用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];
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/358540.html
