在Cocoa中操纵NSImage的像素
我想基于一些变量修改NSImage像素的颜色,而不使用太多依赖工具箱的库(例如:CIImage)。因此,稍后我可以将重点放在像素操作算法上,并使它们独立于平台 我的方法是将NSImage子类化并添加一个属性在Cocoa中操纵NSImage的像素,cocoa,bitmapdata,nsimage,nsimageview,Cocoa,Bitmapdata,Nsimage,Nsimageview,我想基于一些变量修改NSImage像素的颜色,而不使用太多依赖工具箱的库(例如:CIImage)。因此,稍后我可以将重点放在像素操作算法上,并使它们独立于平台 我的方法是将NSImage子类化并添加一个属性 NSBitmapImageRep *originalImage; 在入会期间,我会: -(id) initWithContentsOfFile:(NSString *)fileName { if([super initWithContentsOfFile:fileName]){
NSBitmapImageRep *originalImage;
在入会期间,我会:
-(id) initWithContentsOfFile:(NSString *)fileName
{
if([super initWithContentsOfFile:fileName]){
NSRect rect = NSMakeRect(0.0, 0.0, self.size.width, self.size.height);
[self lockFocus];
originalImage = [[NSBitmapImageRep alloc] initWithFocusedViewRect:rect];
[self unlockFocus];
}
return self;
}
现在,当我尝试更新图像时,我会:
-(void) updateWithVariables:...
{
NSInteger width = [originalImage pixelsWide];
NSInteger height = [originalImage pixelsHigh];
NSInteger count = width * height * 4;
unsigned char *bytes = (unsigned char *)calloc(count, sizeof(unsigned char));
// bytes manipulation
NSBitmapImageRep* newImg = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:&bytes
pixelsWide:width
pixelsHigh:height
bitsPerSample:[originalImage bitsPerSample]
samplesPerPixel:[originalImage samplesPerPixel]
hasAlpha:TRUE
isPlanar:[originalImage isPlanar]
colorSpaceName:[originalImage colorSpaceName]
bitmapFormat:[originalImage bitmapFormat]
bytesPerRow:[originalImage bytesPerRow]
bitsPerPixel:[originalImage bitsPerPixel]];
while([[self representations] count] > 0){
NSBitmapImageRep *rep = [[self representations] objectAtIndex: 0];
[self removeRepresentation:rep];
}
[self addRepresentation:newImg];
[newImg release];
}
但形象没有改变。我不确定是否必须使用表示法或将包含的NSImageView更改为上下文来绘制新图像
谢谢 苹果公司说:
将NSImage及其图像表示视为不可变对象。NSImage的目标是提供一种在目标画布上显示图像的有效方法。避免直接操作图像表示的数据,尤其是在有其他方法可以操作数据的情况下,例如将图像和其他内容合成到新的图像对象中
所以,当你想改变像素时,你可能应该创建一个新的图像