Попадание в пиксельные данные NSImage
Я пишу приложение, которое работает на черно-белых изображениях. Я делаю это, передавая объект NSImage в мой метод, а затем создаю NSBitmapImageRep из NSImage. Все работает, но довольно медленно. Вот мой код:
- (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];
}
Поэтому я попытался использовать CIImage, но я не знаю, как попасть в каждый пиксель по (x,y) координатам. Это действительно важно.
0 ответов
Использовать representations
array из NSImage, чтобы получить ваш NSBitmapImageRep. Это должно быть быстрее, чем сериализация изображения в TIFF и обратно.
Использовать bitmapData
собственность NSBitmapImageRep
для прямого доступа к байтам изображения.
например
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
}
}
Вам нужно будет знать, какой формат пикселей вы используете в своих изображениях, прежде чем вы сможете играть с его данными, посмотрите на bitsPerPixel
свойство NSBitmapImageRep, чтобы помочь определить, находится ли ваше изображение в формате RGBA.
Вы можете работать с изображением в градациях серого, с изображением RGB или, возможно, с CMYK. И либо сначала конвертируйте изображение в то, что хотите. Или по-другому обрабатывать данные в цикле.