在NSScrollView中缩小图像大小

时间:2010-02-16 15:07:03

标签: objective-c nsimage nsscrollview nsimageview

我正在尝试将图像加载到我的NSImageView / NSScrollView中并以实际大小显示它,但图像神秘地最终以大约一半的尺寸显示。我一开始认为它可能会被缩小以适应框架等的某种约束,但很快意识到这可能不对,因为如果我在物理上放大图像尺寸(在图像编辑程序中)然后加载它再次,我发现我可以加载/显示我想要的大图像。

所讨论图像的实际尺寸仅为2505 x 930,我认为这不是问题,因为我可以在没有任何明显问题的情况下将其翻倍并翻两倍(当然,它们都减少了大约50个)显示时%)。我非常简单的代码的相关部分是:

- (IBAction)openSourceImage:(NSString*)aFilepath
{
// obtain image filepath passed from 'chooseFile'...
NSImage *theImage = [[NSImage alloc] initWithContentsOfFile:aFilepath];
if (theImage)
    {
    [theImageView setImage:theImage];
    // resize imageView to fit image; causes the surrounding NSScrollView to adjust its scrollbars appropriately...
    [theImageView setFrame:
        NSMakeRect([theImageView frame].origin.x, [theImageView frame].origin.y, [theImage size].width, [theImage size].height)];
    [theImageView scrollRectToVisible:
        NSMakeRect([theImageView frame].origin.x, [theImageView frame].origin.y + [theImageView frame].size.height,1,1)];
    [theImage release]; // we're done with 'theImage' we allocated, so release it

    // display the window title from the filepath...
    NSString *aFilename = [aFilepath lastPathComponent];
    [[theImageView window] setTitle:aFilename];
}

}

任何人都可以告诉我这里我出错了,以及如何以实际尺寸显示图像?

解决方案:好的,所以调用'尺寸'会导致显示的图片太小而无法使用并且调用'pixelsHigh / pixelsWide'会导致放大图像的不确定比例... < / p>

我的测试应用程序使用一些滑块驱动的“十字准线”来绘制图像上的要素坐标(例如照片或地图)。通过纯粹的机会,我意外地注意到,虽然加载的图像仅以其实际尺寸的一小部分显示,但是x,y坐标DID对应于现实生活(表示大约70像素/英寸)。去找那个......

使用:

[theImage setSize:NSMakeSize(imageSize.width * 4, imageSize.height * 4)];

我现在能够以KNOWN放大率加载图像,并以相同的因子减少我绘制的x,y测量值。我还投入了一个NSAffineTransform方法,允许我放大/缩小以获得最佳观看尺寸。

唷!对于我相当新手级别的人来说这是一个挑战,我仍然不明白原始显示问题的根本原因,但我猜最终结果是重要的。再次感谢你们两个: - )

2 个答案:

答案 0 :(得分:2)

我不确定为什么图片尺寸不合适,但您可以尝试“修正”尺寸以匹配其中一个尺寸的尺寸:

NSBitmapImageRep* aRep = [[theImage representations] objectAtIndex: 0];

NSSize correctedImageSize = NSMakeSize([aRep pixelsWide], [aRep pixelsHigh]);
[theImage setSize:correctedImageSize];

(当然,也许代表的大小也是错误的!)

答案 1 :(得分:1)

size方法以磅为单位返回大小,而不是像素。 pixelsHighpixelsWide方法就是你所追求的。