Fond:
Je souhaite copier une image bmp (non compressée 24 RVB) d'un nom de fichier à un autre. J'utilise le compilateur mingw de TDM-GCC (version 4.9.2, 32 bits, SJLJ) fourni avec des blocs de code.Copie d'un bmp dans c
Problème:
Le programme fonctionne pour les images en noir et blanc et les images couleur simples, mais pas les images couleur compliquées. Veuillez revoir les images ci-jointes. Je n'avais pas assez de réputation pour poster les autres images donc j'ai essayé de poster les 2 plus pertinentes. Le programme est incapable de copier l'image de lenna. Quelle est la cause de ce comportement?
code:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#pragma pack(1)
/* The following is to access the DIB information
https://msdn.microsoft.com/en-us/library/cc230309.aspx
https://msdn.microsoft.com/en-us/library/dd183374(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/dd183376(v=vs.85).aspx */
typedef uint8_t BYTE;
typedef uint32_t DWORD;
typedef int32_t LONG;
typedef uint16_t WORD;
typedef struct
{
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
}BITMAPFILEHEADER;
typedef struct
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
}BITMAPINFOHEADER;
typedef struct
{
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
}RGBTRIPLE;
int main(void)
{
char *infile = "testin.bmp";
char *outfile = "testout.bmp";
FILE *inptr = fopen(infile, "r");
if (inptr == NULL)
{
fprintf(stderr, "Could not open %s.\n", infile);
return 2;
}
FILE *outptr = fopen(outfile, "w");
if (outptr == NULL)
{
fclose(inptr);
fprintf(stderr, "Could not create %s.\n", outfile);
return 3;
}
BITMAPFILEHEADER bf;
fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);
BITMAPINFOHEADER bi;
fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);
fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, outptr);
fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, outptr);
int padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
int i, j, k, biHeight;
for(i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
{
for(j = 0; j < bi.biWidth; j++)
{
RGBTRIPLE triple;
fread(&triple, sizeof(RGBTRIPLE), 1, inptr);
fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);
}
}
fseek(inptr, padding, SEEK_CUR);
for(k = 0; k < padding; k++)
{
fputc(0x00, outptr);
}
fclose(inptr);
fclose(outptr);
return 0;
}
image d'entrée:
image de sortie:
Ce serait un problème dans MSC - à propos de gcc sur Windows Je ne suis pas sûr. Cependant, s'il vous plaît, essayez 'fopen (infile," rb ")' et 'fopen (outfile," wb ")' et signalez si cela change quelque chose. (Au mieux, cela résout le problème, au moins cela ne change rien.) – Scheff
Il y a de nombreux problèmes avec ce code. Vous ne l'avez obtenu que par une coïncidence. Votre objectif consiste-t-il simplement à copier le bitmap? ou extraire des informations bitmap d'informations? Si vous voulez juste copier, il y a une solution beaucoup plus simple. –