gpt4 book ai didi

iphone - iOS:裁剪从带有叠加层的 UIImagePickerController 相机抓取的静止图像

转载 作者:可可西里 更新时间:2023-11-01 03:26:46 29 4
gpt4 key购买 nike

我是 iOS 的新手,过去一周我一直在为此苦苦挣扎,在网上四处寻找教程,例如:Dealing with Exif Images , Resizing images ,以及更多关于 StackOverflow 的随机问题。从这些,我认为>=iOS 4.0,所有从相机拍摄的图像都包含基于EXIF的旋转信息。

什么不起作用:尝试不同的图像裁剪技术后,我最终得到的只是在一些随机角裁剪图像,而且生成的图像似乎被放大了:(当我使用来自互联网的 png 图像(不包含 EXIF 数据),裁剪工作正常。我的意思是随机角 - 图像最终被裁剪在右上角/顶部 -向左并放大。

我想要完成的事情:
我正在尝试从顶部裁剪图像 100 px,从底部裁剪 100 px。本质上,我使用了两个覆盖条 - 1 个在顶部,1 个在底部,CGRect(0.0, 0.0, SCREEN_WIDTH, 100.0) [a 100.0 px 高 strip 在顶部] 和另一个 CGRect(0.0, SCREEN_HEIGHT - 100, SCREEN_WIDTH, 100.0) [另一个 100 px strip 在底部]。我需要在这两个 strip 之间获取图像:我假设图像的高度为:SCREEN_HEIGHT - 200.0

为带覆盖的相机显示 UIImagePickerController:


//SCREEN_HEIGHT = 480 and SCREEN_WIDTH = 320
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO)
{
NSLog(@"Camera not available");
return;
}

imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.delegate = self;
imagePicker.allowsEditing = NO;


// Hide the controls
imagePicker.showsCameraControls = NO;
imagePicker.navigationBarHidden = YES;

// Make camera view full screen
imagePicker.wantsFullScreenLayout = YES;
//imagePicker.cameraViewTransform = CGAffineTransformScale(imagePicker.cameraViewTransform, CAMERA_TRANSFORM_X, CAMERA_TRANSFORM_Y);


//Overlay
//OverlayView is a plain UIView with the CGRects mentioned in the question.
OverlayView *overlay = [[OverlayView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
[overlay initOverlay:self];
imagePicker.cameraOverlayView = overlay;
[self presentModalViewController:imagePicker animated:YES];

根据 EXIF imageOrientation 属性旋转图像并裁剪的代码


- (UIImage *) cropImage: (UIImage *) originalImage
{

CGRect cropRect = CGRectMake(0, 100.0, SCREEN_WIDTH, SCREEN_HEIGHT - 100);

CGRect transformedRect = [self TransformCGRectForUIImageOrientation:cropRect :originalImage.imageOrientation :originalImage.size];

CGImageRef resultImageRef = CGImageCreateWithImageInRect(originalImage.CGImage, transformedRect);

UIImage *newImage = [[[UIImage alloc] initWithCGImage:resultImageRef scale:1.0 orientation:originalImage.imageOrientation] autorelease];

return newImage;
}

- (CGRect) TransformCGRectForUIImageOrientation: (CGRect) source: (UIImageOrientation) orientation: (CGSize) imageSize {

switch (orientation) {
case UIImageOrientationLeft: { // EXIF #8
CGAffineTransform txTranslate = CGAffineTransformMakeTranslation(
imageSize.height, 0.0);
CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate,
M_PI_2);
return CGRectApplyAffineTransform(source, txCompound);
}
case UIImageOrientationDown: { // EXIF #3
CGAffineTransform txTranslate = CGAffineTransformMakeTranslation(
imageSize.width, imageSize.height);
CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate,
M_PI);
return CGRectApplyAffineTransform(source, txCompound);
}
case UIImageOrientationRight: { // EXIF #6
CGAffineTransform txTranslate = CGAffineTransformMakeTranslation(
0.0, imageSize.width);
CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate,
M_PI + M_PI_2);
return CGRectApplyAffineTransform(source, txCompound);
}
case UIImageOrientationUp: // EXIF #1 - do nothing
default: // EXIF 2,4,5,7 - ignore
return source;
}

cropImage 方法似乎适用于从互联网下载的图像(不包含任何方向信息)。我的选项用完了。有人可以帮我吗?

感谢阅读!

最佳答案

如果可以的话,跳过使用 Core Graphics 绘制图像会更容易:

- (UIImage *)cropImage:(UIImage *)oldImage {
CGSize imageSize = oldImage.size
UIGraphicsBeginImageContextWithOptions( CGSizeMake( imageSize.width,
imageSize.height - 200),
NO,
0.);
[oldImage drawAtPoint:CGPointMake( 0, -100)
blendMode:kCGBlendModeCopy
alpha:1.];
UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return croppedImage;
}

关于iphone - iOS:裁剪从带有叠加层的 UIImagePickerController 相机抓取的静止图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8494798/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com