UIGraphicsBeginImageContext drawInRect 不准确
UIGraphicsBeginImageContext drawInRect inaccurate
我正在使用此方法压缩 UIImage
if (actualHeight > maxHeight || actualWidth > maxWidth)
{
if(imgRatio < maxRatio)
{
//adjust width according to maxHeight
imgRatio = maxHeight / actualHeight;
actualWidth = imgRatio * actualWidth;
actualHeight = maxHeight;
}
else if(imgRatio > maxRatio)
{
//adjust height according to maxWidth
imgRatio = maxWidth / actualWidth;
actualHeight = imgRatio * actualHeight;
actualWidth = maxWidth;
}
else
{
actualHeight = maxHeight;
actualWidth = maxWidth;
}
}
CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight);
UIGraphicsBeginImageContext(rect.size);
[image drawInRect:rect];
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
NSData *imageData = UIImageJPEGRepresentation(img, compressionQuality);
UIGraphicsEndImageContext();
但是对于某些UIImage
,在它们的底部,有一条1像素的白线。 对可能的原因有什么建议吗?
非常感谢!
问题可能是您正在使用 CGFloats 而您是 multiplying/dividing 它们,这会导致非整数坐标。
行
actualWidth = imgRatio * actualWidth;
和
actualHeight = imgRatio * actualHeight;
可能会导致非整数坐标。使用 ceilf
或 floorf
或 roundf
来解决这个问题。例如
actualWidth = ceilf(imgRatio * actualWidth);
actualHeight = ceilf(imgRatio * actualHeight);
没有它会怎样
CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight);
实际上可能是 (0,0,24.33, 24.33)
您实际上可能正在绘制这种尺寸的矩形,但图像必须具有
高度和宽度的像素数,因此 Apple 可能会向上舍入矩形以创建图像上下文。
但是他们可能使用抗锯齿绘制它,所以它在视觉上看起来真的像非整数像素。这就是为什么您会看到白线并且可能还会出现质量下降的原因。
我正在使用此方法压缩 UIImage
if (actualHeight > maxHeight || actualWidth > maxWidth)
{
if(imgRatio < maxRatio)
{
//adjust width according to maxHeight
imgRatio = maxHeight / actualHeight;
actualWidth = imgRatio * actualWidth;
actualHeight = maxHeight;
}
else if(imgRatio > maxRatio)
{
//adjust height according to maxWidth
imgRatio = maxWidth / actualWidth;
actualHeight = imgRatio * actualHeight;
actualWidth = maxWidth;
}
else
{
actualHeight = maxHeight;
actualWidth = maxWidth;
}
}
CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight);
UIGraphicsBeginImageContext(rect.size);
[image drawInRect:rect];
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
NSData *imageData = UIImageJPEGRepresentation(img, compressionQuality);
UIGraphicsEndImageContext();
但是对于某些UIImage
,在它们的底部,有一条1像素的白线。 对可能的原因有什么建议吗?
非常感谢!
问题可能是您正在使用 CGFloats 而您是 multiplying/dividing 它们,这会导致非整数坐标。
行
actualWidth = imgRatio * actualWidth;
和
actualHeight = imgRatio * actualHeight;
可能会导致非整数坐标。使用 ceilf
或 floorf
或 roundf
来解决这个问题。例如
actualWidth = ceilf(imgRatio * actualWidth);
actualHeight = ceilf(imgRatio * actualHeight);
没有它会怎样
CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight);
实际上可能是 (0,0,24.33, 24.33)
您实际上可能正在绘制这种尺寸的矩形,但图像必须具有
高度和宽度的像素数,因此 Apple 可能会向上舍入矩形以创建图像上下文。
但是他们可能使用抗锯齿绘制它,所以它在视觉上看起来真的像非整数像素。这就是为什么您会看到白线并且可能还会出现质量下降的原因。