1

CIMaximumComponentを使用して、画面に表示されている画像をグレースケールに変換しました。ここで、グレースケール イメージを繰り返し処理し、強度が 150 未満の場合は 0 として格納されるようにしきい値を適用します。それ以外の場合は 1 になります。

画像を繰り返し処理するために、次のチュートリアルに従って、 このコードを思いつきました。

- (IBAction)thresholdImage:(id)sender {



CGImageRef sourceImage = self.imageView.image.CGImage;

CFDataRef theData; //creates a variable of CFDataRef to store data of the image.


theData = CGDataProviderCopyData(CGImageGetDataProvider(sourceImage)); //assigns theData variable to the actual image

UInt8 *pixelData = (UInt8 *) CFDataGetBytePtr(theData);

int dataLength = CFDataGetLength(theData);



for (int index = 0; index < dataLength; index += 4)
{
    if (pixelData[index]  < 150)
    {
        pixelData[index] = 0;

    } else
    {
        pixelData[index] = 1;

    }
}

CGContextRef context;


//gets info about the image such as its width, height, bytes per row, colorspace etc
context = CGBitmapContextCreate(pixelData,
                                CGImageGetWidth(sourceImage),
                                CGImageGetHeight(sourceImage),
                                8,
                                CGImageGetBytesPerRow(sourceImage),
                                CGImageGetColorSpace(sourceImage),
                                CGImageGetBitmapInfo(sourceImage));

CGImageRef newCGImage = CGBitmapContextCreateImage(context);
UIImage *newImage = [UIImage imageWithCGImage:newCGImage];

CGContextRelease(context);
CFRelease(theData);
CGImageRelease(newCGImage);



//assign the output image to the imageview to display it

self.imageView.image = newImage;

}

ただし、アプリを実行してしきい値ボタンを押すと (上記のメソッドが呼び出されます)、アプリがクラッシュし、次のエラーが表示されます。

CoreFoundation`CFDataGetBytePtr:
0x32f6e0cc:  ldr    r1, [r0]

出力に (lldb) と表示されます

誰か助けてくれませんか?

どうもありがとう!

4

0 に答える 0