0

以下のコードは、画像を取得し、そのコンポーネントを vImage_Buffer に抽出してから、このバッファをループして各コンポーネントを取得し、outputBuffer に入力することで赤と青のチャンネルを反転させようとする試みです。その後、結果の outputBuffer を取得し、そこから UIImage を作成したいと考えています。

次のコードは正常にコンパイルおよび実行されますが、outputImage は空白であり、エラーは発生しません。

CGFloat inputImageScale = inputImage.scale;

CGSize outputImageSizeInPoints = inputImage.size;
CGRect outputImageRectInPoints = { CGPointZero, outputImageSizeInPoints };

UIGraphicsBeginImageContextWithOptions(outputImageRectInPoints.size, NO, inputImageScale);
CGContextRef outputContext = UIGraphicsGetCurrentContext();
CGContextScaleCTM(outputContext, 1.0, -1.0);
CGContextTranslateCTM(outputContext, 0, -outputImageRectInPoints.size.height);

vImage_Buffer originalBuffer;

vImage_Buffer *inputBuffer;
vImage_Buffer *outputBuffer;
vImage_CGImageFormat format = {
    .bitsPerComponent = 8,
    .bitsPerPixel = 32,
    .colorSpace = NULL,
    // (kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little)
    // requests a BGRA buffer.
    .bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little,
    .version = 0,
    .decode = NULL,
    .renderingIntent = kCGRenderingIntentDefault
};

vImage_Error e = vImageBuffer_InitWithCGImage(&originalBuffer, &format, NULL, inputImage.CGImage, kvImagePrintDiagnosticsToConsole);
if (e != kvImageNoError)
{
    NSLog(@"*** error: vImageBuffer_InitWithCGImage returned error code %zi for inputImage: %@", e, inputImage);
    UIGraphicsEndImageContext();
    return nil;
}

inputBuffer = &originalBuffer;
vImageBuffer_Init(outputBuffer, originalBuffer.height, originalBuffer.width, format.bitsPerPixel, kvImageNoFlags);

Byte *data = (Byte*)inputBuffer->data;

for(vImagePixelCount i = 0; i < inputBuffer->width + inputBuffer->height; i+=4) {
    Byte B = (Byte)data[i];
    Byte G = (Byte)data[i + 1];
    Byte R = (Byte)data[i + 2];
    Byte A = (Byte)data[i + 3];
    NSLog(@"1: (%d) %d, %d, %d, %d", i, R,G,B,A);
    ((Byte*)outputBuffer->data)[i] = R;
    ((Byte*)outputBuffer->data)[i + 1] = G;
    ((Byte*)outputBuffer->data)[i + 2] = B;
    ((Byte*)outputBuffer->data)[i + 3] = A;
}

CGImageRef effectCGImage = vImageCreateCGImageFromBuffer(outputBuffer, &format, &cleanupBuffer, NULL, kvImageNoFlags, &e);

// draw effect image
CGContextSaveGState(outputContext);
CGContextDrawImage(outputContext, outputImageRectInPoints, effectCGImage);
CGContextRestoreGState(outputContext);

// Cleanup
CGImageRelease(effectCGImage);

// Output image is ready.
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return outputImage;

では、上記のコードのどこが間違っているのでしょうか?

PS: チャンネルを反転するためにいくつかの vImage_ 関数を使用できることは知っていますが、それは私が達成しようとしているポイントではありません。私が達成したいのは、ピクセルを1つずつ変更して画像を変更することです。最終的に私の意図は DisplacementMapFilter を作成することです (提供されたマップに基づいて画像ピクセルを変換します)。

4

1 に答える 1

2

問題を理解しました。この場合の特定の問題は次のとおりです。

for(vImagePixelCount i = 0; i < (inputBuffer->幅 * inputBuffer->高さ * 4); i+=4)

バッファのごく一部だけをループしていました。今、バッファ全体をループしています。

于 2015-05-28T16:11:47.090 に答える