Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2009, 16:43   #1
amdbodia
Пользователь
 
Аватар для amdbodia
 
Регистрация: 13.05.2009
Сообщений: 71
По умолчанию Сохранить/считать изображение в/из файл(а).

Компилятор - borland c++
Необходимо сохранить созданный с помощью graphics.h 16-ти цветный рисунок (ega) в файл *.bmp
Потом считать.
Из всего, что искал, понял что в начале файла содержатся поля с описанием, а потом уже битовая таблица.
Каким образом произвести сохранение в файл и потом чтение из него?
Никто, нигде не пишет, все юзают билдеры с готовыми модулями.
Там ведь ничего сложного не должно быть, по идее?
amdbodia вне форума Ответить с цитированием
Старый 23.05.2009, 21:50   #2
amdbodia
Пользователь
 
Аватар для amdbodia
 
Регистрация: 13.05.2009
Сообщений: 71
По умолчанию

Вот, нашёл 2 скрипта, кому интересно. Сейчас буду пробовать запустить.
Код:
struct RGBQUAD {
        unsigned char    rgbBlue;
        unsigned char    rgbGreen;
        unsigned char    rgbRed;
        unsigned char    rgbReserved;
};

struct BITMAPFILEHEADER {

        unsigned short int    bfType;
        unsigned long   bfSize;
        unsigned short int    bfReserved1;
        unsigned short int    bfReserved2;
        unsigned long   bfOffBits;
};

struct BITMAPINFOHEADER {
        unsigned long      biSize;
    long       biWidth;
        long       biHeight;
        unsigned short int       biPlanes;
        unsigned short int       biBitCount;
        unsigned long      biCompression;
        unsigned long      biSizeImage;
        long       biXPelsPerMeter;
        long       biYPelsPerMeter;
        unsigned long      biClrUsed;
        unsigned long      biClrImportant;
};

RGBQUAD get_ega_color( int color ) {

    RGBQUAD v;
    v.rgbReserved = 0;
    
    switch ( color ) {
    case BLACK: v.rgbRed = 0; v.rgbGreen=0; v.rgbBlue=0; break;
    
    case BLUE: v.rgbRed = 0; v.rgbGreen=0; v.rgbBlue=128; break;
    case GREEN: v.rgbRed = 0; v.rgbGreen=128; v.rgbBlue=0; break;
    case CYAN: v.rgbRed = 0; v.rgbGreen=128; v.rgbBlue=128; break;
    case RED: v.rgbRed = 128; v.rgbGreen=0; v.rgbBlue=0; break;
    case MAGENTA: v.rgbRed = 128; v.rgbGreen=0; v.rgbBlue=128; break;
    case BROWN: v.rgbRed = 128; v.rgbGreen=64; v.rgbBlue=0; break;
    
    case LIGHTGRAY: v.rgbRed = 128; v.rgbGreen=128; v.rgbBlue=128; break;
    case DARKGRAY: v.rgbRed = 64; v.rgbGreen=64; v.rgbBlue=64; break;
    
    case LIGHTBLUE: v.rgbRed = 0; v.rgbGreen=0; v.rgbBlue=255; break;
    case LIGHTGREEN: v.rgbRed = 0; v.rgbGreen=255; v.rgbBlue=0; break;
    case LIGHTCYAN: v.rgbRed = 0; v.rgbGreen=255; v.rgbBlue=255; break;
    case LIGHTRED: v.rgbRed = 255; v.rgbGreen=0; v.rgbBlue=0; break;
    case LIGHTMAGENTA: v.rgbRed = 255; v.rgbGreen=0; v.rgbBlue=255; break;
    case YELLOW: v.rgbRed = 255; v.rgbGreen=255; v.rgbBlue=0; break;
    case WHITE: v.rgbRed = 255; v.rgbGreen=255; v.rgbBlue=255; break;
    }
    return v;

}
void save_ega_screen( char * lpFile ) {
    int nWidth = getmaxx() + 1;
    int nHeight = getmaxy() + 1;
    FILE * pFile = fopen( lpFile, "wb" );
    
    // save bitmap file header
    BITMAPFILEHEADER fileHeader;
    fileHeader.bfType = 0x4d42;
    fileHeader.bfSize = 0;
    fileHeader.bfReserved1 = 0;
    fileHeader.bfReserved2 = 0;
    fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 16*sizeof(RGBQUAD);
    fwrite( (char*)&fileHeader, sizeof(fileHeader), 1, pFile );
    
    // save bitmap info header
    BITMAPINFOHEADER infoHeader;
    infoHeader.biSize = sizeof(infoHeader) ;
    infoHeader.biWidth = nWidth;
    infoHeader.biHeight = nHeight;
    infoHeader.biPlanes = 1;
    infoHeader.biBitCount = 4;
    infoHeader.biCompression = 0; // BI_RGB
    infoHeader.biSizeImage = 0;
    infoHeader.biXPelsPerMeter = 0;
    infoHeader.biYPelsPerMeter = 0;
    infoHeader.biClrUsed = 16;
    infoHeader.biClrImportant = 16;
    fwrite( (char*)&infoHeader, sizeof(infoHeader), 1, pFile );

    // palette output
    RGBQUAD palette[16];
    memset( &palette[0], 16*sizeof(RGBQUAD), 0 );
    for (long clr=0; clr<16; clr ++ ) {
        palette[ clr ] = get_ega_color( clr );
    }
    fwrite( (char*)(&palette), 1, 16*sizeof(RGBQUAD), pFile );
    
    // raster output
    int maxx = (getmaxx()+1) / 2;
    int maxy = (getmaxy()+1);
    for ( int y = maxy; y >= 0; y -- ) {
        for ( int x = 0; x<maxx; x++ ) {
        
            // we will place 2 pixels into one byte
            unsigned char pix1 = getpixel( x*2, y );
            unsigned char pix2 = getpixel( x*2 + 1, y );
            unsigned char temp = pix2 | (pix1<<4);
            fwrite( &temp, sizeof( temp ), 1, pFile );
        }
    }
    fclose ( pFile );
}
Это для записи.
amdbodia вне форума Ответить с цитированием
Старый 23.05.2009, 21:50   #3
amdbodia
Пользователь
 
Аватар для amdbodia
 
Регистрация: 13.05.2009
Сообщений: 71
По умолчанию

Код:
#include <alloc.h>
#include <conio.h>
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>


struct BMP
{
  char Type[2];           //File type. Set to "BM".
  unsigned long Size;     //Size in BYTES of the file.
  unsigned long Reserved;      //Reserved. Set to zero.
  unsigned long OffSet;   //Offset to the data.
  unsigned long headsize; //Size of rest of header. Set to 40.
  unsigned long Width;     //Width of bitmap in pixels.
  unsigned long Height;     //  Height of bitmap in pixels.
  unsigned int  Planes;    //Number of Planes. Set to 1.
  unsigned int  BitsPerPixel;       //Number of Bits per pixels.
  unsigned long Compression;   //Compression. Usually set to 0.
  unsigned long SizeImage;  //Size in bytes of the bitmap.
  unsigned long XPixelsPreMeter;     //Horizontal pixels per meter.
  unsigned long YPixelsPreMeter;     //Vertical pixels per meter.
  unsigned long ColorsUsed;   //Number of colors used.
  unsigned long ColorsImportant;  //Number of "important" colors.
};

int ShowBMP(int x, int y, char* FileName)
{
    int b,a;
    BMP Obj;

    unsigned char* Datas;
    int in=0;
    unsigned char c=0;
    FILE * fp;

    fp = fopen(FileName,"rb");
    if(!fp){
    printf("Error : Unable to open file ..");
    exit(0);
    }

    fread(&Obj, sizeof(Obj), 1, fp);
    if(Obj.BitsPerPixel!=4)  // This isn't a 16 color bmp we can read;
    {
     fclose(fp);
     printf("Error : File format not supported ..");
     exit(0);
    };
    fseek(fp,Obj.OffSet,SEEK_SET);
    Datas=(unsigned char*) calloc(Obj.Width/2+1, sizeof(unsigned char));
    for(b=Obj.Height;b>=0;b--)
    {
     fread(Datas, sizeof(unsigned char), Obj.Width/2, fp);
     c=0;
     in=0;
     for(a=0;a<=Obj.Width;a+=2)
     {
         c = (Datas[in] | 0x00) >>4;
         putpixel(a+x,b+y,c);
         c = (Datas[in] | 0xF0) & 0x0F;
         putpixel(a+1+x,b+y,c);
         in++;
     }
    }
    free (Datas);
    fclose(fp);
    return 1;
}
void main()
{
int color;
int gd , gm ;
gd = VGA ; gm = VGAHI;

initgraph(&gd,&gm,"");
ShowBMP(0,0,"tune.bmp");
getch();
closegraph();
}
Это для чтения.
amdbodia вне форума Ответить с цитированием
Старый 24.05.2009, 15:27   #4
amdbodia
Пользователь
 
Аватар для amdbodia
 
Регистрация: 13.05.2009
Сообщений: 71
По умолчанию

В общем за день изучил тему. Если кому-то нужна будет помощь по сабжу - пишите тут.
amdbodia вне форума Ответить с цитированием
Старый 26.05.2009, 20:05   #5
Mixabuben
Новичок
Джуниор
 
Регистрация: 26.05.2009
Сообщений: 1
По умолчанию

Спасибо, то что искал
Mixabuben вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранить графический файл NSvirus Паскаль, Turbo Pascal, PascalABC.NET 1 05.05.2009 04:11
файл сохранить на Хостенге atlon Общие вопросы C/C++ 3 10.02.2009 21:04
Считать wav-файл С++ Skido Помощь студентам 4 30.01.2009 03:06
считать поочередно каждую строчку и записать в батовский файл elplado Паскаль, Turbo Pascal, PascalABC.NET 3 16.11.2008 17:29
Как побайтно считать файл и записать в другой SeRhy Общие вопросы Delphi 2 09.06.2008 21:54