0

24 ビットの圧縮されていないビットマップを R、G、B 符号なし文字の 2D 配列にロードし、再度保存しました。バイナリ モードでファイル ストリームを使用して、自動フォーマットが発生しないようにし、ヘッダーはインポートされたのと同じようにエクスポートされます。全体...幅が4の倍数の画像を使用しているため、パディングは必要ありません。

それでも、出力には添付の問題、ある種の...変形があります画像はそれ自体を物語っています

注 : バイナリ モードで FILE と fstream の両方を試したところ、すべてその出力が得られました。もう 1 つのことは、出力を 16 進エディターで確認したところ、何らかの破損のように見える "CD" の値が非常に繰り返されていることがわかりました。

更新:ソースコード:

#include <fstream>
#include <iostream>
#pragma pack(2)
using namespace std;
struct RGB
{
    unsigned char R,G,B;
};

int main()
{
    ifstream f("Picture.bmp",ios::in|ios::binary);
    unsigned char Header[54];
    f.read(reinterpret_cast <char*> (Header),54);
    int W=*(int*) (&Header[18]);
    int H=*(int*) (&Header[22]);

    RGB**Pic=new RGB*[H];
    for (int i=0;i < H;i++)
    {
        Pic[i]=new RGB[W];
        for (int i2=0;i2<W;i2++)
        {
            f>>Pic[i][i2].R;
            f>>Pic[i][i2].B;
            f>>Pic[i][i2].G;
        }
    }
    ofstream save("Output.bmp",ios::out|ios::binary);
    save.write(reinterpret_cast<char*>(&Header),54);
    for (int i=0;i < H;i++)
    {
        for (int i2=0;i2<W;i2++)
        {
            save<<Pic[i][i2].R;
            save<<Pic[i][i2].B;
            save<<Pic[i][i2].G;
        }
    }
        return 0;
}

前もって感謝します。

4

1 に答える 1

0

あなたが抱えている問題は、初期化されていない値ではなく、>>演算子がどのように機能するかです。読み取る前に空白をスキップします (ios::binaryモードであっても)。0x0Aそのため、空白文字 ( 、など)に達する0x0Dとスキップされ、出力が破損します。

f >> noskipwsファイルで作業する前に追加することで、これを修正できます。

通常、read()/write()(またはget()/put()単一文字の) バイナリ ファイルを操作し、抽出演算子は使用しません。幅と高さの取得方法と同様です。そうすれば、バイトfile >> someintを読み取る代わりに数字を解析しようとします。sizeof(int)

于 2016-12-28T08:10:16.550 に答える