Cocoa tableView imageCell中的重置图像模糊
我试图在NSTableView单元格上的光标“滚动”期间显示“信息”图标。我得到了一个细胞图像的副本,在上面画了“信息”图标,并告诉细胞用这个副本设置图像。只需绘制图标就可以缩放它,而不是每个图标都有相同的大小,因为表中的图像大小不同。我没有缩放或定位正确大小图标的问题 我的问题是,替换后的图像有点模糊,仔细检查,边缘不清晰。由于缺少边缘,当鼠标插入并替换图像时,边缘会略微“移动” 我尝试了许多绘图技术,这些技术不在CGBitmapContext中的NSImage绘图上使用锁定焦点,也不使用CIFilter合成,它们产生了相同的结果 我使用的是NSTableView的PreparedCellAt列,因为willDisplayCell中的绘图似乎是不可预测的——我在某个地方读过,但不记得在哪里 以下是我的preparedCellAtColumn方法: [这是scott stevenson提供的封闭缩放方法]Cocoa tableView imageCell中的重置图像模糊,cocoa,nstableview,nscell,Cocoa,Nstableview,Nscell,我试图在NSTableView单元格上的光标“滚动”期间显示“信息”图标。我得到了一个细胞图像的副本,在上面画了“信息”图标,并告诉细胞用这个副本设置图像。只需绘制图标就可以缩放它,而不是每个图标都有相同的大小,因为表中的图像大小不同。我没有缩放或定位正确大小图标的问题 我的问题是,替换后的图像有点模糊,仔细检查,边缘不清晰。由于缺少边缘,当鼠标插入并替换图像时,边缘会略微“移动” 我尝试了许多绘图技术,这些技术不在CGBitmapContext中的NSImage绘图上使用锁定焦点,也不使用CI
- (NSSize)proportionalSizeForTargetSize:(NSSize)targetSize
{
NSSize imageSize = [self size];
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
CGFloat targetWidth = targetSize.width;
CGFloat targetHeight = targetSize.height;
CGFloat scaleFactor = 0.0;
CGFloat scaledWidth = targetWidth;
CGFloat scaledHeight = targetHeight;
if ( NSEqualSizes( imageSize, targetSize ) == NO )
{
CGFloat widthFactor;
CGFloat heightFactor;
widthFactor = targetWidth / width;
heightFactor = targetHeight / height;
if ( widthFactor < heightFactor )
scaleFactor = widthFactor;
else
scaleFactor = heightFactor;
scaledWidth = width * scaleFactor;
scaledHeight = height * scaleFactor;
}
return NSMakeSize(scaledWidth,scaledHeight);
}
我需要支持10.6,所以不能使用新的groovy lion方法
感谢您的考虑…您的代码正在将图像原点设置为非整数坐标。这意味着图像的边缘将不会与像素对齐,从而产生模糊结果 您只需执行以下操作:
NSPoint drawPoint = NSZeroPoint;
drawPoint.x = round((cellSize.width - scaledSize.width) * 0.5);
drawPoint.y = round((cellSize.height - scaledSize.height) * 0.5);
这将确保图像原点没有分数分量。谢谢,Rob。奇怪的是,这适用于缩放以适应单元高度的图像,但对于小于高度但填充宽度的缩放图像,“模糊”仍然存在。我标记这个答案,因为我认为它指出了另一个问题,可能与视图原点坐标和缩放有关,这将是一个不同的问题。
NSPoint drawPoint = NSZeroPoint;
drawPoint.x = round((cellSize.width - scaledSize.width) * 0.5);
drawPoint.y = round((cellSize.height - scaledSize.height) * 0.5);