2013-05-22 1 views
1

ZXing을 사용하여 바코드를 확대하는 데 도움이되는 인터넷 유형을 고수하고 모든 유형의 코드를 찾고 있습니다. AVFoundation에서 Zxing 줌 기능

는 여기

내가 1920 × 1080에 기본 해상도를 증가 할 수 있었다 그 이후

https://github.com/zxing/zxing

자신의 자식 사이트에서 코드를 시작했다.

self.captureSession.sessionPreset = AVCaptureSessionPreset1920x1080;

괜찮 으면 좋겠지 만 문제는 아주 작은 바코드를 스캔한다는 것입니다. 심지어 1920x1080이 작동해도 초점을 잃지 않고 더 작은 바코드에 가깝게 캡처 할 수있는 모든 종류의 줌을 제공합니다. 이제 해상도가 나에게 도움이되었지만 단순히 충분하지 않았습니다.

내 생각에 1920x1080 인 스크롤보기로 캡처 세션을 설정 한 다음 실제 이미지 캡처를 설정하여 화면 경계에서 가져 와서 스크롤보기를 확대/축소 할 수 있습니다 자체가 "확대"효과를 얻을 수 있습니다.

문제는 어디에서 시작해야할지 모르겠다. 아이디어가 있습니까?

답변

2

Ok 여기서는 여러 번 본 적이 없으므로 아무도 답변을 얻지 못하는 것 같습니다. 나는 내 대답을 나눌 줄 알았다.

NO ONE이 (가) 알고있는 것처럼 2 가지 특징이 있습니다. 둘 다 나쁜 표정.

이제 iOS 6 이상에서는 첫 번째 것이 좋습니다. Apple은 setVideoScaleAndCropfactor라는 속성을 추가했습니다.

이 설정은 this를 반환합니다. 이것은 CGFloat 유형입니다. 유일한 단점은 AVConnection에 값을 설정 한 다음 stillImageCapture에 대한 연결을 설정해야한다는 것입니다. iOS 6의 다른 기능과는 작동하지 않습니다. 이제 이것을 수행하려면 비동기식으로 작업하도록 설정해야하며 디코더가 작동하고 해당 크기로 사진을 찍을 수 있도록 코드를 루프해야합니다.

마지막으로 직접 미리보기 레이어의 크기를 조절해야한다는 것입니다.

이 모든 것이 많은 작업처럼 들립니다. 그리고 그것은 정말로 사실입니다. 그러나이 옵션을 사용하면 원본 스캔 사진을 1920x1080으로 찍거나 설정 한 것으로 설정합니다. 디코더가 바코드를 놓치게하는 원인이되는 픽셀을 늘리는 현재 이미지를 스케일링하는 것이 아닙니다. 이

SP 지금이

stillImageConnection = [stillImageOutput connectionWithMediaType:AVMediaTypeVideo]; 
[stillImageConnection setVideoOrientation:AVCaptureVideoOrientationPortrait]; 
[stillImageConnection setVideoScaleAndCropFactor:effectiveScale]; 
[stillImageOutput setOutputSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCMPixelFormat_32BGRA] 
                   forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; 
[stillImageOutput captureStillImageAsynchronouslyFromConnection:stillImageConnection 
               completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) 
{ 
    if(error) 
     return; 
    NSString *path = [NSString stringWithFormat:@"%@%@", 
         [[NSBundle mainBundle] resourcePath], 
         @"/blank.wav"]; 
    SystemSoundID soundID; 
    NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO]; 
    AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID); 
    AudioServicesPlaySystemSound(soundID); 
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(imageDataSampleBuffer); 
    /*Lock the image buffer*/ 
    CVPixelBufferLockBaseAddress(imageBuffer,0); 
    /*Get information about the image*/ 
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
    size_t width = CVPixelBufferGetWidth(imageBuffer); 
    size_t height = CVPixelBufferGetHeight(imageBuffer); 

    uint8_t* baseAddress = CVPixelBufferGetBaseAddress(imageBuffer); 
    void* free_me = 0; 
    if (true) { // iOS bug? 
     uint8_t* tmp = baseAddress; 
     int bytes = bytesPerRow*height; 
     free_me = baseAddress = (uint8_t*)malloc(bytes); 
     baseAddress[0] = 0xdb; 
     memcpy(baseAddress,tmp,bytes); 
    } 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef newContext = 
    CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, 
          kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst); 

    CGImageRef capture = CGBitmapContextCreateImage(newContext); 
    CVPixelBufferUnlockBaseAddress(imageBuffer,0); 
    free(free_me); 

    CGContextRelease(newContext); 
    CGColorSpaceRelease(colorSpace); 

    Decoder* d = [[Decoder alloc] init]; 
    [self decoding:d withimage:&capture]; 
}]; 

} 

내가 방금 말한 모든 것을 바꿀 것 아이폰 OS 7에오고 두 번째처럼 보일 것입니다. videoZoomFactor라는 새 속성이 있습니다. 이것은 CGFloat입니다. 그러나 그것은 단지 정지 이미지처럼 영향을주기보다는 스택의 TOP에서 모든 것을 변경합니다.

다른 말로하면 미리보기 레이어를 수동으로 확대해야 할 필요가 없습니다. 당신은 일부 stillimagecaptureloop을 거치지 않고 AVConnection에 설정하지 않아도됩니다. 단순히 CGFloat를 설정하면 모든 것을 확장 할 수 있습니다.

이제 iOS 7 응용 프로그램을 게시하기 전에 일정이 오래 될 것입니다. 그래서 나는 이것을 어렵게하는 방법을 생각해내는 것을 진지하게 고려할 것입니다. 빠른 팁.pinch 및 zoom 제스처를 사용하여 setvideoscale 및cropfactor에 대한 CGFloat를 설정합니다. 너의 didload에서 1로 값을 설정하는 것을 잊지 마라. 그러면 거기에서 확장 할 수있다. 동시에 제스처에서 CATransaction을 사용하여 미리보기 레이어의 크기를 조절할 수 있습니다.

제스처 캡처 및 미리보기 계층에게

- (IBAction)handlePinchGesture:(UIPinchGestureRecognizer *)recognizer 
    { 
effectiveScale = recognizer.scale; 
if (effectiveScale < 1.0) 
    effectiveScale = 1.0; 
if (effectiveScale > 25) 
    effectiveScale = 25; 

stillImageConnection = [stillImageOutput connectionWithMediaType:AVMediaTypeVideo]; 
[stillImageConnection setVideoScaleAndCropFactor:effectiveScale]; 

[CATransaction begin]; 
[CATransaction setAnimationDuration:0]; 
[prevLayer setAffineTransform:CGAffineTransformMakeScale(effectiveScale, effectiveScale)]; 
[CATransaction commit]; 

} 

희망을 수행하는 방법의 Heres는 샘플이 누군가를하는 데 도움이! 나는 이것에 관한 비디오 튜토리얼을 진행할 것입니다. 어떤 종류의 수요가 있느냐에 따라 달라질 수 있습니다.