Cocoa 进入NSImage的像素数据
我正在写一个在黑白图像上运行的应用程序。我是通过将NSImage对象传递到我的方法中,然后从NSImage生成NSBitmapImageRep来实现的。所有这些都可以工作,但速度相当慢。这是我的密码:Cocoa 进入NSImage的像素数据,cocoa,cgimage,nsimage,nsbitmapimagerep,Cocoa,Cgimage,Nsimage,Nsbitmapimagerep,我正在写一个在黑白图像上运行的应用程序。我是通过将NSImage对象传递到我的方法中,然后从NSImage生成NSBitmapImageRep来实现的。所有这些都可以工作,但速度相当慢。这是我的密码: - (NSImage *)skeletonization: (NSImage *)image { int x = 0, y = 0; NSUInteger pixelVariable = 0; NSBitmapImageRep *bitmapImageRep = [[NS
- (NSImage *)skeletonization: (NSImage *)image
{
int x = 0, y = 0;
NSUInteger pixelVariable = 0;
NSBitmapImageRep *bitmapImageRep = [[NSBitmapImageRep alloc] initWithData:[image TIFFRepresentation]];
[myHelpText setIntValue:[bitmapImageRep pixelsWide]];
[myHelpText2 setIntValue:[bitmapImageRep pixelsHigh]];
NSColor *black = [NSColor blackColor];
NSColor *white = [NSColor whiteColor];
[myColor set];
[myColor2 set];
for (x=0; x<=[bitmapImageRep pixelsWide]; x++) {
for (y=0; y<=[bitmapImageRep pixelsHigh]; y++) {
// This is only to see if it's working
[bitmapImageRep setColor:myColor atX:x y:y];
}
}
[myColor release];
[myColor2 release];
NSImage *producedImage = [[NSImage alloc] init];
[producedImage addRepresentation:bitmapImageRep];
[bitmapImageRep release];
return [producedImage autorelease];
}
-(NSImage*)骨架化:(NSImage*)图像
{
int x=0,y=0;
NSU整数像素变量=0;
NSBitmapImageRep*bitmapImageRep=[[NSBitmapImageRep alloc]initWithData:[image TIFFRepresentation]];
[myHelpText setIntValue:[bitmapImageRep pixelsWide];
[myHelpText2 setIntValue:[bitmapImageRep pixelsHigh]];
NSColor*black=[NSColor blackColor];
NSColor*white=[NSColor whiteColor];
[myColor集];
[myColor2集];
对于(x=0;x使用NSImage中的representations
array属性获取NSBitmapImageRep。它应该比将图像序列化为TIFF然后返回更快
使用NSBitmapImageRep
的bitmapData
属性直接访问图像字节
乙二醇
unsigned char black=0;
无符号字符白=255;
NSBitmapImageRep*bitmapImageRep=[[image representations]firstObject];
//您需要在此处进行检查以确定位图数据的像素格式
无符号字符*imageData=[bitmapImageRep bitmapData];
int rowBytes=[bitmapImageRep bytesPerRow];
int bpp=[bitmapImageRep bitsPerPixel]/8;
对于(x=0;x为什么要设置颜色?这完全没有意义,因为没有锁定的焦点,也没有用这些颜色绘制任何东西。不是说删除这些颜色会加快代码的速度,我只是想让你知道。你访问每个像素的方式相当不理想,我也不确定你到底在尝试什么在这里做;您所做的只是将图像中每个像素的颜色更改为某种颜色(不知道这是从哪里来的),但是你说这段代码只是为了看看它是否工作。如果你想让我发布更好的解决方案,我需要更多的信息,例如,源图像的名称是什么样的图像,生成的图像是什么样的图像。我想我当然可以大大加快你的代码,但如果我不知道它应该做什么的话。
unsigned char black = 0;
unsigned char white = 255;
NSBitmapImageRep* bitmapImageRep = [[image representations] firstObject];
// you will need to do checks here to determine the pixelformat of your bitmap data
unsigned char* imageData = [bitmapImageRep bitmapData];
int rowBytes = [bitmapImageRep bytesPerRow];
int bpp = [bitmapImageRep bitsPerPixel] / 8;
for (x=0; x<[bitmapImageRep pixelsWide]; x++) { // don't use <=
for (y=0; y<[bitmapImageRep pixelsHigh]; y++) {
*(imageData + y * rowBytes + x * bpp ) = black; // Red
*(imageData + y * rowBytes + x * bpp +1) = black; // Green
*(imageData + y * rowBytes + x * bpp +2) = black; // Blue
*(imageData + y * rowBytes + x * bpp +3) = 255; // Alpha
}
}