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는 샘플이 누군가를하는 데 도움이! 나는 이것에 관한 비디오 튜토리얼을 진행할 것입니다. 어떤 종류의 수요가 있느냐에 따라 달라질 수 있습니다.