1

ツールキットに依存するライブラリ (CIImage など) をあまり使用せずに、いくつかの変数に基づいて NSImage ピクセルの色を変更したいと考えています。そのため、後でピクセル操作アルゴリズムに集中して、プラットフォームに依存しないようにすることができます。

私のアプローチは、NSImage をサブクラス化し、属性を追加することでした

NSBitmapImageRep *originalImage;

開始中、私は次のことを行います。

-(id) initWithContentsOfFile:(NSString *)fileName
{
    if([super initWithContentsOfFile:fileName]){
        NSRect rect = NSMakeRect(0.0, 0.0, self.size.width, self.size.height);
        [self lockFocus];
        originalImage = [[NSBitmapImageRep alloc] initWithFocusedViewRect:rect];
        [self unlockFocus];
    }
    return self;
}

画像を更新しようとすると、次のようになります。

-(void) updateWithVariables:...
{
    NSInteger width = [originalImage pixelsWide];
    NSInteger height = [originalImage pixelsHigh];
    NSInteger count = width * height * 4;

    unsigned char *bytes = (unsigned char *)calloc(count, sizeof(unsigned char));

    // bytes manipulation

    NSBitmapImageRep* newImg = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:&bytes
                                                                       pixelsWide:width
                                                                       pixelsHigh:height
                                                                    bitsPerSample:[originalImage bitsPerSample]
                                                                  samplesPerPixel:[originalImage samplesPerPixel]
                                                                         hasAlpha:TRUE
                                                                         isPlanar:[originalImage isPlanar]
                                                                   colorSpaceName:[originalImage colorSpaceName]
                                                                     bitmapFormat:[originalImage bitmapFormat]
                                                                      bytesPerRow:[originalImage bytesPerRow]
                                                                     bitsPerPixel:[originalImage bitsPerPixel]];
    while([[self representations] count] > 0){
        NSBitmapImageRep *rep = [[self representations] objectAtIndex: 0];
        [self removeRepresentation:rep];
    }

    [self addRepresentation:newImg];
    [newImg release];
}

でも、イメージは変わりません。新しい画像を描画するために、表現を使用する必要があるか、含まれている NSImageView をコンテキストに変更する必要があるかどうかはわかりません。

ありがとう!

4

1 に答える 1

0

このページでAppleは次のように述べています。

NSImageとその画像表現を不変オブジェクトとして扱います。NSImageの目標は、ターゲットキャンバスに画像を表示する効率的な方法を提供することです。特に、画像やその他のコンテンツを新しい画像オブジェクトに合成するなど、データを操作する代わりの方法がある場合は、画像表現のデータを直接操作しないでください。

したがって、ピクセルを変更する場合は、おそらく新しいイメージを作成する必要があります。

于 2012-07-08T15:27:11.743 に答える