将NSImage结果缩小为像素变化?

时间:2014-03-08 07:34:30

标签: objective-c macos cocoa

我正在使用以下代码缩小图片范围:

NSImage * smallImage = [[NSImage alloc] initWithSize:CGSizeMake(width, height)];
[smallImage lockFocus];
[[NSGraphicsContext currentContext] 
     setImageInterpolation:NSImageInterpolationHigh];
[image drawInRect:CGRectMake(0, 0, width, height)
         fromRect:NSZeroRect
        operation:NSCompositeCopy
         fraction:1.0];
[smallImage unlockFocus];

基本上,这样可以正常工作,但如果我将widthheight设置为与原始图像完全相同,并逐个像素地比较图像,则仍会有一些像素发生变化。

由于我的应用程序对像素敏感,我需要确保每个像素都是正确的,所以我想知道如何在缩小像素的同时保留像素,是否可能?

2 个答案:

答案 0 :(得分:0)

是的,NSImage会以各种方式更改图像数据。它尝试根据UI上的图形表示所需的大小来优化“有效载荷”图像数据。

再次向下缩放通常不是一个好主意。

AFAIK只能通过将原始图像数据保留在其他地方(例如在磁盘上或单独的NSData容器中)来避免这种情况。 如果您需要对图像数据应用计算或操作,这些数据需要100%准确到每个像素,那么只能使用NSData或C字符串/字节数组。避免使用NSImage a)结果仅用于设备上的演示 b)您确实需要NSImage对象附带的功能。

答案 1 :(得分:0)

我原则上解释问题,而不是科学问题。 由于技术原因,像素具有固定的大小。

不,缩小时无法保持像素。

一个例子来解释:方形0,25英寸的像素化。现在你要填充一个1,1英寸的正方形。不可能。应该使用多少像素? 4 =太少,太多了。现在,在COCOA库或任何地方,都会做出决定:更好的像素=放大的正方形尺寸,或更小=减小正方形尺寸。这对你来说是失控的。

另一个问题是 - 对你来说也是失控的 - 计算方法的方式。 一个例子:1英寸接近2.54厘米,所以1.27是0.5英寸,但是什么是1.25厘米?值,不仅仅是使用一个度量单位在内部计算度量:我认为它是英寸(为DOUBLE,在句点之后具有固定的位数)。当使用单位cm时,它在内部以英寸重新计算,进行了一些数学运算(例如,正方形需要多少像素?)并且结果被发回,可能以cm为单位重新计算。使用INTEGER时也会发生这种情况,内部计算为DOUBLE并返回为INTEGERS。有趣的事情=从那里发生意外的价值,特别是在用于缩小的分割之后!

顺便说一句:如果缩放图像,通常会为缩放图像创建新像素。例如,如果你有4个像素:2个红色,2个蓝色,新的ONE有混合颜色,不知何故紫色。没有办法回来。因此,请始终处理图像的副本!