通过使用 UIGraphicsBeginImageContext 和 drawRect 在 ios 中拼贴 imageView 来计算图像大小和位置
Posted
技术标签:
【中文标题】通过使用 UIGraphicsBeginImageContext 和 drawRect 在 ios 中拼贴 imageView 来计算图像大小和位置【英文标题】:calculatiing Image size & position by using UIGraphicsBeginImageContext & drawRect to collage imageView in ios 【发布时间】:2015-05-22 14:14:09 【问题描述】:我正在尝试使用 UIGraphicsBeginImageContext 创建拼贴图像。但是裁剪图像的特定位置并将 imageView 放置在视图中的适当位置,这让我抓狂。到目前为止我的尝试:
-(void) viewWillAppear:(BOOL)animated
[self noOfImages:2]; // no of images method used for how many image you want to show in the view. Currently I needed a collage imageView upto 3 images
-(void)noOfImages:(int)num
if (num==2)
UIImageView *One=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, containerView.frame.size.width, containerView.frame.size.height)];
[One setBackgroundColor:[UIColor grayColor]];
[One setImage:[UIImage imageNamed:@"1.jpg"]];
UIImageView *Two=[[UIImageView alloc] initWithFrame:CGRectMake(containerView.frame.size.width/2, 0, containerView.frame.size.width/2, containerView.frame.size.height)];
[Two setBackgroundColor:[UIColor grayColor]];
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"2" ofType:@"jpg"];
UIImage *existingImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
// Create new image context (retina safe)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), NO, [UIScreen mainScreen].scale);
// Create rect for image
CGRect rect = CGRectMake(1, 0, containerView.frame.size.width, containerView.frame.size.height);
// Draw the image into the rect
[existingImage drawInRect:rect];
// Saving the image, ending image context
UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[Two setImage:newImage];
[containerView addSubview:One];
[containerView addSubview:Two];
else if (num==3)
UIImageView *One=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, containerView.frame.size.width, containerView.frame.size.height)];
[One setBackgroundColor:[UIColor grayColor]];
[One setImage:[UIImage imageNamed:@"1.jpg"]];
UIImageView *Two=[[UIImageView alloc] initWithFrame:CGRectMake(containerView.frame.size.width/2, 0, containerView.frame.size.width/2, containerView.frame.size.height/2)];
[Two setBackgroundColor:[UIColor grayColor]];
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"2" ofType:@"jpg"];
UIImage *existingImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
// Create new image context (retina safe)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), NO, [UIScreen mainScreen].scale);
// Create rect for image
CGRect rect = CGRectMake(1, 0, containerView.frame.size.width, 200);
// Draw the image into the rect
[existingImage drawInRect:rect];
// Saving the image, ending image context
UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[Two setImage:newImage];
UIImageView *Three=[[UIImageView alloc] initWithFrame:CGRectMake(containerView.frame.size.width/2, containerView.frame.size.height/2, containerView.frame.size.width/2, containerView.frame.size.height/2)];
[Three setBackgroundColor:[UIColor grayColor]];
NSString *imagePath3 = [[NSBundle mainBundle] pathForResource:@"3" ofType:@"jpg"];
UIImage *existingImage3 = [[UIImage alloc] initWithContentsOfFile:imagePath3];
// Create new image context (retina safe)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), NO, [UIScreen mainScreen].scale);
// Create rect for image
CGRect rect3 = CGRectMake(1, 0, containerView.frame.size.width, 200);
// Draw the image into the rect
[existingImage3 drawInRect:rect3];
// Saving the image, ending image context
UIImage * newImage3 = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[Three setImage:newImage3];
[containerView addSubview:One];
[containerView addSubview:Two];
[containerView addSubview:Three];
两个图像的输出应该是:
三个图像的输出应该是:
实际上,当我使用 200x200 图像时,输出是正确的。但是此代码不适用于我不知道高度和宽度的动态图像。此外,右侧图像有点拉伸,并且对于拖曳图像的位置不正确。右侧图像的 x 位置应该从中间点开始到结束,而不是从起点到中间。我知道我的计算是错误的。但无法使用 UIGraphicsBeginImageContextWithOptions 或作为子视图添加的 imageview 设置正确的高度、宽度、位置或裁剪。
我需要如下输出: 对于两个图像 - 第一个图像的一半在左边,另一个图像的一半在右边。 三张图片 - 第一张图片的一半在左边,第二张图片的一半在右上角,第三张图片的一半在右下角。
【问题讨论】:
你的问题不清楚。我们需要更具体地了解您希望如何裁剪和放置图像。您展示了图片,但我们不知道您希望它们是什么样子,也不知道您展示的图片有什么问题。 【参考方案1】:将第二张图片按比例放大,然后将其放置在应有的位置。直接在项目中编写代码会更容易。
【讨论】:
以上是关于通过使用 UIGraphicsBeginImageContext 和 drawRect 在 ios 中拼贴 imageView 来计算图像大小和位置的主要内容,如果未能解决你的问题,请参考以下文章
通过 Join-Where-Group 通过选择查询避免使用临时的正确索引;使用文件排序
如何使用 SLRequest 通过 iOS 更改为通过 <AppName>
使用 mailR 包通过 R 通过 Outlook 发送经过身份验证的邮件
通过使用 pybind11 的虚函数通过引用传递 std::vector 的问题