このコードを使用して、bmpファイルからピクセルを取得しています。前の行ですでにヘッダーとパレットを読み込んでいるので、FILE *はピクセル配列の先頭に向いています。 最初の行を読み取ってOKを返します.1000が返されますが、2行目のピクセルを読み取ろうとすると0が返されます。BMPファイルからピクセルを読み込み、0を返します。
これはFILE *を受け取り、それらをbmp_typeに保存しようとします。 fila_alineadaは整列された行サイズで、パディングのためにこれを行う必要がありました。
bool leer_pixels_8bpp( FILE *fbmp, bmp_t *imagen,
const uint32_t fila_alineada,
const bool btopdown){
int32_t i;
long x, y;
int32_t height, width, contador;
uint8_t *ptmp;
uint8_t bufferfila[fila_alineada];
height = imagen->infoheader.height;
width = imagen->infoheader.width;
contador = height;
i = btopdown ? 1 : -1;
y = btopdown ? 0 : (height - 1);
for (; contador--; y += i) /* row loop */
{
/* reading row */
if (fread(bufferfila, sizeof(uint8_t), fila_alineada, fbmp) != fila_alineada)
{ /* HERE is the PROBLEM, it reads ok once, but in the second loop it returns 0 */
fprintf(stderr, "Error reading pixels row.\n");
return false;
}
ptmp = bufferfila;
/* saving pixels into bmp_t */
for (x = 0L; x < width; x++)
{
imagen->pixels[y][x] = imagen->paleta.colores[ *ptmp++ ];
}
}
return true;
}
私は貴様のBMPのを試してみました!問題はここにあるのでしょうか、コード全体を見直すべきですか? 誰かが私に助けてくれることを願っています。ありがとうございます。
本当に0を返しますか、または '' fila_alineada''と異なる値を返していますか?この場合、ファイルの終わりに達すると期待されます... – Fred
(fread)ブロックの後にコードをコメントアウトできますか?ポインタが破損した場合、freadは失敗する可能性があります。 – Shash316
おかげさまで、ありがとうございました。 ピクセルあたりのファイルビットの種類に応じて、leer_1bpp/8bpp/24bpp(3種類の機能)を呼び出すスイッチを使用していました。しかし、私はスイッチのそれぞれのケースで '休憩'が欠けていた。 ドットは分かっていますが、現在は動作しています。 私はfreadの値を見るためにデバッグをチェックしたかったのですが、何らかの理由でkdbgは現在のコンテキストでシンボルフリーダをしていませんが、そのブレークを入れる前にfread(.........)の戻り値を示しました。 とにかく読んでいるのですが、いくつかのftellを入れて何バイト読みとったのか分かりましたので、大丈夫です。 ありがとう! – nitrnitr