Xcode 如何使用CGImageRef在不增加像素的情况下循环调整大小的图像部分?

Xcode 如何使用CGImageRef在不增加像素的情况下循环调整大小的图像部分?,xcode,image,resize,tile,cgimageref,Xcode,Image,Resize,Tile,Cgimageref,我试图创造一种效果,看起来好像两个图像相互交织。因此,我将第一幅图像缩放为背景,并在背景上使用几个UIImageView在第二幅图像上循环,以提供所需的外观。当我使用的图像不需要缩放到适合的大小,并且是我的显示器的大小,但当我使用UIGraphics调整图像大小时,我遇到了图像质量下降的问题,这一点很有效。如有任何建议,将不胜感激 图1.jpg是2112 × 2816 图2.jpg为2000 × 3008 UIImage *bgImage = [UIImage imageNamed:@"1.jp

我试图创造一种效果,看起来好像两个图像相互交织。因此,我将第一幅图像缩放为背景,并在背景上使用几个UIImageView在第二幅图像上循环,以提供所需的外观。当我使用的图像不需要缩放到适合的大小,并且是我的显示器的大小,但当我使用UIGraphics调整图像大小时,我遇到了图像质量下降的问题,这一点很有效。如有任何建议,将不胜感激

图1.jpg是2112 × 2816

图2.jpg为2000 × 3008

UIImage *bgImage = [UIImage imageNamed:@"1.jpg"];
UIImageView *bgView = [[UIImageView alloc] initWithImage:bgImage];
bgView.contentMode = UIViewContentModeScaleToFill;
bgView.frame = CGRectMake(0,0,CGRectGetWidth(self.view.frame), (CGRectGetWidth(self.view.frame) / bgImage.size.width) * bgImage.size.height);

bgView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[self.view addSubview:bgView];

UIImage *frontImage = [UIImage imageNamed:@"2.jpg"];
CGSize newSize = CGSizeMake(CGRectGetWidth(self.view.frame), (CGRectGetWidth(self.view.frame)/frontImage.size.width) * frontImage.size.height);
UIGraphicsBeginImageContextWithOptions(newSize, YES, 0.0);
[frontImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

int count = 0;
int varX = 10;
int varY = 10;

CGFloat width = self.view.frame.size.width;
CGFloat height = self.view.frame.size.height;
CGFloat tileWidth = width / varX;
CGFloat tileHeight = height / varY;

for (int x = 0; x < varX; x++) {
    for (int y = 0; y < varY; y++) {

        NSLog(@"%f, %f, %f, %f",x*tileWidth, y*tileHeight, tileWidth, tileHeight);

        CGImageRef scaledRef = CGImageCreateWithImageInRect(scaledImage.CGImage, CGRectMake(x*tileWidth, y*tileHeight, tileWidth, tileHeight));
        UIImage *image = [UIImage imageWithCGImage:scaledRef scale:scaledImage.scale orientation:scaledImage.imageOrientation];
        UIImageView *bgx = [[UIImageView alloc] initWithImage:image];
        CGImageRelease(scaledRef);

        bgx.frame = CGRectMake((x*tileWidth), (y*tileHeight), tileWidth, tileHeight);
        bgx.backgroundColor = [UIColor yellowColor];
        bgx.contentMode = UIViewContentModeTopLeft;

        if(count%2==0){
            [self.view addSubview:bgx];
        }
        count++;
    }
    count++;
}
UIImage*bgImage=[UIImage-imagename:@“1.jpg”];
UIImageView*bgView=[[UIImageView alloc]initWithImage:bgImage];
bgView.contentMode=UIViewContentModeScaleToFill;
bgView.frame=CGRectMake(0,0,CGRectGetWidth(self.view.frame),(CGRectGetWidth(self.view.frame)/bgImage.size.width)*bgImage.size.height);
bgView.autoresizingMask=uiviewautoresizingflexiblewhight | UIViewAutoresizingFlexibleWidth;
[self.view addSubview:bgView];
UIImage*frontImage=[UIImage ImageName:@“2.jpg”];
CGSize newSize=CGSizeMake(CGRectGetWidth(self.view.frame),(CGRectGetWidth(self.view.frame)/frontImage.size.width)*frontImage.size.height);
UIGraphicsBeginImageContextWithOptions(newSize,YES,0.0);
[frontImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage*ScaleImage=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsSendImageContext();
整数计数=0;
int-varX=10;
int=10;
CGFloat宽度=self.view.frame.size.width;
CGFloat高度=self.view.frame.size.height;
CGFloat tileWidth=宽度/varX;
CGFloat tileHeight=高度/变化;
对于(int x=0;x
通过将循环中的第二行更改为:

 CGImageRef scaledRef = CGImageCreateWithImageInRect(scaledImage.CGImage, CGRectMake(x*(tileWidth*2), y*(tileHeight*2), tileWidth*2, tileHeight*2));
我以前的输出是2倍,但我不知道为什么一开始就是这样


任何见解都值得赞赏。

不清楚您是放大还是缩小。放大总是会产生更差的图像质量。对于一般的缩放,我使用这个UIImage类别已经很多年了:我认为您的输出可能是关闭的,因为您正在绘制
frontImage
(比例
1.0
)的图形上下文中,比例
2.0
。尝试在非视网膜模拟器中运行新代码-如果我是对的,您添加的
*2
将以另一种方式破坏图像渲染。在非视网膜模拟器上测试,您是对的!谢谢