14

これに対する答えを見つけたいと思います。私は検索して検索しましたが、正しい答えができませんでした。これが私の状況です:

Mac OS Cocoa アプリケーションで、アプリケーション ウィンドウの専用領域に 1 ピクセル (実際には数ピクセル) を描画したいと考えています。そこに a をNSImageView配置して (IB を使用してアウトレットをアプリ デリゲートに接続しました)、自分のNSWindow.

どうすればそれができますか?Mac OSNSBezierPathは最も基本的な描画ツールとして提供されているようですが、それは本当ですか? これは私にとって完全に衝撃的です。私は Windows プログラミングの長い歴史から来ており、キャンバスにピクセルを描画することは、通常、最も単純なことです。

私は OpenGL を使用したくありません。Quartz がこれにどの程度関与しているかはわかりません。

私が欲しいのは、実際の Objective-C/Cocoa でこの疑似コードを実行する方法についての助けだけです。

imageObj.drawPixel(10,10,blackColor);

これについてあなたの答えを聞きたいです.これは、Cocoaを始める多くの人に役立つと確信しています.

ありがとう!

4

8 に答える 8

14

あなたが求めているのは、次の2つの方法のいずれかです。

NSBitmapRep setColor:atX:y:指定された座標のピクセルの色を変更します。

NSBitmapRep setPixel:atX:y:指定された座標にある受信者のピクセルを、指定された生のピクセル値に設定します。

これらは iOS では使用できないことに注意してください。iOS では、これを行う方法は、特定の色空間 (おそらく RGB) のピクセル データの生のバッファを作成し、それを色データで埋め (これを行うには少し setPixel メソッドを記述します)、CGImageCreate() を呼び出すことです。そのようです:

    //Create a raw buffer to hold pixel data which we will fill algorithmically
    NSInteger width = theWidthYouWant;
    NSInteger height = theHeightYouWant;
    NSInteger dataLength = width * height * 4;
    UInt8 *data = (UInt8*)malloc(dataLength * sizeof(UInt8));

    //Fill pixel buffer with color data
    for (int j=0; j<height; j++) {
        for (int i=0; i<width; i++) {

            //Here I'm just filling every pixel with red
            float red   = 1.0f;
            float green = 0.0f;
            float blue  = 0.0f;
            float alpha = 1.0f;

            int index = 4*(i+j*width);
            data[index]  =255*red;
            data[++index]=255*green;
            data[++index]=255*blue;
            data[++index]=255*alpha;

        }
    }

    // Create a CGImage with the pixel data
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, data, dataLength, NULL);
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    CGImageRef image = CGImageCreate(width, height, 8, 32, width * 4, colorspace, kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast,

                            provider, NULL, true, kCGRenderingIntentDefault);

    //Clean up
    CGColorSpaceRelease(colorspace);
    CGDataProviderRelease(provider);
    // Don't forget to free(data) when you are done with the CGImage

最後に、すでに CGImage に読み込んでいる画像のピクセルを操作したい場合があります。これを行うためのサンプル コードは、QA1509 Getting the pixel data from a CGImage objectというタイトルの Apple Technical Q&A にあります。

于 2011-09-16T15:29:38.370 に答える
9

Cocoa の低レベルの描画 API は Core Graphics (Quartz) です。描画コンテキストを取得し、そのコンテキストに描画するコマンドを発行します。API は、デバイスに依存しないように設計されています (印刷時に紙に描画するのと同じコマンドを使用して、画面に描画します)。したがって、個々のピクセルを塗りつぶすためのコマンドはありません。紙にはピクセルなどというものがないからです。画面上であっても、単一のポイントが単一のデバイス ピクセルにマップされないように、ビューが何らかの方法で変換されている場合があります。

1 つのピクセルを描画する場合は、1 つのピクセルのサイズの四角形を指定し、それを塗りつぶす必要があります。(x,y) のピクセルの場合、(x- 0.5,y-0.5) と (1,1) のサイズ。

NSBezierPath を使用してこれを行うか、Core Graphics コンテキスト (CGContextRef) を取得して の[[NSGraphicsContext currentContext] graphicsPort]ような関数を使用することができますCGContextFillRect()

多くのピクセルを描画している場合、これは明らかに高速ではありません。それは API が設計された目的ではありません。それが必要な場合は、バッファーを作成してmallocそれにピクセル データを書き込んでから、Core Graphics を使用してそれを CGImageRef に変換し、画面に描画できるようにすることを検討してください。

于 2010-12-05T00:05:08.947 に答える
3

説明したようにピクセルを描画するために、パスを作成したり、Quartz 2D または OpenGL API に頼ったりする必要はありません。

およびNSRectFill()や などの関連機能を参照してください。NSRectFillList()NSRectFillUsingOperation()

多数の個々のピクセルを描画している場合NSRectFillList()、独自のイメージ バッファーをローリングすることに頼らずに、できるだけ高速に描画できます。

于 2010-12-05T10:03:03.607 に答える
2

OS X でピクセルを描画する簡単な方法を次に示します。

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

    NSBitmapImageRep *rep = [[NSBitmapImageRep alloc]
                             initWithFocusedViewRect:dirtyRect];

    for (int x = 0; x < [rep pixelsWide]; x++) {
        for (int y = 0; y < [rep pixelsHigh]; y++) {
            NSUInteger pixel[4] = { 0, 255, 0, 255 };
            [rep setPixel:pixel atX:x y:y];
        }
    }

    [rep drawInRect:dirtyRect];
}
于 2015-01-18T23:34:44.793 に答える
1

質問を誤解しているかもしれませんが、Quartz には四角形を塗りつぶす機能があります。

void CGContextFillRect (CGContextRef c, CGRect rect);
于 2010-12-05T00:05:32.030 に答える
0

私は同じ問題を抱えているため、ここであなたの質問を少し遅く見つけました。おそらく、Apple の開発者向けドキュメントがここで役立つでしょう。私は自分でテストしていませんが、このドキュメントを見てください。

http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CocoaDrawingGuide/Images/Images.html

ドキュメントのほぼ中央に、「ビットマップの作成」セクションがあります。ピクセル データを作成するさまざまな方法について説明します。

于 2011-03-15T19:19:31.197 に答える
-11

NSBezierPath は、Cocoa で最もプリミティブな形状と多くの複雑な形状を描画するための唯一のツールです。ここで見つけることができる詳細な説明: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaDrawingGuide/Paths/Paths.html%23//apple_ref/doc/uid/TP40003290-CH206-BBCHFJJG http://en.wikibooks.org/wiki/Programming_Mac_OS_X_with_Cocoa_for_Beginners/Graphics_-_Drawing_with_Quartz

于 2010-12-04T23:59:42.647 に答える