在tableView中重置图像imageCell是模糊的

时间:2011-08-22 18:00:15

标签: cocoa nstableview nscell

我正试图在NSTableView单元格上的游标“翻转”期间显示“信息”图标。我正在获取单元格图像的副本,在其上绘制“信息”图标,并使用此副本告诉单元格setImage。只绘制图标会缩放它,并且每个图标的大小不同,因为表格中的图像大小不同。我没有缩放或定位正确尺寸图标的问题。

我的问题是被替换的图像略微模糊,并且在仔细检查时它的边缘不清脆。当mouseEntered发生并且图像被替换时,缺少边缘会使它看起来像是“轻微移动”。

我尝试过一些不会在lockFocus上使用NSImage的绘图技巧(使用CGBitmapContext绘图,或使用CIFilter合成),他们产生相同的结果。

我正在使用NSTableView的{​​{1}}因为preparedCellAtColumn中的绘图似乎无法预测 - 我在某处读到但不记得在哪里。

这是我的 willDisplayCell 方法:

preparedCellAtColumn

[这是scott stevenson所附的缩放方法]

- (NSCell *)preparedCellAtColumn:(NSInteger)column row:(NSInteger)row
{
        NSCell *cell = [super preparedCellAtColumn:column row:row];

        if ((self.mouseOverRow == row) && column == 0) {

            NSCell * imageCell = [super preparedCellAtColumn:0 row:row];

            NSImage *sourceImage = [[imageCell image] copy];        
            NSRect cellRect = [self frameOfCellAtColumn:0 row:row];
            NSSize cellSize = cellRect.size; 

            NSSize scaledSize = [sourceImage proportionalSizeForTargetSize:cellSize];

            NSImage *outputImage = [[NSImage alloc] initWithSize:cellSize];
            [outputImage setBackgroundColor:[NSColor clearColor]];

            NSPoint drawPoint = NSZeroPoint;
            drawPoint.x = (cellSize.width - scaledSize.width) * 0.5;
            drawPoint.y = (cellSize.height - scaledSize.height) * 0.5;

            NSRect drawRect = NSMakeRect(drawPoint.x, drawPoint.y, scaledSize.width, scaledSize.height);

            NSPoint infoPoint = drawPoint;
            infoPoint.x += NSWidth(drawRect) - self.infoSize.width;

            [outputImage lockFocus]; 
            [sourceImage drawInRect:drawRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
            [self.infoImage drawAtPoint:infoPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
            [outputImage unlockFocus];

            [cell setImage:outputImage];
        }

        return cell;
}

我需要支持10.6,所以不能使用新的常规狮子方法。

感谢您的考虑......

1 个答案:

答案 0 :(得分:0)

您的代码正在将图像的原点设置为非整数坐标。这意味着图像的边缘不会像素对齐,从而产生模糊结果。

你只需要这样做:

NSPoint drawPoint = NSZeroPoint;
drawPoint.x = round((cellSize.width - scaledSize.width) * 0.5);
drawPoint.y = round((cellSize.height - scaledSize.height) * 0.5);

这将确保图像原点没有小数分量。