drawInRect:失去图像分辨率的质量

Posted

技术标签:

【中文标题】drawInRect:失去图像分辨率的质量【英文标题】:drawInRect: losing Quality of Image resolution 【发布时间】:2013-02-06 12:23:45 【问题描述】:

我正在尝试使用以下代码擦除图像

 CGColorRef strokeColor = [UIColor whiteColor].CGColor;

 UIGraphicsBeginImageContext(imgForeground.frame.size);

 CGContextRef context = UIGraphicsGetCurrentContext();
 [imgForeground.image drawInRect:CGRectMake(0, 0, imgForeground.frame.size.width, imgForeground.frame.size.height)];

 CGContextSetLineCap(context, kCGLineCapRound);
 CGContextSetLineWidth(context, 10);

 CGContextSetStrokeColorWithColor(context, strokeColor);
 CGContextSetBlendMode(context, kCGBlendModeClear);

 CGContextBeginPath(context);
 CGContextMoveToPoint(context, lastPoint.x, lastPoint.y);
 CGContextAddLineToPoint(context, currentPoint.x, currentPoint.y);
 CGContextStrokePath(context);

 imgForeground.image  = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

但我只是发现 Image 由于 drawInRect 而失去了分辨率。

【问题讨论】:

上传“之前”和“之后”的屏幕截图对于涉及视觉效果的问题有很大帮助。 图片上传请参考 不清楚您所说的“失去图像分辨率的质量”是什么意思。也许你可以尝试更具体一点。 【参考方案1】:

您应该使用UIGraphicsBeginImageContextWithOptions 而不是UIGraphicsBeginImageContext,以便可以指定比例因子。

例如,这将使用设备主屏幕的比例因子:

UIGraphicsBeginImageContextWithOptions(imgForeground.frame.size, NO, 0);

【讨论】:

图片不是窗口大小怎么办?比用 imgForeground.window.screen.scale 代替什么 嗨!好吧,第三个参数是比例而不是任何维度(即大小)!对于所有没有 Retina Displays 的 iPhone、iPodTouches 等,它将返回 1.0f,而 Retina Display 设备将返回 2.0f。 replace 'imgForeground.window.screen.scale' 为 '[[UIScreen mainScreen] scale]',这样“屏幕”的比例就更清楚了! 第三个参数可以简单的0,表示会自动选择比例(Cocoa中的常用约定)

以上是关于drawInRect:失去图像分辨率的质量的主要内容,如果未能解决你的问题,请参考以下文章

抓取屏幕图像然后裁剪后我会失去分辨率吗?

不同的输入图像大小/分辨率如何影响语义图像分割网络的输出质量?

高质量的超高分辨率图像分割(论文简读)

如何在上传到存储之前降低图像质量或分辨率以节省存储空间?

pageadmin CMS网站建设教程:网页设计的常用参数

极端低分辨率场景下的图像识别方案