- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在使用 CGImageCreateWithImageInRect 裁剪照片时遇到了麻烦。我的应用程序让用户移动/放大图像直到它填满 316 x 316 View ,然后我希望它裁剪框外的任何区域并将图像保存为 UIImage。我通过取 x 和 y ImageView 原点的绝对值来确定裁剪原点,因为这使我回到包含 ImageView 的 View /框的 0,0。下面是代码:
CGRect croppedRect = CGRectMake(fabs(widthDistanceToOrigin), fabs(HeightDistanceToOrigin), 316, 316);
CGImageRef croppedImageRef = CGImageCreateWithImageInRect(image.CGImage, croppedRect);
UIImage *croppedImage = [UIImage imageWithCGImage: croppedImageRef scale: 1 / (imageScale) orientation: image.imageOrientation];
CGImageRelease(croppedImageRef);
这快把我逼疯了,我无法让它裁剪我想要的区域。我已经让它正确缩放,但问题似乎出在裁剪矩形的 x 和 y 原点上,它与它应该占用的区域有很大的偏差(有时我会得到奇怪的结果)。
此外,似乎对于用手机相机拍摄的图像,我必须将裁剪矩形中的所有内容乘以 2 才能使其大小正确。很奇怪。
所以我想知道,有没有人知道如何解决这个问题,或者有没有人有更好的裁剪方法(请记住,我需要裁剪照片中的一个区域)。谢谢!
最佳答案
关于这个主题的帖子太多了,而且所有的帖子都有完全相同的答案,利用:CGImageCreateWithImageInRect但它们都没有完全解决试图裁剪的内容定位错误的问题。
然而,只有一个线程(埋藏在深处)有一个其他人都遗漏的小细节...... How to crop a UIImageView to a new UIImage in 'aspect fit' mode?
进入的'rect'参数CGImageCreateWithImageInRect(图像。CGImage,croppedRect)需要表示(取自)UIImage,而不是 UIImageView。
这应该可以解决在坐标系上定位错误的问题。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo: (NSDictionary *)info
{
oImage = [info valueForKey:UIImagePickerControllerOriginalImage];
NSLog(@"Original Image size width: %f x height: %f", oImage.size.width, oImage.size.height);
// crop image according to what the image picker view is displaying
CGRect rect = CGRectMake(0, 40, 960.0f, 960.0f); // note: 960 x 1280 is what natively comes from capturing and image
nImage = [BGViewModifiers cropImage:oImage inRect:rect];
// scale image down for display and creating kombie
CGSize size = CGSizeMake(320.0f, 320.0f);
nImage = [BGViewModifiers imageFromImage:nImage scaledToSize:size];
NSLog(@"New Image size width: %f x height: %f", [nImage size].width, [nImage size].height);
}
//ref: http://stackoverflow.com/a/25293588/2298002
+ (UIImage *)cropImage:(UIImage*)image inRect:(CGRect)rect
{
double (^rad)(double) = ^(double deg) {
return deg / 180.0 * M_PI;
};
CGAffineTransform rectTransform;
switch (image.imageOrientation) {
case UIImageOrientationLeft:
rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(90)), 0, -image.size.height);
break;
case UIImageOrientationRight:
rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-90)), -image.size.width, 0);
break;
case UIImageOrientationDown:
rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-180)), -image.size.width, -image.size.height);
break;
default:
rectTransform = CGAffineTransformIdentity;
};
rectTransform = CGAffineTransformScale(rectTransform, image.scale, image.scale);
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectApplyAffineTransform(rect, rectTransform));
UIImage *result = [UIImage imageWithCGImage:imageRef scale:image.scale orientation:image.imageOrientation];
CGImageRelease(imageRef);
return result;
}
+ (UIImage*)imageFromImage:(UIImage*)image scaledToSize:(CGSize)newSize
{
UIGraphicsBeginImageContext( newSize );
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
关于iphone - CGImageCreateWithImageInRect 没有正确裁剪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8061412/
我正在开发 iPhone 的像素化应用程序。由于用 iPhone 4 相机拍摄的照片太大,因此应用程序在更新像素化图片时运行速度非常慢,因此我尝试先创建图片的图 block ,然后只更新图 block
我在 Swift 中使用 CGImageCreateWithImageInRect 在触摸位置创建部分图像的副本。 我的代码运行良好,除非用户触摸屏幕边缘并且矩形大小落在 View 框架之外。它不是返
我正在尝试将图像裁剪成正方形,但一旦我实际尝试使用 CGImageCreateWithImageInRect() 进行裁剪,此行就会崩溃。我设置了断点并确保传递给该函数的参数不为零。 我对编程和 Sw
我正在使用这个 github 图像裁剪器:https://github.com/iosdeveloper/ImageCropper 在这个图像裁剪器中,在 init 方法中有这些行: CGRect r
我的应用程序中有一个场景,我使用截取视频的屏幕截图 [myMovieController requestThumbnailImagesAtTimes:@[@(myMovieController.cur
我在使用 CGImageCreateWithImageInRect 裁剪照片时遇到了麻烦。我的应用程序让用户移动/放大图像直到它填满 316 x 316 View ,然后我希望它裁剪框外的任何区域并将
我正在尝试使用 CGImageCreateWithImageInRect 从图像中获取子图像,但它无法正常工作。它从图像中的随机位置返回图像,而不是我指定的位置。请看下图; 我的代码是: CGImag
我正在尝试剪切图像并遮盖它....我能够成功完成..但程序在几分钟后退出并显示 101 状态 - (void) maskImage { if(scopeOn==1){ UIGr
我正在尝试拍摄图像快照,对其进行裁剪并将其保存到 UIImageView。 我已经从几十个不同的方向尝试过,但这里是一般设置。 首先,我在 ARC、XCODE 7.2 下运行它,在 6Plus 手机
我的图像无法显示,我也尝试过其他图像,但只是出现空白屏幕。 UIImage *img = [[UIImage alloc] initWithContentsOfFile:@"building-demo
我试图在触摸位置复制背景图像的一部分,然后在与裁剪部分相同的位置添加 subview 。如果我做的正确,两张图片会排成一行,你无法分辨出那里有两个 UIImageView,但它最终看起来像下面的图片。
我正在尝试实现一个 iOS 相机 View ,它可以拍摄方形照片(类似于 Instagram)。我的代码出现在下面。第一部分,框架高度设置为等于框架宽度,按预期工作,并为用户提供了一个正方形的 Vie
我正在使用 CGImageCreateWithImageInRect() 从背景图像运行时生成一个小图像,它将在每次线程调用(0.01 秒)时显示。一旦我开始通过 CGImageCreateWithI
我正在尝试使用 Swift 制作一个简单的裁剪功能。我正在尝试使用 CGImageCreateWithImageInRect 函数 - 它工作完美,但质量较差。我错过了什么吗? func retri
描述我的项目: 我有一个矩形 UIImageView 框架漂浮在白色层上。在 UIImageView 内部,我成功地创造了它在白色层后面显示背景图像的一部分的错觉。您可以四处拖动矩形,它会“重新绘制”
MonoTouch 中 CGImageCreateWithImageInRect iOS 方法的等价物是什么? 我正在尝试在 C# 中转换此 Objective-C 行: CGImageRef sam
我需要在 Swift 3.0 中实现这个 Objective-C 代码(我使用的是 Xcode 8 Beta 3): // Note: this code comes from an Obj-C ca
这是关于 CGImageCreateWithImageInRect 的文档. 它以一个 CGRect 对象作为参数。据我了解,CGRect 以点为单位 但是文档说: "References the p
当我使用 CGImageCreateWithImageInRect() 创建 CGImage 时,它会创建一个比我传入的矩形高 1 像素、宽 1 像素的矩形。为什么会这样? let rect: C
我使用以下代码从 Sprite 中获取图像。除 iPhone 4(高清版)外,它在任何地方都可以正常工作。 - (UIImage *)croppedImage:(CGRect)rect { C
我是一名优秀的程序员,十分优秀!