Cocoa tableView imageCell中的重置图像模糊

Cocoa tableView imageCell中的重置图像模糊,cocoa,nstableview,nscell,Cocoa,Nstableview,Nscell,我试图在NSTableView单元格上的光标“滚动”期间显示“信息”图标。我得到了一个细胞图像的副本,在上面画了“信息”图标,并告诉细胞用这个副本设置图像。只需绘制图标就可以缩放它,而不是每个图标都有相同的大小,因为表中的图像大小不同。我没有缩放或定位正确大小图标的问题 我的问题是,替换后的图像有点模糊,仔细检查,边缘不清晰。由于缺少边缘,当鼠标插入并替换图像时,边缘会略微“移动” 我尝试了许多绘图技术,这些技术不在CGBitmapContext中的NSImage绘图上使用锁定焦点,也不使用CI

我试图在NSTableView单元格上的光标“滚动”期间显示“信息”图标。我得到了一个细胞图像的副本,在上面画了“信息”图标,并告诉细胞用这个副本设置图像。只需绘制图标就可以缩放它,而不是每个图标都有相同的大小,因为表中的图像大小不同。我没有缩放或定位正确大小图标的问题

我的问题是,替换后的图像有点模糊,仔细检查,边缘不清晰。由于缺少边缘,当鼠标插入并替换图像时,边缘会略微“移动”

我尝试了许多绘图技术,这些技术不在CGBitmapContext中的NSImage绘图上使用锁定焦点,也不使用CIFilter合成,它们产生了相同的结果

我使用的是NSTableView的PreparedCellAt列,因为willDisplayCell中的绘图似乎是不可预测的——我在某个地方读过,但不记得在哪里

以下是我的preparedCellAtColumn方法:

[这是scott stevenson提供的封闭缩放方法]

- (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);