2015-02-12 3 views
2

Я пытаюсь прочитать NSImage в NSBitmapImageRep для изменения цвета некоторых пикселей. Программа должна считывать значение цвета каждого пикселя и проверять, соответствует ли он цвету, выбранному колорвелл. У меня есть ImageView с именем «MainImageView» и ColorWell с именем «MainColor». Это мой код:Objective-C: NSBitmapImageRep SetColor

- (IBAction)ScanImg:(id)sender { 

NSBitmapImageRep *ImgRep = [[NSBitmapImageRep alloc]initWithData: MainImageView.image.TIFFRepresentation]; 

for (int pixelx = 0; pixelx < ImgRep.pixelsWide; pixelx ++) { 
    for (int pixely = 0; pixely < ImgRep.pixelsHigh;pixely ++){ 
     if ([ImgRep colorAtX:pixelx y:pixely] == MainColor.color) { 
      [ImgRep setColor: [NSColor whiteColor] atX:pixelx y:pixely]; 
     } else{ 
      [ImgRep setColor: [NSColor blackColor] atX:pixelx y:pixely]; 
     } 
    } 
} 

struct CGImage *CG = [ImgRep CGImage]; 
NSImage *Image = [[NSImage alloc] initWithCGImage:CG size:ImgRep.size]; 
MainImageView.image = Image; 

} 

Но код ничего не меняет на картинке! В чем проблема? Или есть другой способ, чтобы изменить цвет пикселя?

Благодарим за помощь! DaRi

+0

Я не могу себе представить, что '[ImgRep colorAtX: pixelx у: pixely] == MainColor.color' делает то, что вы думаете ... это сравнение адресов объектов NSColor. –

+0

сначала проверьте, является ли 'ImgRep'' nil' и имеет размеры. научитесь использовать отладчик и поместите контрольные точки, чтобы увидеть, даже ли он попадает в операции 'setColor'. –

+0

И даже после замены сравнения цвета багги это не сработает, потому что существующий NSBitmapImageRep нельзя изменить. Из документов: ** Объект обрабатывает данные изображения в буферах как неизменные и не будет пытаться изменить его. ** Вам нужно создать новое изображение. –

ответ

0

У меня такая же проблема. Обходной я нашел использовать метод -setPixel, хотя это чувствует себя немного неуклюже:

NSUInteger pix[4]; pix[0] = 0; pix[1] = 0; pix[2] = 0; pix[3] = 255; //black 
[ImgRep setPixel:pix atX:x y:y]; 

Примечание: пиксельные данные должны быть организованы в соответствии с цветовым пространством вы используете, в этом примере 0,0, 0,255 черный в цветовом пространстве RGBA.

Но в конце концов, тот еще лучше, чем копирование и изменение базовых данных (неподписанные символ *), который возвращается [ImgRep BitmapData] ...

 Смежные вопросы

  • Нет связанных вопросов^_^