2010-12-04 13 views
9

私はこれに対する答えを見つけたいと思います。私は検索して検索し、正しい答えができませんでした。ここで私の状況です:Mac OS Cocoa:キャンバスに単純なピクセルを描く

Mac OSのCocoaアプリケーションでは、ピクセル(実際には数ピクセル)をアプリケーションウィンドウの専用領域に描画します。私はNSImageViewがそこに置かれていた方がいいだろうと考えました(私はIBで行い、アプリケーションデリゲートにコンセントを接続しました)。NSWindowの代わりにその上に描画します。

どのように私はそれを行うことができますか? Mac OSは最も基本的な描画ツールとしてNSBezierPathを提供しているようだ—それは本当ですか?これは私には全く衝撃的です。私はWindowsプログラミングの長い歴史から、ピクセルをキャンバスに描画するのが最も簡単なことです。

私はOpenGLを使いたくないのですが、Quartzがこれにどの程度関わっているのか分かりません。

私が欲しいのは、私は本当のObjective-C/Cocoaの中で、この擬似コードをやってのけることができる方法についてのいくつかの助けである:

imageObj.drawPixel(10,10,blackColor); 

私はこれであなたの答えを聞くのが大好きだし、私はこれが役立つと確信しています多くの人々がココアで始まっています。

ありがとうございます!

答えて

-12

NSBezierPathは、ほとんどのプリミティブシェイプと多くの複雑なシェイプを描画するためにココアで利用できる唯一のツールです。あなたがここに見つけることができる 詳細説明: 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

+1

これは単に間違っています。 – uchuugaka

9

Cocoaの低レベルの描画APIは、コアグラフィックス(クォーツ)です。描画コンテキストを取得し、そのコンテキストに描画するコマンドを発行します。 APIはデバイスに依存しないように設計されています(印刷時に紙に描画するのと同じコマンドを使用して画面に描画します)。したがって、個々のピクセルを塗りつぶすためのコマンドはありません。なぜなら、ピクセル上にピクセルのようなものはないからです。画面上であっても、単一の点が単一のデバイスピクセルにマッピングされないように、ビューが何らかの形で変換されている可能性があります。

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

NSBezierPathを使用するか、コアグラフィックスコンテキスト(CGContextRef)を[[NSGraphicsContext currentContext] graphicsPort]から取得し、CGContextFillRect()などの関数を使用できます。

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

1

たぶん私は質問を誤解していたが、クォーツ長方形埋めるために能力があります:あなたが説明するようにピクセルを描画するための

void CGContextFillRect (CGContextRef c, CGRect rect); 
+0

またはdrawRect:またはlockFocusブロック内から、CGContextRefを取得せずにNSFillRectを直接使用することができます –

3

を、クォーツ2DまたはOpenGL APIへのパスまたはリゾートを作成する必要はありません。

NSRectFill()および関連する機能は、NSRectFillList()およびNSRectFillUsingOperation()を参照してください。

個々のピクセルをたくさん描画している場合、NSRectFillList()は、独自のイメージバッファーを使用せずにできるだけ速いです。

0

私は同じ問題を抱えているため、少し遅れてあなたの質問を見つけました。おそらく、Appleの開発者のドキュメントがここであなたを助けることができます。私はそれを自分自身をテストしたが、この文書を見ていない:

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

大雑把に、文書の中央にあなたはセクションでは、「ビットマップの作成」を検索します。これは、ピクセルデータを作成するさまざまな方法を示しています。

11

何を求めていることはこれらの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に読み込んだ画像のピクセルを操作したいかもしれません。 AppleテクニカルQ & AというタイトルのQA1509 Getting the pixel data from a CGImage objectというサンプルコードがあります。ここで

0

は、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]; 
} 
関連する問題