通过使用 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 的问题

如何使用 IP 地址(通过 InetAddress)通过 JDBC 与 MySQL 建立连接?

使用通过引用传递的参数(通过指针)优化 OpenCL 函数中的指针访问