【问题标题】:How to make CGImageCreateWithImageInRect reference transformed image?如何使 CGImageCreateWithImageInRect 参考转换图像?
【发布时间】:2014-06-02 17:03:20
【问题描述】:

Xcode 5、iOS 7

我正在将图像加载到 UIImage 中,然后将其复制到另一个具有 Mirror 变换的 UIImage 中,即:

self.imageB.image=[UIImage imageWithCGImage:[self.imageA.image CGImage] scale:1.0 orientation:UIImageOrientationUpMirrored];

接下来,我尝试在保存时将两张图片合二为一(originalImage指的是在复制/转换为imageA和imageB之前加载的图片):

newSize=CGSizeMake(originalImage.size.width*2,originalImage.size.height);
UIGraphicsBeginImageContext(newSize);
UIImage *leftImage=self.imageA.image;
UIImage *rightImage=self.imageB.image;
[self.imageA.image drawInRect:CGRectMake(0,0,newSize.width/2,newSize.height)];
[self.imageB.image drawInRect:CGRectMake(newSize.width/2,0,newSize.width/2,newSize.height) blendMode:kCGBlendModeNormal alpha:1.0];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(newImage, nil, nil, nil);

这可行,并为我提供了一个保存的镜像。 但是,我正在尝试仅使用 mageA 和 imageB 的子区域来执行此操作, 结果是 imageB 的部分失去了它的镜像转换。 我最终得到了最终的两侧具有相同的方向!(注意:visRatio 是我要保留的图像的百分比)

newSize=CGSizeMake(originalImage.size.width*2,originalImage.size.height);
UIGraphicsBeginImageContext(newSize);
UIImage *leftImage=self.imageA.image;
UIImage *rightImage=self.imageB.image;

CGRect clippedRectA  = CGRectMake(0,0,originalImage.size.width*visRatio,originalImage.size.height);
CGImageRef imageRefA = CGImageCreateWithImageInRect([self.imageA.image CGImage], clippedRectA);
UIImage *leftImageA   = [UIImage imageWithCGImage:imageRefA];
[leftImageA drawInRect:CGRectMake(0,0,newSize.width/2,newSize.height)];

CGRect clippedRectB  = CGRectMake(originalImage.size.width-(originalImage.size.width*visRatio),0,originalImage.size.width*visRatio,originalImage.size.height);
CGImageRef imageRefB = CGImageCreateWithImageInRect([self.imageB.image CGImage], clippedRectB);
UIImage *rightImageB   = [UIImage imageWithCGImage:imageRefB];
[rightImageB drawInRect:CGRectMake(newSize.width/2,0,newSize.width/2,newSize.height) blendMode:kCGBlendModeNormal alpha:1.0];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(newImage, nil, nil, nil);

就好像“CGImageCreateWithImageInRect”从原始数据而不是转换后的数据复制图像。 如何在不丢失 imageB 的镜像转换的情况下完成此操作?

【问题讨论】:

    标签: ios objective-c graphics


    【解决方案1】:

    我想通了 - 这将使用在 originalImage 中打开的原始全分辨率数据并保存一个剪辑后的转换版本(为简单起见,我在这篇文章中省略了镜像):

        //capture the transformed version
        CGSize tmpSize=CGSizeMake(originalImage.size.width, originalImage.size.height);
        UIGraphicsBeginImageContext(tmpSize);
        [self.imageA.image drawInRect:CGRectMake(0,0, tmpSize.width, tmpSize.height)];
        UIImage *tmpImageA=UIGraphicsGetImageFromCurrentImageContext();
        visRatio=0.5;
        //clip it
        clippedRectA=CGRectMake(0,0,roundf(originalImage.size.width*visRatio),originalImage.size.height);
        imageRefA=CGImageCreateWithImageInRect([tmpImageA CGImage],clippedRectA);
        leftImageA=[UIImage imageWithCGImage:imageRefA];
        UIGraphicsEndImageContext();
    
        savedImage=UIGraphicsGetImageFromCurrentImageContext();
        UIImageWriteToSavedPhotosAlbum(savedImage, nil, nil, nil);
    

    我认为关键是将图像绘制到上下文中,然后使用上下文进行裁剪/保存,而不是主图像 (imageA)。 如果您找到更有效的方法,请发布! 否则,我希望这对其他人有所帮助....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多