Cocoa 进入NSImage的像素数据

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对象传递到我的方法中,然后从NSImage生成NSBitmapImageRep来实现的。所有这些都可以工作,但速度相当慢。这是我的密码:

- (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
    }
}