関数に割り当てられたメモリブロックを保持したい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スキルは少し錆びています。
データを取得するにはどうすればよいですか?