How to combine two UIImages of difference size without altering their original aspect ratios?

后端 未结 4 1221
说谎
说谎 2021-01-26 10:29

My current method of combining UIImages come from this answer on SO, as well as this popular question on resizing UIImage with aspect ratio. My current issue is the following:<

相关标签:
4条回答
  • 2021-01-26 10:56

    While doing the drawInRect, you have to redo the scaling and centering that the system did for you with AspectFill to make it match the original process. Something like this:

    CGSize fullSize = self.pictureView.image.size;
    CGSize newSize = self.outputView.frame.size;
    CGFloat scale = newSize.height/fullSize.height;
    CGFloat offset = (newSize.width - fullSize.width*scale)/2;
    CGRect offsetRect = CGRectMake(offset, 0, newSize.width-offset*2, newSize.height);
    NSLog(@"offset = %@",NSStringFromCGRect(offsetRect));
    
    UIGraphicsBeginImageContext(newSize);
    [self.pictureView.image drawInRect:offsetRect];
    [self.annotateView.image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    UIImage *combImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    self.outputView.image = combImage;
    
    0 讨论(0)
  • 2021-01-26 10:57

    When you call [self.drawView.image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; you need to modify the frame to account for the difference in aspect ratio that you described (because you are chopping some of the image off on both sides).

    That means modifying the x position and the width that you are drawing the annotation image.

    The modification is based on the difference between the 2 rects when scaled to the same height. You say this is 304, so you can initially set x to 304 and the width to newSize.width - 608 to test. But really the difference should be calculated...

    0 讨论(0)
  • 2021-01-26 11:04

    Mackworth's answer in Swift 3.x

        let fullSize:CGSize = img.size
        let newSize:CGSize = fullSize
        let scale:CGFloat = newSize.height/fullSize.height
        let offset:CGFloat = (newSize.width - fullSize.width*scale)/2
        let offsetRect:CGRect = CGRect.init(x: offset, y: 0, width: newSize.width - offset*2, height: newSize.height)
        print(NSStringFromCGRect(offsetRect))     
    
        UIGraphicsBeginImageContext(newSize);
        self.pictureView.image.draw(in: offsetRect)
        self.annotateView.image.draw(in: CGRect.init(x: 0, y: 0, width: waterMarkImage.size.width, height: waterMarkImage.size.height))
        let combImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext();
        return combImage;
    
    0 讨论(0)
  • 2021-01-26 11:12
    • Support Portrait and Landscape both type of image
    • Drawing and other subviews can be merged in my case I'm adding label to draw
      {
    
        CGSize fullSize = getImageForEdit.size;
        CGSize sizeInView = AVMakeRectWithAspectRatioInsideRect(imgViewFake.image.size, imgViewFake.bounds).size;
        CGFloat orgScale = orgScale = fullSize.width/sizeInView.width;
        CGSize newSize = CGSizeMake(orgScale * img.image.size.width, orgScale * img.image.size.height);
        if(newSize.width <= fullSize.width && newSize.height <= fullSize.height){
            newSize = fullSize;
        }
        CGRect offsetRect;
        if (getImageForEdit.size.height > getImageForEdit.size.width){
            CGFloat scale = newSize.height/fullSize.height;
            CGFloat offset = (newSize.width - fullSize.width*scale)/2;
            offsetRect = CGRectMake(offset, 0, newSize.width-offset*2, newSize.height);
        }
        else{
            CGFloat scale = newSize.width/fullSize.width;
            CGFloat offset = (newSize.height - fullSize.height*scale)/2;
            offsetRect = CGRectMake(0, offset, newSize.width, newSize.height-offset*2);
        }
        UIGraphicsBeginImageContextWithOptions(newSize, NO, getImageForEdit.scale);
        [getImageForEdit drawAtPoint:offsetRect.origin];
        //        [img.image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
        CGFloat oldScale = img.contentScaleFactor;
        img.contentScaleFactor = getImageForEdit.scale;
        [img drawViewHierarchyInRect:CGRectMake(0, 0, newSize.width, newSize.height) afterScreenUpdates:YES];
        img.contentScaleFactor = oldScale;
        UIImage *combImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        imageData = UIImageJPEGRepresentation(combImage, 1);
    }
    
    0 讨论(0)
提交回复
热议问题