1.二维码生成
libqrencode介绍:是一个用C语言编写的用来解析二维条形码(QRCode)的程序库,libqrencode通过手机的CCD摄像头来扫描二维条形码。http://pan.baidu.com/s/1eQs1Epk
导入libqrencode库,下面直接代码:
1.
#
import
<Foundation/Foundation.h>
2.
3.
@interface
QRCodeGenerator : NSObject
4.
5.
+ (UIImage *)qrImageForString:(NSString *)string imageSize:(CGFloat)size;
6.
+ (UIImage *) twoDimensionCodeImage:(UIImage *)twoDimensionCode withAvatarImage:(UIImage *)avatarImage;
7.
@end
001.
#
import
"QRCodeGenerator.h"
002.
#
import
"qrencode.h"
003.
004.
enum
{
005.
qr_margin =
3
006.
};
007.
008.
@implementation
QRCodeGenerator
009.
010.
+ (
void
)drawQRCode:(QRcode *)code context:(CGContextRef)ctx size:(CGFloat)size {
011.
unsigned
char
*data =
0
;
012.
int
width;
013.
data = code->data;
014.
width = code->width;
015.
float
zoom = (
double
)size / (code->width +
2.0
* qr_margin);
016.
CGRect rectDraw = CGRectMake(
0
,
0
, zoom, zoom);
017.
018.
// draw
019.
CGContextSetFillColor(ctx, CGColorGetComponents([UIColor blackColor].CGColor));
020.
for
(
int
i =
0
; i < width; ++i) {
021.
for
(
int
j =
0
; j < width; ++j) {
022.
if
(*data &
1
) {
023.
rectDraw.origin = CGPointMake((j + qr_margin) * zoom,(i + qr_margin) * zoom);
024.
CGContextAddRect(ctx, rectDraw);
025.
}
026.
++data;
027.
}
028.
}
029.
CGContextFillPath(ctx);
030.
}
031.
032.
+ (UIImage *)qrImageForString:(NSString *)string imageSize:(CGFloat)size {
033.
if
(![string length]) {
034.
return
nil;
035.
}
036.
037.
QRcode *code = QRcode_encodeString([string UTF8String],
0
, QR_ECLEVEL_L, QR_MODE_8,
1
);
038.
if
(!code) {
039.
return
nil;
040.
}
041.
042.
// create context
043.
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
044.
CGContextRef ctx = CGBitmapContextCreate(
0
, size, size,
8
, size *
4
, colorSpace, kCGImageAlphaPremultipliedLast);
045.
046.
CGAffineTransform translateTransform = CGAffineTransformMakeTranslation(
0
, -size);
047.
CGAffineTransform scaleTransform = CGAffineTransformMakeScale(
1
, -
1
);
048.
CGContextConcatCTM(ctx, CGAffineTransformConcat(translateTransform, scaleTransform));
049.
050.
// draw QR on this context
051.
[QRCodeGenerator drawQRCode:code context:ctx size:size];
052.
053.
// get image
054.
CGImageRef qrCGImage = CGBitmapContextCreateImage(ctx);
055.
UIImage * qrImage = [UIImage imageWithCGImage:qrCGImage];
056.
057.
// some releases
058.
CGContextRelease(ctx);
059.
CGImageRelease(qrCGImage);
060.
CGColorSpaceRelease(colorSpace);
061.
QRcode_free(code);
062.
063.
return
qrImage;
064.
}
065.
066.
+ (UIImage *) twoDimensionCodeImage:(UIImage *)twoDimensionCode withAvatarImage:(UIImage *)avatarImage{
067.
068.
// two-dimension code 二维码
069.
070.
CGSize size = twoDimensionCode.size;
071.
072.
CGSize size2 =CGSizeMake(
1.0
/
5.5
* size.width,
1.0
/
5.5
* size.height);
073.
074.
075.
076.
UIGraphicsBeginImageContext(size);
077.
078.
079.
080.
[twoDimensionCode drawInRect:CGRectMake(
0
,
0
, size.width, size.height)];
081.
082.
[[self avatarImage:avatarImage] drawInRect:CGRectMake((size.width - size2.width) /
2.0
, (size.height - size2.height) /
2.0
, size2.width, size2.height)];
083.
084.
085.
086.
UIImage *resultingImage =UIGraphicsGetImageFromCurrentImageContext();
087.
088.
UIGraphicsEndImageContext();
089.
090.
return
resultingImage;
091.
092.
}
093.
094.
095.
+ (UIImage *) avatarImage:(UIImage *)avatarImage{
096.
097.
UIImage * avatarBackgroudImage = [UIImage imageNamed:@
"icon.png"
];
098.
099.
CGSize size = avatarBackgroudImage.size;
100.
101.
UIGraphicsBeginImageContext(size);
102.
103.
104.
105.
[avatarBackgroudImage drawInRect:CGRectMake(
0
,
0
, size.width, size.height)];
106.
107.
[avatarImage drawInRect:CGRectMake(
10
,
10
, size.width -
20
, size.height -
20
)];
108.
109.
110.
111.
UIImage *resultingImage =UIGraphicsGetImageFromCurrentImageContext();
112.
113.
UIGraphicsEndImageContext();
114.
115.
return
resultingImage;
116.
117.
}
118.
119.
@end
2.扫描
iOS7苹果推出了自带的扫描功能,下面直接代码:
01.
-(
void
)viewWillAppear:(BOOL)animated
02.
{
03.
[self setupCamera];
04.
}
05.
- (
void
)setupCamera
06.
{
07.
// Device
08.
_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
09.
10.
// Input
11.
_input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];
12.
13.
// Output
14.
_output = [[AVCaptureMetadataOutput alloc]init];
15.
[_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
16.
17.
// Session
18.
_session = [[AVCaptureSession alloc]init];
19.
[_session setSessionPreset:AVCaptureSessionPresetHigh];
20.
if
([_session canAddInput:self.input])
21.
{
22.
[_session addInput:self.input];
23.
}
24.
25.
if
([_session canAddOutput:self.output])
26.
{
27.
[_session addOutput:self.output];
28.
}
29.
30.
// 条码类型 AVMetadataObjectTypeQRCode
31.
_output.metadataObjectTypes =@[AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeUPCECode,AVMetadataObjectTypeCode39Code,AVMetadataObjectTypeCode39Mod43Code,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode93Code,AVMetadataObjectTypePDF417Code,AVMetadataObjectTypeQRCode,AVMetadataObjectTypeAztecCode,AVMetadataObjectTypeInterleaved2of5Code,AVMetadataObjectTypeITF14Code,AVMetadataObjectTypeDataMatrixCode] ;
32.
33.
// Preview
34.
_preview =[AVCaptureVideoPreviewLayer layerWithSession:self.session];
35.
_preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
36.
_preview.frame =CGRectMake(
20
,
110
,
280
,
280
);
37.
[self.view.layer insertSublayer:self.preview atIndex:
0
];
38.
39.
40.
41.
// Start
42.
[_session startRunning];
43.
}
44.
#pragma mark AVCaptureMetadataOutputObjectsDelegate
45.
- (
void
)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
46.
{
47.
48.
NSString *stringValue;
49.
50.
if
([metadataObjects count] >
0
)
51.
{
52.
AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:
0
];
53.
stringValue = metadataObject.stringValue;
54.
}
55.
56.
[_session stopRunning];
57.
UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@
"提示"
message:[NSString stringWithFormat:@
"结果:%@"
,stringValue] delegate:self cancelButtonTitle:nil otherButtonTitles:@
"知道了"
,@
"重新扫描"
, nil];
58.
[alert show];
59.
}
60.
- (
void
)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
61.
{
62.
if
(buttonIndex ==
0
)
63.
{
64.
[self dismissViewControllerAnimated:YES completion:^
65.
{
66.
[timer invalidate];
67.
}];
68.
69.
}
70.
else
71.
{
72.
[_session startRunning];
73.
}
74.
}