rpt*_*thi 16 iphone image objective-c iphone-sdk-3.0
当我们调整图像大小时(下载之后和存储在文档目录中之前),通过以下代码:
-(UIImage *)resizeImage:(UIImage *)image withSize:(CGSize)newSize
{
float actualHeight = image.size.height;
float actualWidth = image.size.width;
float imgRatio = actualWidth/actualHeight;
float maxRatio = newSize.width/newSize.height;
if(imgRatio!=maxRatio){
if(imgRatio < maxRatio){
imgRatio = newSize.width / actualHeight;
actualWidth = imgRatio * actualWidth;
actualHeight = newSize.width;
}
else{
imgRatio = newSize.height / actualWidth;
actualHeight = imgRatio * actualHeight;
actualWidth = newSize.height;
}
}
CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight);
UIGraphicsBeginImageContext(rect.size);
[image drawInRect:rect];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//[resizedImage release];
return [resizedImage autorelease];
}
Run Code Online (Sandbox Code Playgroud)
这会产生一个重新调整大小的图像,并在其方向上添加了细白线(就好像图像是横向白色线被添加到它的底部,如果图像是肖像白色线被添加到它的右手).
请告诉我,如何摆脱那条白线?
谢谢.
wal*_*lky 24
虽然以浮点单位指定大小,但实际图像始终是整数像素.
当您计算新尺寸以保持纵横比时,通常只有一个边作为整数像素,而另一个尺度则具有一些小数部分.然后,当您将旧图像绘制到该矩形时,它不会完全填充新图像.因此,您所看到的白线是图形系统渲染像素的方式,这些像素是部分图像,部分背景.
从本质上讲,你想做的事情是不太可能的,所以你需要以某种方式捏造它.有几种可能性:
缩放图像,使得纵横比不能完美保留,但是您有整数值,例如通过舍入:
actualWidth = round(imgRatio * actualWidth);
Run Code Online (Sandbox Code Playgroud)保持纵横比但剪切小数边缘.最简单的方法是使图像上下文更小:
UIGraphicsBeginImageContext(CGSizeMake(floor(actualWidth), floor(actualHeight)));
[image drawInRect:rect];
Run Code Online (Sandbox Code Playgroud)首先用一些不如白色的颜色填充背景.显然,这是一个可怕的kludge,但在适当的情况下可能会有效,例如,如果你总是在黑色背景下绘制图像.
另外,你不能在之后调用任何东西return,所以你的最后release一行没有做任何事情.这也是因为返回的图像UIGraphicsGetImageFromCurrentImageContext是自动释放的 - 无论如何你不应该释放它.