0

私が生成したバイトの配列を取り、それらをこのビットマップに書き出す次のコードがあります。ピクセル形式を Format4bppIndexed に設定すると、読み取り可能な画像が幅方向に 4 回繰り返されます。Format1bppIndexed (正しい設定) に設定すると、1 つの大きな読み取り不可能な画像が取得されます。

画像はデコードされた Jbig2 画像でした。バイトが正しいことはわかっていますが、それを 1bpp の読み取り可能な形式にする方法がわかりません。

誰かその件について何かアドバイスはありますか

        Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format1bppIndexed);

        //Create a BitmapData and Lock all pixels to be written           
        BitmapData bmpData = bitmap.LockBits(
                             new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                             ImageLockMode.WriteOnly, bitmap.PixelFormat);

        //Copy the data from the byte array into BitmapData.Scan0
        Marshal.Copy(newarray, 0, bmpData.Scan0, newarray.Length);
        //Unlock the pixels
        bitmap.UnlockBits(bmpData);
4

2 に答える 2

0

以下は機能する可能性がありますが、私の記憶が正しければStride効果がある場合があり、単純なブロックコピーでは不十分です (代わりに行ごとに使用する必要があります)。

Bitmap bitmap = new Bitmap(
    width, 
    height, 
    System.Drawing.PixelFormat.Format16bppGrayScale
    );

必要な Stride を処理するには:

    BitmapData^ data = bitmap->LockBits(oSize, 
        ImageLockMode::ReadOnly, bitmap->PixelFormat);
    try {
        unsigned char *pData = (unsigned char *)data->Scan0.ToPointer();

        for( int x = 0; x < bmpImage->Width; ++x )
        {
            for( int y = 0; y < bmpImage->Height; ++y )
            {
                // Note: Stride is data width of scan line rounded up
                //       to 4 byte boundary.  
                // Requires use of Stride, not (width * pixelWidth)
                int ps = y*bmpImage->Width*(nBitsPerPixel / 8)
                         + x * (nBitsPerPixel / 8);
                int p = y * data->Stride + x * (nBitsPerPixel / 8);
                Byte lo = newarray[ps + 1];
                Byte hi = newarray[ps + 0];
                pData[p + 1] = lo;
                pData[p + 0] = hi;
            }
        }
    } finally {
        bmpImage->UnlockBits(data);
    }

注: これは C++/CLI で記述されています。ここでの操作のいずれかに相当する C# が必要な場合はお知らせください。(また、ビットマップへの書き込みではなく、ビットマップからの読み取りから取得したので、まだ少し荒いかもしれませんが、うまくいけばアイデアが得られるはずです...)

于 2013-11-13T16:55:25.980 に答える