Программно редактировать изображение в Какао? - PullRequest
0 голосов
/ 19 марта 2011

Я хочу установить пользовательский курсор мыши для своего приложения и хотел бы программно изменить цвет курсора по умолчанию на пользовательский цвет, заменив белую рамку на пользовательский цвет. Проблема в том, что я даже не знаю, где начать программно редактировать изображения в Какао, поэтому любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 25 июня 2011

Мой окончательный код. Он берет стандартный курсор IBeam (тот, что при наведении курсора на текстовое представление) и сохраняет цветной курсор в указателе coloredIBeamCursor.

- (void)setPointerColor:(NSColor *)newColor {
    // create the new cursor image
    [[NSGraphicsContext currentContext] CIContext];
    // create the layer with the same color as the text
    CIFilter *backgroundGenerator=[CIFilter filterWithName:@"CIConstantColorGenerator"];
    CIColor *color=[[[CIColor alloc] initWithColor:newColor] autorelease];
    [backgroundGenerator setValue:color forKey:@"inputColor"];
    CIImage *backgroundImage=[backgroundGenerator valueForKey:@"outputImage"];
    // create the cursor image
    CIImage *cursor=[CIImage imageWithData:[[[NSCursor IBeamCursor] image] TIFFRepresentation]];
    CIFilter *filter=[CIFilter filterWithName:@"CIColorInvert"];
    [filter setValue:cursor forKey:@"inputImage"];
    CIImage *outputImage=[filter valueForKey:@"outputImage"];
    // apply a multiply filter
    filter=[CIFilter filterWithName:@"CIMultiplyCompositing"];
    [filter setValue:backgroundImage forKey:@"inputImage"];
    [filter setValue:outputImage forKey:@"inputBackgroundImage"];
    outputImage=[filter valueForKey:@"outputImage"];
    // get the NSImage from the CIImage
    NSCIImageRep *rep=[NSCIImageRep imageRepWithCIImage:outputImage];
    NSImage *newImage=[[[NSImage alloc] initWithSize:[outputImage extent].size] autorelease];
    [newImage addRepresentation:rep];
    // remove the old cursor (if any)
    if (coloredIBeamCursor!=nil) {
        [self removeCursorRect:[self visibleRect] cursor:coloredIBeamCursor];
        [coloredIBeamCursor release];
    }
    // set the new cursor
    NSCursor *coloredIBeamCursor=[[NSCursor alloc] initWithImage:newImage hotSpot:[[NSCursor IBeamCursor] hotSpot]];
    [self resetCursorRects];
}
0 голосов
/ 21 марта 2011

Вы можете получить курсор по умолчанию с помощью - [NSCursor arrowCursor]. Если у вас есть курсор, вы можете получить его изображение с помощью - [NSCursor image]. Вы не должны изменять изображение другого объекта, поэтому вы должны скопировать это изображение. Затем вы должны отредактировать изображение и создать новый курсор с - [NSCursor initWithImage: hotSpot:]. Ваш код должен выглядеть примерно так:

- (NSImage *)customArrowCursorImage {
    NSImage *image = [[[NSCursor arrowCursor] image] copy];
    [image lockFocus];
    /// Do custom drawing
    [image unlockFocus];
}

- (NSCursor *)customArrowCursor {
    NSImage *image = [self customArrowCursorImage];
    NSPoint hotSpot = [[NSCursor arrowCursor] hotSpot];
    return [[[NSCursor alloc] initWithImage:image hotSpot:hotSpot] autorelease];
}

Вы должны иметь возможность заменить белый цвет изображения на пользовательский цвет с помощью основного фильтра изображения. Но если вы просто хотите начать, вы можете использовать NSReadPixel () и NSRectFill для окрашивания одного пикселя за раз. Рисование одного пикселя за раз с помощью NSReadPixel и NSRectFill будет исключительно медленным, поэтому вы должны сделать это только для того, чтобы понять, как все это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...