Отображение картинки bmp - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Привет. Пытаюсь отобразить картинку по вертикали, но компилятор ругается. Подскажите, что не так? Буду благодарен
#include <stdint.h>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
 
typedef struct BitMapFileHeader
{
    uint16_t bfType1;
    uint16_t bfType2;
    uint32_t bfSize;
    uint32_t notUsed;
    uint32_t bfOffBits;
    uint32_t biSize;
    uint32_t biWidth;
    uint32_t biHeight;
    uint16_t biPlanes;
    uint16_t biBitCount;
    uint32_t biCompression;
    uint32_t biSizeImage;
    uint32_t biXPelsPerMeter;
    uint32_t biYPelsPerMeter;
    uint32_t biClrUsed;
    uint32_t biClrImportant;
} BMPHeader;
 
char* image;
BMPHeader *p_header;
void readFile(char *path)
{
    FILE *pFile;
 
    int width, height, imageSize, bytes;
    p_header = (BMPHeader*)malloc(sizeof(BMPHeader));
 
    if(fread(&pFile, path, "rb" ) != 0)
    {
        fputs("openError",stderr);
        exit(1);
    }
 
    if(fread(p_header, sizeof(char), 54, pFile) != 54)
    {
        fputs("headreadError",stderr);
        exit(1);
    }
    if((*p_header).bfType1 != 'B' || (*p_header).bfType2 != 'M')
    {
        fputs("Wrong format",stderr);
        exit(1);
    }
    imageSize = (*p_header).biSizeImage;
    image = (char*)malloc(imageSize);
    fseek (pFile, 54, SEEK_SET);
 
    if (fread(image, 1, imageSize, pFile) != imageSize)
    {
        fputs("readImError",stderr);
        exit(1);
    }
    fclose(pFile);
}
void writeFile(char* path)
{
    FILE *file;
    if(fread(file,path,"wb") != 0)
    {
        fputs("openError",stderr);
        exit(1);
    }
    fwrite(p_header, 1, 54, file);
    fwrite(image,(*p_header).biSizeImage, 1, file);
    fclose(file);
}
void Reverse()
{
    int i,k,length;
    char* buf;
    length = ((*p_header).biWidth * 3 + (*p_header).biWidth%4);
    buf = (char*)malloc(length);
    for (i=0; i<(*p_header).biHeight/2;i++)
    {
        for(k=0;k<length;k++)
        {
            buf[k] = image[k+length*i];
            image[k+length*i]=image[k+length*((*p_header).biHeight-1-i)];
            image[k+length*((*p_header).biHeight-1-i)] = buf[k];
        }
    }
}
void main()
{
    readFile("1.bmp");
    Reverse();
    writeFile("result.bmp");
}
gcc -o lab6 lab6.c
lab6.c: In function `readFile':
lab6.c:35: warning: passing arg 2 of `fread' makes integer from pointer without a cast
lab6.c:35: warning: passing arg 3 of `fread' makes integer from pointer without a cast
lab6.c:35: error: too few arguments to function `fread'
lab6.c: In function `writeFile':
lab6.c:65: warning: passing arg 2 of `fread' makes integer from pointer without a cast
lab6.c:65: warning: passing arg 3 of `fread' makes integer from pointer without a cast
lab6.c:65: error: too few arguments to function `fread'
lab6.c: In function `main':
lab6.c:91: warning: return type of 'main' is not `int'
lab6.c:97:2: warning: no newline at end of file

Решение задачи: «Отображение картинки bmp»

textual
Листинг программы
#include <stdio.h>
#include <malloc.h>
 
 
struct
{
    short signature;
    int size;
    int adress;
    int lengthHead;
    int lenght;
    int heigh;
    short numColPlosk;
    short bitPerPix;
    int comprMet;
    int arrLenght;
    int gorResolution;
    int vertResolution;
    int numColors;
    int numMainColors;
} headBMP;
 
char *pic;
void readPic(char *path)
{
    long int i;
    FILE *pFile;
    pFile=fopen(path, "rb");
    if(pFile == NULL) {printf("error open pFile"); exit(1);}
    else
    {
        fread(&headBMP.signature, sizeof(short), 1, pFile);
        if(headBMP.signature != (short)0x4d42){printf("pFile not bmp");exit(1);}
        else
        {
            fread(&headBMP.size, sizeof(int), 1, pFile);
            fseek(pFile,2*sizeof(short), SEEK_CUR);
            fread(&headBMP.adress, sizeof(int), 1, pFile);
            fread(&headBMP.lengthHead, sizeof(int), 1, pFile);
            fread(&headBMP.lenght, sizeof(int), 1, pFile);
            fread(&headBMP.heigh, sizeof(int), 1, pFile);
            fread(&headBMP.numColPlosk, sizeof(short), 1, pFile);
            fread(&headBMP.bitPerPix, sizeof(short), 1, pFile);
            if(headBMP.bitPerPix !=(short)24){printf("Bmp is not 24\n"); exit (1);}         
            else
            {
                fread(&headBMP.comprMet, sizeof(int), 1, pFile);
                fread(&headBMP.arrLenght, sizeof(int), 1, pFile);
                fread(&headBMP.gorResolution, sizeof(int), 1, pFile);
                fread(&headBMP.vertResolution, sizeof(int), 1, pFile);
                fread(&headBMP.numColors, sizeof(int), 1, pFile);
                fread(&headBMP.numMainColors, sizeof(int), 1, pFile);
            }
        }
        pic=(char*)malloc(3*headBMP.heigh*headBMP.lenght*sizeof(char));
        if(pic==0){printf("Not ram\n");exit (1);}
            else
            {
                fseek(pFile,54*sizeof(char),SEEK_SET);
                for (i=0;i<3*headBMP.heigh*headBMP.lenght; i++)
                {
                    if(i%(3*headBMP.lenght)==0 && i !=0)
                    {
                        fseek(pFile,sizeof(char)*((headBMP.arrLenght-(3*headBMP.lenght*headBMP.heigh))/headBMP.heigh), SEEK_CUR);
                    }
                    fread(&pic[i],sizeof(char),1,pFile);
                }
            }
        }
    fclose(pFile);
}
void writePic(char *path)
{
    long int i;
    FILE *pFile;
    pFile=fopen(path, "wb");
    if(pFile==NULL)
    {
        printf("error with open");
    }
    else
    {
        fwrite(&headBMP.signature,sizeof(short),1,pFile);
        fwrite(&headBMP.size, sizeof(int),1,pFile);
        fseek(pFile,2*sizeof(short),SEEK_CUR);
        fwrite(&headBMP.adress,sizeof(int),1,pFile);
        fwrite(&headBMP.lengthHead,sizeof(int),1,pFile);
        fwrite(&headBMP.lenght,sizeof(int),1,pFile);
        fwrite(&headBMP.heigh,sizeof(int),1,pFile);
        fwrite(&headBMP.numColPlosk,sizeof(short),1,pFile);
        fwrite(&headBMP.bitPerPix,sizeof(short),1,pFile);
        fwrite(&headBMP.comprMet,sizeof(int),1,pFile);
        fwrite(&headBMP.arrLenght,sizeof(int),1,pFile);
        fwrite(&headBMP.gorResolution,sizeof(int),1,pFile);
        fwrite(&headBMP.vertResolution,sizeof(int),1,pFile);
        fwrite(&headBMP.numColors,sizeof(int),1,pFile);
        fwrite(&headBMP.numMainColors,sizeof(int),1,pFile);
 
        fseek(pFile, 54*sizeof(char), SEEK_SET);
        for(i=0;i<3*headBMP.heigh*headBMP.lenght;i++)
        {
            if(i%(3*headBMP.lenght)==0 && i !=0)
            {
                fseek(pFile,sizeof(char)*((headBMP.arrLenght-(3*headBMP.lenght*headBMP.heigh))/headBMP.heigh), SEEK_CUR);
            }
            fwrite(&pic[i],sizeof(char),1,pFile);
        }
        for(i=0;i<((headBMP.arrLenght-(3*headBMP.lenght*headBMP.heigh))/headBMP.heigh);i++)
        {
            fwrite(&pic[1],sizeof(char),1,pFile);
        }
    }
    fclose(pFile);
}
void verticalReflectC()
{
    char buf = 0x00;
    int i,k;
    for (i=0;i<headBMP.heigh/2;i++)
    {
        for(k=0;k<headBMP.lenght*3;k++)
        {
            buf=pic[k+(headBMP.lenght*3)*i];
            pic[k+(headBMP.lenght*3)*i]=pic[(headBMP.heigh-i-1)*headBMP.lenght*3+k];
            pic[(headBMP.heigh-i-1)*headBMP.lenght*3+k]=buf;
        }
    }
}
int main( int argc, char** argv )
{
    readPic("1.bmp");
    verticalReflectC();
    writePic("result.bmp");
    free(pic);
    return 0;
}

Объяснение кода листинга программы

Структура данных headBMP содержит поля, которые описывают информацию о файле BMP. Список полей headBMP:

  1. signature - подпись файла BMP, должна быть равна 0x4d42.
  2. size - размер изображения в байтах, включая информацию о голове.
  3. adress - адрес начала изображения в файле.
  4. lengthHead - длина головы изображения в байтах.
  5. lenght - длина изображения в байтах.
  6. heigh - высота изображения в пикселях.
  7. numColPlosk - количество цветов в палитре изображения.
  8. bitPerPix - количество бит, используемых для представления одного пикселя.
  9. comprMet - метод сжатия изображения.
  10. arrLenght - длина массива цветов в палитре изображения.
  11. gorResolution - горизонтальное разрешение изображения в пикселях на дюйм.
  12. vertResolution - вертикальное разрешение изображения в пикселях на дюйм.
  13. numColors - общее количество цветов в изображении.
  14. numMainColors - количество основных цветов в палитре изображения. Функция readPic открывает файл BMP, считывает информацию о голове изображения и сам образ. Если файл не является BMP файлом или имеет неправильную структуру, выводится сообщение об ошибке и программа завершается. Функция writePic записывает информацию о голове изображения и сам образ в файл BMP. Функция verticalReflectC отражает изображение по вертикали, используя буфер buf для временного хранения пикселей. В функции main сначала вызывается функция readPic для чтения изображения, затем функция verticalReflectC для отражения изображения по вертикали, и, наконец, функция writePic для записи измененного изображения в файл result.bmp. После этого выделенная память освобождается и программа возвращает 0, что означает успешное выполнение.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.429 из 5