0

関数に割り当てられたメモリブロックを保持したいvoid ManipulateImagePixelData(CGImageRef inImage)(完全なコードについてはhttp://developer.apple.com/library/mac/#qa/qa1509/_index.htmlを参照)

void ManipulateImagePixelData(CGImageRef inImage)
{
    // Create the bitmap context
    CGContextRef cgctx = CreateARGBBitmapContext(inImage);
    if (cgctx == NULL) 
    { 
        // error creating context
        return;
    }

     // Get image width, height. We'll use the entire image.
    size_t w = CGImageGetWidth(inImage);
    size_t h = CGImageGetHeight(inImage);
    CGRect rect = {{0,0},{w,h}}; 

    // Draw the image to the bitmap context. Once we draw, the memory 
    // allocated for the context for rendering will then contain the 
    // raw image data in the specified color space.
    CGContextDrawImage(cgctx, rect, inImage); 

    // Now we can get a pointer to the image data associated with the bitmap
    // context.
    void *data = CGBitmapContextGetData (cgctx);
    if (data != NULL)
    {

        // **** You have a pointer to the image data ****

        // **** Do stuff with the data here ****

    }

    // When finished, release the context
    CGContextRelease(cgctx); 
    // Free image data memory for the context
    if (data)
    {
        free(data);
    }

}

data幅と高さが同じになるように関数を変更しましたが、メモリブロックポイントを取得できません。

私の関数は次のようになります:

void ManipulateImagePixelData(CGImageRef inImage, 
unsigned long * width, unsigned long * height, void * copy)

最後にデータを解放することはなくなり、後で解放する責任を負います。

私はこのような簡単なことをすることができると思いました:

(caller)
 void * rawPixels=NULL;
ManipulateImagePixelData([obj CGImageForProposedRect:NULL context:[NSGraphicsContext currentContext] hints:nil],&imgWidth1, &imgHeight1, rawPixels)];


(ManipulateImagePixelData function)
void * pixels = CGBitmapContextGetData (cgctx);
    if (pixels != NULL) {
    *width=w;
    *height=h;
    copy=pixels;
    [...]

そして、rawPixelsが前述のブロックを指すようにしますがrawPixels、この呼び出しの後もNULLのままです。私はこれに少し混乱していて、私のCスキルは少し錆びています。

データを取得するにはどうすればよいですか?

4

1 に答える 1

2

関数内で割り当てられたバッファーのアドレスを取得する変数へのポインターを渡す必要が ManipulateImagePixelDataあります。

void ManipulateImagePixelData(CGImageRef inImage, unsigned long * width, unsigned long * height, void ** copy) {

        ...
        void* data = CGBitmapContextGetData (cgctx);
        *copy = data; // copy the output parameter
        ...
}  

そしてそれをこのように呼びます:

void * rawPixels=NULL;
ManipulateImagePixelData([obj CGImageForProposedRect:NULL context:[NSGraphicsContext currentContext] hints:nil],&imgWidth1, &imgHeight1, &rawPixels)];

さらに良いことに、次のように定義できます。

void* ManipulateImagePixelData(CGImageRef inImage, unsigned long * width, unsigned long * height) {

          ...
          void* data = CGBitmapContextGetData (cgctx);
          ...
          return data;
}
于 2012-10-20T09:04:04.790 に答える