我正在使用以下代码缩小图片范围:
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];
基本上,这样可以正常工作,但如果我将width
和height
设置为与原始图像完全相同,并逐个像素地比较图像,则仍会有一些像素发生变化。
由于我的应用程序对像素敏感,我需要确保每个像素都是正确的,所以我想知道如何在缩小像素的同时保留像素,是否可能?
答案 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有混合颜色,不知何故紫色。没有办法回来。因此,请始终处理图像的副本!