大きなグレースケール イメージをカラーに変換するときに、ポインタ オフセットに問題があるようです。24,000 x 27,000 グレースケール イメージを Direct2D 用の 32 ビット RGB イメージに変換しています (D2D の要件)。
画像のハイライトを行っていますが、カスタム パレットを使用して自動的に行う方法が実際には見つからなかったので、すべてのピクセル値をループして 32 ビット画像に手動で設定しました。小さい画像では問題なく動作しますが、上記で説明したように大きい画像を使用しようとするとクラッシュします。
以下はコードスニペットです。
CvMat* dst = cvCreateMat(height, width, CV_8UC4);
#pragma omp parallel num_threads(nThreads)
{
#pragma omp for
for( int Y = 0; Y < height; Y++ )
{
for( int X = 0; X < width; X++ )
{
size_t nOffset = X + Y * width;
size_t nOffsetRGB = (X + Y * width) * 4;
switch( pPixelData[nOffset] )
{
case 0: //red
{
dst->data.ptr[nOffsetRGB] = 0;
dst->data.ptr[nOffsetRGB + 1] = 0;
dst->data.ptr[nOffsetRGB + 2] = 255;
//pDestination[nOffsetRGB + 3] = 255; //alpha opacity %
break;
}
default: //GrayScale
{
dst->data.ptr[nOffsetRGB] = pPixelData[nOffset];
dst->data.ptr[nOffsetRGB + 1] = pPixelData[nOffset];
dst->data.ptr[nOffsetRGB + 2] = pPixelData[nOffset];
//pDestination[nOffsetRGB + 3] = 255; //pSource[nOffset]; //alpha %
break;
}
}
} //next X
} //next Y
}
このコードは最終的にメモリへのアクセスに関するエラーでクラッシュしますが、グレースケール画像が良好で、十分なメモリ (16GB) があることを確認したので、これは不可能だと思います。少し小さい画像でも問題なく機能します。
ここで私が間違っている可能性があることは何か、プログラムを64ビットに変換するのはこれが初めてなので、何かが欠けている可能性があります。
ありがとう!