调整图像大小时添加了细白线

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是自动释放的 - 无论如何你不应该释放它.