如何使用CGImageRef来循环调整大小而不增加像素的图像部分?
我想创建一个看起来好像2个图像互相交织的效果。所以我缩放了第一张图片作为背景,并且我在背景上使用了几个UIIMageView来循环播放第二张图片,以提供我想要的外观。这适用于我使用不需要缩放以适合显示尺寸的图像,但是当我使用UIGraphics调整图像大小时,出现图像质量下降的问题。任何建议将不胜感激。如何使用CGImageRef来循环调整大小而不增加像素的图像部分?
图片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++;
}
我能够通过改变第二线在我的循环来解决我的问题:
CGImageRef scaledRef = CGImageCreateWithImageInRect(scaledImage.CGImage, CGRectMake(x*(tileWidth*2), y*(tileHeight*2), tileWidth*2, tileHeight*2));
我之前的输出结果是2倍,但我不知道为什么会这样。
任何洞察力是赞赏。
我认为你的输出可能是关闭的,因为你正在绘制'frontImage' ('scale'为'1.0'的图像)放在图形上下文中,其缩放比例为2.0。尝试在非Retina模拟器中运行你的新代码 - 如果我是对的,你的'* 2'加法会以另一种方式破坏图像。 – 2014-10-01 17:46:40
在非视网膜模拟器上测试过,你是对的!谢谢! – sfbarry14 2014-10-01 21:35:07
目前尚不清楚您是向上还是向下放大。放大将总会产生更差的图像质量。对于一般缩放,我多年来一直使用这个UIImage类别:http://www.catamount.com/forums/viewtopic.php?f=21&t=967&sid=b1096cb20757776f3259c1bd8f7db7ee – 2014-10-01 10:46:28