Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отобразить BMP файл через граф. C++, Работа в графике (C++) 
:(
    Опции темы
HELPER
  Дата 18.4.2005, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 18.4.2005

Репутация: -2
Всего: -2



smile Народ, хелп!
Я тут замаялся с отображением файлов *.bmp smile (а именно 16 цветов размер 200X200 до 300X300 в пикселях) в графическом режиме C. Чето в инете я нашел описание bmp только для win 3.0 для файлов созданных в PAINT WINXP не работает.... =(((

Если кто может: дайте ссылки на инфу , сразу код smile , или растолкуйте где вообще найти можно, надо мне ето очень срочно...
PM MAIL   Вверх
_hunter
Дата 18.4.2005, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



то именно тебе нужно? описание структур -- на мсдн-е


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
HELPER
Дата 18.4.2005, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 18.4.2005

Репутация: -2
Всего: -2



ну, мля, желательно функцию, например: smile

void readBMP (char *fBmpName); //выведет на экран из етого файла 16 цветный BMP файлик
{
//бла бла бла
return;
}

Добавлено @ 16:55
а МСДН где я те достану???? у меня нема.... =(((
PM MAIL   Вверх
_hunter
Дата 18.4.2005, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



в инете smile
msdn.microsoft.com

( под дос не писал, так что кода -- недам ( да и вообще не рисовал ) )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
HELPER
Дата 19.4.2005, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 18.4.2005

Репутация: -2
Всего: -2



да блин, так никто нормально не ответил, в МСДН не нашел, я навернро не внимательно смотрел....
заранее благодарен за прямую ссылку на инфу smile
PM MAIL   Вверх
_hunter
Дата 19.4.2005, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



какой вопрос -- такой ответ... ( что тебе нужно ты так и не сказал -- функции для чтения и отображения карты в с нету )
инфы по структуре BMP в сети -- хоть засыпся ( прямо так в гугле можеш набирать )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
np9mi7
  Дата 19.4.2005, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



HELPER давай почту, пришлю
Да жачем ждать. Все на мего низком уровне:
Код

//////////////////////////////////////////////////
//////////// 3xbmp.h
//////////////////////////////////////////////////
typedef struct _WinBMPFileHeader                                                            //заголовок файла
{
    unsigned int    /*WORD*/    FileType;
    unsigned long    /*DWORD*/    FileSize;
    unsigned int    /*WORD*/    Reserved_1;
    unsigned int    /*WORD*/    Reserved_2;
    unsigned long    /*DWORD*/    Offset;
} WinBMPFileHeader;
typedef struct _Win3xBitMapHeader                                                            //заголовок изображения
{
    unsigned long    /*DWORD*/    Size;
    signed long    /*LONG*/    Width;
    signed long    /*LONG*/    Height;
    unsigned int    /*WORD*/    Planes;
    unsigned int    /*WORD*/    BitPerPixel;
    unsigned long    /*DWORD*/    Compression;
    unsigned long    /*DWORD*/    SizeOfBitmap;
    signed long    /*LONG*/    HorzRezolution;
    signed long    /*LONG*/    VertRezolution;
    unsigned long    /*DWORD*/    ColorsUsed;
    unsigned long    /*DWORD*/    ColorsImportant;
} Win3xBitMapHeader;
typedef struct _Win3xPaletteElement                                                            //палитра
{
    unsigned char    /*BYTE*/    Blue;
    unsigned char    /*BYTE*/    Green;
    unsigned char    /*BYTE*/    Red;
    unsigned char    /*BYTE*/    Reserved;
} Win3xPaletteElement;
typedef struct _Win3xBMPData                                                                //данные изображения
{
    unsigned char    /*BYTE*/    Blue;
    unsigned char    /*BYTE*/    Green;
    unsigned char    /*BYTE*/    Red;
} Win3xBMPData;
// ----------------------------------------------------------------------------------------------
//////////////////////////////////////////////////
//////////// funk.cpp
//////////////////////////////////////////////////

#include "FUNK.H"
#include "DOS.H"
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
//--                                                            //инициализация нового видео режима
unsigned int INITVIDEO(const unsigned int NEW_VIDEO)
{
    unsigned int OLD_VIDEO;
    REGS regs;
    //--                                                        //узнаем номер текущего видео режима
    regs.x.ax=0x4f03;
    int86(0x10,&regs,&regs);
    OLD_VIDEO=regs.x.bx;
    //--
    //--                                                        //устанавливаем новый видеорежим
    regs.x.ax=0x4f02;
    regs.x.bx=NEW_VIDEO;
    int86(0x10,&regs,&regs);
    //--
    return OLD_VIDEO;
}
//--                                                            //прорисовка точки на экране в указанное место
void DRAWPOINT(const unsigned long X,const unsigned long Y,const int R,const int G,const int B,int &WINDOW,const unsigned int RX)
{
    unsigned long SET_POINT_TO;
    REGS regs;
    SET_POINT_TO = ( Y * (RX) + X) * 4;                            //вычисляем сдвиг в памяти
    if(WINDOW != SET_POINT_TO / 65536)                            //вычисляем номер окна и сравниваем его с текущим
    {                                                            //окна не совпали (произошел сдвиг за 64 кБайт)
        //--                                                    //устанавливаем новое окно
        regs.x.ax = 0x4F05;
        regs.h.bh = 0;
        regs.h.bl = 0;
        regs.x.dx = SET_POINT_TO / 65536;
        int86(0x10,&regs,&regs);
        WINDOW = SET_POINT_TO / 65536;
        //--
    }
    //--                                                        //прорисовываем точку на экране
    pokeb(0xA000,SET_POINT_TO    ,B);
    pokeb(0xA000,SET_POINT_TO + 1    ,G);
    pokeb(0xA000,SET_POINT_TO + 2    ,R);
    pokeb(0xA000,SET_POINT_TO + 3    ,0);
    //--
}
//--                                                            //очистка экрана                                                            //прорисовка четырех угольника на экран с указанными координатами углов
void DRAWQUADRANGLE(const unsigned long X1,const unsigned long Y1,const unsigned long X2,const unsigned long Y2,const int R,const int G,const int B,int &WINDOW,int RX)
{
    unsigned long x1,x2,y1,y2,x,y;
    //--                                                        //левый верхний, правый нижний
    if(X1<X2)
    {
        x1=X1;
        x2=X2;
    }
    else
    {
        x1=X2;
        x2=X1;
    }
    if(Y1<Y2)
    {
        y1=Y1;
        y2=Y2;
    }
    else
    {
        y1=Y2;
        y2=Y1;
    }
    //--                                                        //рисуем саму фигуру
    for(x=x1;x<=x2;x++)
    {
        for(y=y1;y<=y2;y++)
        {
            DRAWPOINT(x,y,R,G,B,WINDOW,RX);
        }
    }
    //--
}
void INFO(char *STROKA)
{
    cout<<STROKA<<flush;
    cout<<"Press any key to continue..."<<flush;
    getch();
    exit(1);
}
void ERRORR(char *STROKA)
{
    cout<<STROKA<<flush;
    cout<<"Press any key to continue..."<<flush;
    getch();
    exit(1);
}
// ----------------------------------------------------------------------------------------------
//////////////////////////////////////////////////
//////////// funk.h
//////////////////////////////////////////////////
unsigned int INITVIDEO(const unsigned int NEW_VIDEO);
void DRAWQUADRANGLE(const unsigned long X1,const unsigned long Y1,const unsigned long X2,const unsigned long Y2,const int R,const int G,const int B,int &WINDOW,int RX);
void DRAWPOINT(const unsigned long X,const unsigned long Y,const int R,const int G,const int B,int &WINDOW,const unsigned int RX);
void INFO(char *STROKA);
void ERRORR(char *STROKA);
// ----------------------------------------------------------------------------------------------
//////////////////////////////////////////////////
//////////// win3xbmp.cpp
//////////////////////////////////////////////////
#include "WIN3XBMP.h"
#include "FUNK.H"                                                        //доп. функции работы с графикой
#include <STDIO.H>
#include <STRING.H>
#include <IOSTREAM.H>
WIN3XBMP::WIN3XBMP(char *STROKA)
{
    //char *EERROR;
    FILE* F;
    int i,x,y;
    //--                                                                //выделяем память под
    PathToBMP=new char[strlen(STROKA)];strcpy(PathToBMP,STROKA);        //считываем путь к файлу
    X = 0;Y = 0;                                                        //начальные коодинаты изображеня
    //try
    //{
        F = fopen(PathToBMP,"r");                                        //открываем файл по указанному пути
    //}
    //catch(...)
    //{
    //    EERROR = new char[strlen(PathToBMP)+strlen("Can't open file: ")];
    //    strcpy(EERROR,"Can't open file: ");strcat(EERROR,PathToBMP);
    //    throw EERROR;
    //}
    //try
    //{
        fread(&FileHeader,sizeof(_WinBMPFileHeader),1,F);                    //считываем заголовок файла
        fread(&BitMapHeader,sizeof(_Win3xBitMapHeader),1,F);                    //считываем заголовок изображения
    //}
    //try
    //{
        BMPData = new _Win3xBMPData[BitMapHeader.Width*BitMapHeader.Height];    //выделяем память под данные картинки
        Win3xBMPData *TEMPDATA = BMPData;
        if(BitMapHeader.BitPerPixel < 24)                                        //проверяем, есть ли палитра
        {
            PaletteElement = new _Win3xPaletteElement[256];                    //если есть, то выделяем память
            //--                                                            //загружаем в файл
            Win3xPaletteElement *TEMPPALLETE = PaletteElement;
            unsigned char color;
            for(i=0;i<256;i++)
            {
                fread(TEMPPALLETE++,sizeof(_Win3xPaletteElement),1,F);
            }
            //--
            fseek(F,FileHeader.Offset,0);                                    //устанавливаем указатель на файл, в место начала данных изображения
            //--                                                            //считываем данные изображения по точке и печатаем с соответствующими координатами на экран
            for(y=BitMapHeader.Height;y>0;y--)
            {
                for(x=0;x<BitMapHeader.Width;x++)
                {
                    fread(&color,sizeof(unsigned char),1,F);
                    TEMPDATA->Red = (PaletteElement+color)->Red;
                    TEMPDATA->Blue = (PaletteElement+color)->Blue;
                    TEMPDATA->Green = (PaletteElement+color)->Green;
                    TEMPDATA++;
                }
            }
            //--
        }
        else                                                                //просто загружаем данные изображения из файла
        {
            fseek(F,FileHeader.Offset,0);                                    //устанавливаем указатель на файл, в место начала данных изображения
            //--                                                            //считываем данные изображения по точке и печатаем с соответствующими координатами на экран
            for(y=BitMapHeader.Height;y>0;y--)
            {
                for(x=0;x<BitMapHeader.Width;x++)
                {
                    fread(TEMPDATA++,sizeof(_Win3xBMPData),1,F);
                }
            }
            //--
        }
    //}
    /*catch(...)
    {
    //    EERROR = new char[strlen(PathToBMP)+strlen("Can't open file: ")];
    //    strcpy(EERROR,"Can't find memory: ");strcat(EERROR,PathToBMP);
    //    throw EERROR;
    }*/

    fclose(F);                                                            //закрываем файл
}
WIN3XBMP::~WIN3XBMP()
{
    //--                                                                //удаляем все что сами создали
    delete PathToBMP;
    //if(PaletteElement)
    {
        delete PaletteElement;
    }
    //if(BMPData)
    {
        delete BMPData;
    }
    //--
}
void WIN3XBMP::PrintToXY(const unsigned int MOVE_X,const unsigned int MOVE_Y)
{
    int x,y,WINDOW,RX;                                                    //координаты, номер окна памяти, разрешение экрана по горизонтали
    Win3xBMPData *TEMPDATA = BMPData;
    //FILE* F;                                                            //файл BMP
    //--                                                                //сохраняем координаты изображения
    X = MOVE_X;
    Y = MOVE_Y;
    //--
    //F = fopen(PathToBMP,"r");
    WINDOW = 0;
    RX = 1024;
    //--
    //fseek(F,FileHeader->Offset,0);                                        //устанавливаем указатель на файл, в место начала данных изображения
    //--                                                                //считываем данные изображения по точке и печатаем с соответствующими координатами на экран
    for(y=BitMapHeader.Height;y>0;y--)
    {
        for(x=0;x<BitMapHeader.Width;x++)
        {
            //fread(PaletteElement,sizeof(_Win3xPaletteElement),1,F);
            //DRAWPOINT(MOVE_X + x,MOVE_Y + y,PaletteElement->Red,PaletteElement->Green,PaletteElement->Blue,WINDOW,RX);
            DRAWPOINT(MOVE_X + x,MOVE_Y + y,TEMPDATA->Red,TEMPDATA->Green,TEMPDATA->Blue,WINDOW,RX);
            TEMPDATA++;
        }
    }
    //--
    //fclose(F);
}
void WIN3XBMP::MoveToXY(const unsigned int MOVE_X,const unsigned int MOVE_Y)
{
    int x,y,WINDOW,RX;                                                    //координаты, номер окна памяти, разрешение экрана по горизонтали
    Win3xBMPData *TEMPDATA = BMPData;
    //FILE* F;                                                            //файл BMP
    //F = fopen(PathToBMP,"r");
    WINDOW = 0;
    RX = 1024;
    //--
    //fseek(F,FileHeader->Offset,0);                                        //устанавливаем указатель на файл, в место начала данных изображения
    //--                                                                //стираем старые куски картинки
    DRAWQUADRANGLE(MOVE_X,MOVE_Y + BitMapHeader.Height+1,X + BitMapHeader.Width,Y + BitMapHeader.Height,0,0,0,WINDOW,RX);
    DRAWQUADRANGLE(X,Y,MOVE_X + BitMapHeader.Width,MOVE_Y-1,0,0,0,WINDOW,RX);
    DRAWQUADRANGLE(X,Y,MOVE_X-1,MOVE_Y + BitMapHeader.Height,0,0,0,WINDOW,RX);
    DRAWQUADRANGLE(MOVE_X + BitMapHeader.Width+1,MOVE_Y,X + BitMapHeader.Width,Y + BitMapHeader.Height,0,0,0,WINDOW,RX);
    //--                                                                //сохраняем координаты изображения
    X = MOVE_X;
    Y = MOVE_Y;
    //--                                                                //считываем данные изображения по точке и печатаем с соответствующими координатами на экран
    for(y=BitMapHeader.Height;y>0;y--)
    {
        for(x=0;x<BitMapHeader.Width;x++)
        {
            //fread(PaletteElement,sizeof(_Win3xPaletteElement),1,F);
            //DRAWPOINT(MOVE_X + x,MOVE_Y + y,PaletteElement->Red,PaletteElement->Green,PaletteElement->Blue,WINDOW,RX);
            DRAWPOINT(MOVE_X + x,MOVE_Y + y,TEMPDATA->Red,TEMPDATA->Green,TEMPDATA->Blue,WINDOW,RX);
            TEMPDATA++;
        }
    }
    //--
    //fclose(F);
}
void WIN3XBMP::ShowInfo()
{
    cout<<"WinBMPFileHeader:\n";
    cout<<"{\n";
    cout<<"FileType        = "<<FileHeader.FileType<<"\n";
    cout<<"FileSize        = "<<FileHeader.FileSize<<"\n";
    cout<<"Reserved_1        = "<<FileHeader.Reserved_1<<"\n";
    cout<<"Reserved_2        = "<<FileHeader.Reserved_2<<"\n";
    cout<<"Offset            = "<<FileHeader.Offset<<"\n";
    cout<<"}\n";
    cout<<"Win3xBitMapHeader:\n";
    cout<<"{\n";
    cout<<"Size            = "<<BitMapHeader.Size<<"\n";
    cout<<"Width            = "<<BitMapHeader.Width<<"\n";
    cout<<"Height            = "<<BitMapHeader.Height<<"\n";
    cout<<"Planes            = "<<BitMapHeader.Planes<<"\n";
    cout<<"BitPerPixel        = "<<BitMapHeader.BitPerPixel<<"\n";
    cout<<"Compression        = "<<BitMapHeader.Compression<<"\n";
    cout<<"SizeOfBitmap        = "<<BitMapHeader.SizeOfBitmap<<"\n";
    cout<<"HorzRezolution        = "<<BitMapHeader.HorzRezolution<<"\n";
    cout<<"VertRezolution        = "<<BitMapHeader.VertRezolution<<"\n";
    cout<<"ColorsUsed        = "<<BitMapHeader.ColorsUsed<<"\n";
    cout<<"ColorsImportant        = "<<BitMapHeader.ColorsImportant<<"\n";
    cout<<"}\n"<<flush;
}
// ----------------------------------------------------------------------------------------------
//////////////////////////////////////////////////
//////////// win3xbmp.h
//////////////////////////////////////////////////
#ifndef WIN3XBMPH
#define WIN3XBMPH
#include "3XBMP.H"
class WIN3XBMP
{
    public:
        WIN3XBMP(char *);                                        //конструктор
        virtual ~WIN3XBMP();                                    //деструктор
        void PrintToXY(const unsigned int,const unsigned int);    //вывод BMP файла на экран с указанным смещением (координаты левого верхнего угла)
        void MoveToXY(const unsigned int,const unsigned int);    //сдвиг уже напечатанного изображения в указанное место
        void ShowInfo();                                        //информация о файле
    protected:
        //--                                                    //данные
        WinBMPFileHeader FileHeader;                            //заголовок файла
        Win3xBitMapHeader BitMapHeader;                            //заголовок изображения
        Win3xPaletteElement *PaletteElement;                    //палитра изображеня
        Win3xBMPData *BMPData;                                    //данные изображения
        unsigned int X,Y;                                        //начальные координаты изображения
        char *PathToBMP;                                        //путь к BMP файлу
        //--
};
#endif
// ----------------------------------------------------------------------------------------------


Вот так значит.
Не судите строго люди, писал когда ещё не знал что такое ptr (может быть утечка, а попробуйка найди smile )....И к сожадению под DOS нет исключений...
Компилятор BC++ 3.1,

Это сообщение отредактировал(а) np9mi7 - 19.4.2005, 19:37


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
HELPER
Дата 20.4.2005, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 18.4.2005

Репутация: -2
Всего: -2



ой, емае, конечно спасибо, но я уже ето написал..., мне к сожалению, только в графе, кот (graphics.h) надо, но всеравно спасибо, там вообщемто геморой с преобразованием палитры был smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0925 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.