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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Borland C++ 3.1 и BMP,прошу помощи. Работа с bmp в среде Borland C++ 3.1 
:(
    Опции темы
somwan
  Дата 19.11.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Желаю здравствовать !
Программирование для меня это хобби.Работаю в среде Borland C++ 3.1.( Пробовал Borland C++ Builder.Много полезного но и много сложного для меня )Сейчас бьюсь над проблемой чтения bmp-картинки с жосткого диска средствами самого BC 3.1.Без подключения дополнительных библиоте.Уже узнал много интересных вещей про bmp
Но до сих пор немогу правильно считать заголовок файла.А именно размер,ширену в точках,высоту в точках.При этом метка BM считывается правильно а так-же количество бит на точку,количество плоскостей.Открываю фаил при помощи
функции open("C:\\xxx.bmp  ",ios::in) устанавливаю на позицию seekg(x),и считываю в unsigned char
4байта (ширина рисунка в точках)Реальная ширина 468 а у меня получается 2121.Может у кого есть код по данному вапросу(только без наваротов,попроще.а то я его год расшифрововать буду)Сейчас нет возможности выложить код моей программы(он на другом компе)но чуть позже выложу.Спасибо.
PM MAIL   Вверх
bsa
Дата 19.11.2007, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



эта проблема решается созданием структуры, описывающей каждое поле заголовока, и чтением напрямую в нее минуя unsigned char'ы.
А потом, ты считываешь в unsigned char data или в массив unsigned char array[4]?
PM   Вверх
DjoNIK
Дата 19.11.2007, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

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



Цитата(somwan @  19.11.2007,  21:15 Найти цитируемый пост)
Программирование для меня это хобби...Работаю в среде Borland C++ 3.1.

Не порть себе впечатление о языке! Возьми нормальный компилятор, он уже дцать лет не поддерживает стандарта, на нем ты не сможешь реализовать многих вещей!

Офттоп, конечно.


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
somwan
Дата 19.11.2007, 21:54 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот программа с помощью которой я пытаюсь прочитать строку информации из bmp.А с тем что BC 3.1 устарел уже давно я согласен,но всё-же хотелось бы решить этот вапрос в данной среде.

#include<fstream.h>
#include<conio.h>
#include<stdio.h>



main()
{
clrscr();
unsigned long char vg_ch,m1[4]={000};
unsigned long int vg_i;
int a=0,a_1=0;



ifstream file1;
file1.open("c:\\baza01.bmp",ios::in);

for(a=0;a<2;a++)           //metka BM
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;

}
    printf("metka BM                ");
 for(a=0;a<2;a++)
    printf("%c",m1[a]);
    printf("\n");
    a_1=0;
//----------------------------------------------------------------
for(a=2;a<6;a++)         // razmer v baytax
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;
}

    printf("razmer v baytax         ");
 for(a=0;a<4;a++)
    printf("%i",m1[a]);
    printf("\n");
    a_1=0;
//-----------------------------------------------------------------
for(a=6;a<8;a++)         // rezerv 1
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;
}

    printf("rezerv 1                ");
 for(a=0;a<2;a++)
    printf("%i",m1[a]);
    printf("\n");
    a_1=0;
//-----------------------------------------------------------------
for(a=8;a<10;a++)         // rezerv 2
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;
}

    printf("rezerv 2                ");
 for(a=0;a<2;a++)
    printf("%i",m1[a]);
    printf("\n");
    a_1=0;
//-----------------------------------------------------------------
for(a=10;a<14;a++)         //smechenie obl.dannix
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;
}

    printf("smechenie obl.dannix    ");
 for(a=0;a<4;a++)
    printf("%i",m1[a]);
    printf("\n");
    a_1=0;
//-----------------------------------------------------------------
for(a=14;a<18;a++)         //razmer obl.informacii
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;
}

    printf("razmer obl.informacii   ");
 for(a=0;a<4;a++)
    printf("%i",m1[a]);
    printf("\n");
    a_1=0;
//-----------------------------------------------------------------
for(a=18;a<22;a++)         //chirina v tochkax
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;
}

    printf("chirina v tochkax       ");
 for(a=0;a<4;a++)
    printf("%x ",m1[a]);
    printf("\n");
    a_1=0;
//-----------------------------------------------------------------
for(a=22;a<26;a++)         //visota v tochkax
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;
}

    printf("visota v tochkax        ");
 for(a=0;a<4;a++)
    printf("%x ",m1[a]);
    printf("\n");
    a_1=0;
//-----------------------------------------------------------------
for(a=26;a<28;a++)         //kol-vo ploskostey
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;
}

    printf("kol-vo ploskostey       ");
 for(a=0;a<2;a++)
    printf("%i",m1[a]);
    printf("\n");
    a_1=0;
//-----------------------------------------------------------------
for(a=28;a<30;a++)         //kol-vo bit na tochky
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;
}

    printf("kol-vo bit na tochky    ");
 for(a=0;a<2;a++)
    printf("%i",m1[a]);
    printf("\n");
    a_1=0;
//-----------------------------------------------------------------
for(a=30;a<34;a++)         //tip sgatiy
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;
}

    printf("tip sgatiy              ");
 for(a=0;a<4;a++)
    printf("%i",m1[a]);
    printf("\n");
    a_1=0;
//-----------------------------------------------------------------
for(a=34;a<38;a++)         //razmer dannix v baytax
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;
}

    printf("razmer dannix v baytax  ");
 for(a=0;a<4;a++)
    printf("%i",m1[a]);
    printf("\n");
    a_1=0;
//-----------------------------------------------------------------
for(a=38;a<42;a++)         //kol-vo tochek na metr
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;
}

    printf("kol-vo tochek na metr   ");
 for(a=0;a<4;a++)
    printf("%i",m1[a]);
    printf("\n");
    a_1=0;
//-----------------------------------------------------------------
for(a=42;a<46;a++)         //kol-vo tochek na metr
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;
}

    printf("kol-vo tochek na metr   ");
 for(a=0;a<4;a++)
    printf("%i",m1[a]);
    printf("\n");
    a_1=0;
//-----------------------------------------------------------------
for(a=46;a<50;a++)         //kol-vo cvetov
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;
}

    printf("kol-vo cvetov           ");
 for(a=0;a<4;a++)
    printf("%i",m1[a]);
    printf("\n");
    a_1=0;
//-----------------------------------------------------------------
for(a=50;a<54;a++)         //kol-vo cvetov v politre
{
    file1.seekg(a);
    file1 >> vg_ch;
    m1[a_1]=vg_ch;
    a_1++;
}

    printf("kol-vo cvetov v politre ");
 for(a=0;a<4;a++)
    printf("%i",m1[a]);
    printf("\n");
    a_1=0;
//-----------------------------------------------------------------

printf("  OK ");
getch();
}ограмма
PM MAIL   Вверх
MAKCim
Дата 19.11.2007, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



somwan, 

M
MAKCim
Модератор: пользуйтесь тегом код!



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 19.11.2007, 23:55 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



 smile  smile  smile 
Идем в гугл: набираем "bmp структура заголовка" и заходим на  страницу из Википедии. После этого делаем copy-paste для всех необходимых структур и читаем в них из файла одной операцией read (по одному read на структуру).

Свой код распечатай и повесь в рамку с надписью большими красными буквами: "ТАК ПИСАТЬ НЕЛЬЗЯ". имхо.
PM   Вверх
somwan
Дата 20.11.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за совет.Посетил страницу из Википедии действительно много интересной информации.Буду разбераться.Что касается стиля написания то пишу как умею.Я и не скрываю что ЧАЙНИК Я.Для этого и спрашиваю чтоб научиться.Стыдно не незнать,а неучиться.А я только учусь. smile 
PM MAIL   Вверх
Sentrashi
Дата 22.11.2007, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем доброго времени суток ;)......

на счет 
Цитата(DjoNIK @  19.11.2007,  21:25 Найти цитируемый пост)
Не порть себе впечатление о языке! Возьми нормальный компилятор, он уже дцать лет не поддерживает стандарта, на нем ты не сможешь реализовать многих вещей!


да устарел (причем энто мягко сказано), но у вы в наших институтах до сих пор его использую, да и изначально предпочитают "изучить" С, а затем С++, Вот и сидим под BC3.1 под досом извращаемся, увы деваться некуда «Учебная программа такая»
но перейдем к теме: учусь на втором курсе ну и выбрал себе курсовой часы с будильником. Часы вроде бы сделал, получилось не много убого но работает и время показывает исправно smile ,  далее захотелось хоть что то иметь на фоне smile и вот тут то не много застопорился  увы никак не получается сделать картинку и поверх часики......  (по возможности мона мидишку на будильник подключить smile))). Если будут предложения буду весьма признателен. Исходники приведены ниже (часы и открытие файлика отдельно). Буду признателен любой критике, грите все что не нравится вплоть до мелочей… 


непосредственно код самих часов  (осталось довести до ума часовую и минутную стрелки,  пока что выполнены в виде линий ну и подправить просчет даты при вводе времени вручную)

Код

#include "time.h"
#include "stdio.h"
#include "conio.h"
#include "graphics.h"
#include "process.h"
#include "dos.h"
#include "math.h"
#include "ctype.h"

void clock(int a, int b, int d, int f, int c, int m, int n);

int main(void)
{
    int gdriver = 3, gmode = 1, errorcode;
    initgraph(&gdriver, &gmode, "C:\\BORLANDC\\BGI\\");
    errorcode = graphresult();

//-------
    if (errorcode != grOk) {
        printf("\aGraphics error: %s\n", grapherrormsg(errorcode));
        printf("Press any key to halt: ");
        getch();
        exit(1);
    }

//-------
    int a,b,x,c,m,n;
    int res;
    setcolor(WHITE);                                //Cvet Menyu
    settextstyle(GOTHIC_FONT, HORIZ_DIR, 4);        //shrift menyu

    while(1) {
        outtext("     1:Input time     ");
        outtext("2:System time");
        scanf("%d",&x);
        cleardevice();
        if(x==1) {
            while(1) {
                printf("hour = ");
                res=scanf("%d",&b);
                if((res == 0)||(b>=24)) {
                    printf("Incorrect input\n");
                    if (!getch()) getch();
                    fflush(stdin);
                    continue;
                }//if((res==0)||(b>=25))
                else
                    break;
            }//whilw(1)
            while(1) {
                printf("min = ");
                res=scanf("%d",&a);
                if((res != 1)||(a>=60)) {
                    printf("Incorrect input\n");
                    if (!getch()) getch();
                    fflush(stdin);
                    continue;
                }//if((res!=1)||(a>=60))
                else
                    break;
            }//whilw(1)
            break;
        }//if(x==1)
        if(x==2) {
            struct time t;
            gettime(&t);
            a=t.ti_min;
            b=t.ti_hour;
            struct date d;
            getdate(&d);
            c=d.da_day;
            n=d.da_mon;
            m=d.da_year;
            break;
        }
        else {
             printf("Incorrect input\n");
             if (!getch()) getch();
             fflush(stdin);
             continue;
        }
    }//whilw(1)

//---------------------------------------------------------------------------
    int k=25,d,f;

    cleardevice();
    outtext("Xotite ustanovit' budilnik? (Y/N)");
    char let;
    let=toupper(getch());
    while(1) {
             if(let=='Y') {
            cleardevice();
            while(1) {
                printf("hour = ");
                res=scanf("%d",&d);
                if((res == 0)||(d>=24)) {
                    printf("Incorrect input\n");
                    if(!getch()) getch();
                    fflush(stdin);
                    continue;
                }
                else
                    break;
            }//whilw(1)
            while(1) {
                printf("min = ");
                res=scanf("%d",&f);
                if((res != 1)||(f>=60)) {
                    printf("Incorrect input\n");
                    if(!getch()) getch();
                    fflush(stdin);
                    continue;
                }
                else
                    break;
            }//whilw(1)
            break;
        }//while(1)
        if(let=='N') {
            break;
                }
        else {
            outtextxy(0,k,"Incorrect input");
            k=k+25;
            outtextxy(0,k,"Xotite ustanovit' budilnik? Y/N");
            k=k+25;
        }
    }//while(1)

        clock(a, b, d, f, c, m, n);
    closegraph(); //zavershenie raboti sistemi

        return 0;

}

void clock(int a, int b, int d, int f, int c, int m, int n)
{
    int actpg = 0;
    int min   = a;
    int hour  = b;
    int day   = c;
    int mon   = n;
    int year  = m;
    int cx = getmaxx()/2,    //koordinati centra 4asov po OX
        cy = getmaxy()/2;    //koordinati centra 4asov po OY

    setbkcolor(BLACK);      //zalivka fona

    while(!kbhit()){
        struct time t;
        gettime(&t);
        int sec =t.ti_sec;
        setactivepage(actpg);
        cleardevice();
        delay(1000);

        char buf1[10];
        char buf2[10];
        char buf3[10];
        char buf4[10];
        char buf5[10];
        char buf6[10];

        sprintf(buf1,"%d",sec);
        sprintf(buf2,"%d",min);
        sprintf(buf3,"%d",hour);
        sprintf(buf4,"%d",day);
        sprintf(buf5,"%d",mon);
        sprintf(buf6,"%d",year);


//--------------------------------------------------------------
//============Cifri na ciferblate

        settextstyle(SMALL_FONT, HORIZ_DIR, 4);
          setcolor(WHITE);

/* 12 */    outtextxy(cx + floor( 95*4/3 * cos( M_PI/2 - 0 * (2*M_PI)/12)),
                    cy - floor( 95     * sin( M_PI/2 - 0 * (2*M_PI)/12)),
                                                                  "XII");

/* 01 */    outtextxy(cx + floor( 93*4/3 * cos( M_PI/2  -1 * (2*M_PI)/12)),
                    cy - floor( 93     * sin( M_PI/2  -1 * (2*M_PI)/12)),
                                                                    "I");
  
/* 02 */    outtextxy(cx + floor( 88*4/3 * cos( M_PI/2 - 2 * (2*M_PI) / 12)),
                    cy - floor( 88     * sin( M_PI/2 - 2 * (2*M_PI) / 12)),
                                                                     "II");

/* 03 */    outtextxy(cx + floor( 83*4/3 * cos( M_PI/2 - 3 * (2*M_PI) / 12)),
                    cy - floor( 83     * sin( M_PI/2 - 3 * (2*M_PI) / 12)),
                                                                    "III");

/* 04 */    outtextxy(cx + floor( 82*4/3 * cos( M_PI/2 - 4 * (2*M_PI) / 12)),
                    cy - floor( 82     * sin( M_PI/2 - 4 * (2*M_PI) / 12)),
                                                                     "IV");

/* 05 */    outtextxy(cx + floor( 81*4/3 * cos( M_PI/2 - 5 * (2*M_PI) / 12)),
                    cy - floor( 81     * sin( M_PI/2 - 5 * (2*M_PI) / 12)),
                                                                      "V");

/* 06 */    outtextxy(cx + floor( 82*4/3 * cos( M_PI/2 - 6 * (2*M_PI) / 12)),
                    cy - floor( 82     * sin( M_PI/2 - 6 * (2*M_PI) / 12)),
                                                                     "VI");

/* 07 */    outtextxy(cx + floor( 82*4/3 * cos( M_PI/2 - 7 * (2*M_PI) / 12)),
                    cy - floor( 82     * sin( M_PI/2 - 7 * (2*M_PI) / 12)),
                                                                    "VII" );

/* 08 */    outtextxy(cx + floor( 86*4/3 * cos( M_PI/2 - 8 * (2*M_PI) / 12)),
                    cy - floor( 86     * sin( M_PI/2 - 8 * (2*M_PI) / 12)),
                                                                    "VIII");

/* 09 */    outtextxy(cx + floor( 92*4/3 * cos( M_PI/2 - 9 * (2*M_PI) / 12)),
                    cy - floor( 92     * sin( M_PI/2 - 9 * (2*M_PI) / 12)),
                                                                      "IX");

/* 10 */    outtextxy(cx + floor( 90*4/3 * cos( M_PI/2 - 10 * (2*M_PI) / 12)),
                    cy - floor( 90     * sin( M_PI/2 - 10 * (2*M_PI) / 12)),
                                                                       "X" );

/* 11 */    outtextxy(cx + floor( 95*4/3 * cos( M_PI/2 - 11 * (2*M_PI) / 12)),
                    cy - floor( 95     * sin( M_PI/2 - 11 * (2*M_PI) / 12)),
                                                                       "XI");

//======================vivod na ekran elektronnoe vrem9

/*time*/    outtextxy(cx+11, cy +35,  ":"); //"minuti" :  "Sekundi"
        outtextxy(cx-11, cy +35,  ":"); //"4asi"   :  "minuti"
          outtextxy(cx-5,  cy +35, buf2); // minuti
        outtextxy(cx+16, cy +35, buf1); // sekundi
        outtextxy(cx-27, cy +35, buf3); // 4asi
/*data*/    outtextxy(cx+45, cy    , buf5); // mes9c
        outtextxy(cx+65, cy    , buf4); // 4islo
         // outtextxy(cx+50, cy +10, buf6); // god

         rectangle(cx+37,cy-1,cx+82,cy+13); //obramlenie dati
         line(cx+60,cy-1,cx+60,cy+13);

         rectangle(cx+35,cy+35,cx-33,cy+47); //obramlenie vremeni

//======================s4itaem koordinati dvijeni9 sekundnoy strelki

          int x = cx+floor(90*4/3 * cos(M_PI/2-floor(t.ti_sec) * (2*M_PI)/60));
          int y = cy-floor(90 * sin(M_PI/2-floor(t.ti_sec) * (2*M_PI)/60));

          int x_circle = cx+floor(77*4/3*cos(M_PI/2-floor(t.ti_sec)*(2*M_PI)/60));
          int y_circle = cy-floor(77*sin(M_PI/2-floor(t.ti_sec)*(2*M_PI)/60));

//======================s4itaem koordinati dvijeni9 minutnoy strelki

          int x2 = cx+floor(87*4/3*cos(M_PI/2-min*(2*M_PI)/60));
        int y2 = cy-floor(87*sin(M_PI/2-min*(2*M_PI)/60));

//=======================s4itaem koordinati dvijeni9 4asovoy strelki

          int x3 = cx+floor(67*4/3*cos(M_PI/2-hour*(2*M_PI)/12));
        int y3 = cy-floor(67*sin(M_PI/2-hour*(2*M_PI)/12));

//======================ras4et koordinat gradacii minut

          float a = 0.0;

          for (int i=0; i<60; i++){

              int x_min = cx + 77*4/3 * cos(a);
              int y_min = cy + 77 * sin(a);

              setcolor(YELLOW);
              setfillstyle(SOLID_FILL, YELLOW);
              pieslice (x_min, y_min, 0, 360, 1);

              a += M_PI/30;

          }

//=======================Okontovka ciferblata

        setcolor(WHITE);                  //zadanie cveta vnutrenego diametra ciferblata
        ellipse(cx,cy,0,360,90,90*3/4);   //vnutreniy deametr ciferblata

         // setcolor(GREEN);                  //zadanie cveta vneshnego diametra ciferblata
        ellipse(cx,cy,0,360,132,132*3/4); //vneshniy deametr ciferblata

        setcolor(LIGHTGRAY);                   //zadaem cvet okraski 4asovoy strelki
          setfillstyle(SOLID_FILL, LIGHTGRAY);
        line(cx,cy,x3,y3);                     //risuem 4asovuyu strelku
          pieslice(cx, cy, 0, 360, 8);           //4asova9 i minutna9

          setcolor(WHITE);                       //zadaem cvet okraski minutnoy strelki
          setfillstyle(SOLID_FILL, WHITE);
        line(cx,cy,x2,y2);                     //risuem minutnuyu strelku
          pieslice(cx, cy, 0, 360, 7);           //minutna9

          setcolor(RED);                         //zadaem cvet okraski sekundnoy strelki
        line(cx,cy,x,y);                       //risuemsekundnuyu strelku
          setfillstyle(SOLID_FILL,RED);
          pieslice(x_circle, y_circle, 0, 360, 3);     //krujok na konce sekundnoy strelki
          pieslice(cx, cy, 0, 360, 4);                 //sekundna9

        setvisualpage(actpg);
        actpg = (actpg+1)%2;
        if (sec == 0) {      //zvukovoy signal
           sound(2000);    //tonalnost signala
            delay(100);     //zaderjka signala
            min++;
            nosound();
            if (min == 60){
                min = 0;
                sound(2000);
                delay(100);
                hour++;
                nosound();
                if (hour == 24){
                    hour = 0;
                }
            }
        }
        if ((hour == d)&&(min == f))
        {
            sound(2500);
            delay(100);
            nosound();
        }

    }
    closegraph();
}



коды открытия bmp-шного файлика (соответственно 640x480, 16 цветов) 
 
ВАРИАНТ ПЕРВЫЙ (писал не я, пока что разбираюсь)

Код

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>
#include <process.h>
#include <math.h>
#include <ctype.h>

int getcol(int col)
{
    switch(col){

        case 0: return 0;     //BLACK;
        case 1: return 4;     //RED;
        case 2: return 2;     //GREEN
        case 3: return 6;     //BROWN
        case 4: return 1;     //BLUE;
        case 5: return 5;     //MAGENTA;
        case 6: return 3;     //CYAN;
        case 7: return 7;     //LIGHT_GRAY;
        case 8: return 8;     //DARK_GRAY;
        case 9: return 12;    //LIGHT_RED;
        case 10:return 10;    //LIGHT_GREEN
        case 11:return 14;    //YELLOW;
        case 12:return 9;     //LIGHT_BLUE;
        case 13:return 13;    //LIGHT_MAGENTA
        case 14:return 11;    //LIGHT_CYAN;
        case 15:return 15;    //WHITE;
    }
    return col;
}

int loadbitmap(char *filename)
{
    FILE *ptr = NULL;            //file handle to open bitmap file

    int width, height;             //width and height of the bitmap

    unsigned long temp=0, i=0, j=0;    //some variables i need
    unsigned long ww;

    ptr=fopen("C:\\COVER.BMP","rb");    //open the bitmap file

    if(!ptr)
         return 0;          //if its not there return
    width=0;
        height=0;            //initialise wisth and height to zero

    fseek(ptr, 18, SEEK_SET);           //got to offset 18 in file
//    for(i=0x1; i <= 0x10000; i*=0x100) {  //read the width
     for(i=0; i<=10000; i*=100){
        temp = fgetc(ptr);
        width += (temp * i);
    }

    fseek(ptr, 22, SEEK_SET);             //go to offset 22 in file
//    for(i=0x1; i<=0x10000; i*=0x100) {       //read the height
     for(i=0; i<=10000; i*=100){
        temp = fgetc(ptr);
        height += (temp*i);
    }

    ww=width;                 //ww is the number of reads to make for each horizontal line
    if(ww%2)                  //ww has to be half of width - since each pixel is only 4 bits of information
         ww++;
          ww/=2;          //just getting the correct value

    if(ww%4)                  //now - ww is stored as sets of 4 pixels each - i think !?! :so this is the adjustment    made
         ww=(ww/4)*4+4;       //if width is less than ww*2 we ignore what we read

    fseek(ptr, 119, SEEK_SET);   //Ok! offset 119 - lets read the pixels -

//remember the bitmap is stroed up - side - down

    int ch, ch1, ch2;
    for(i=0; i<height; i++)
    for(j=0; j<ww; j++){

        ch = fgetc(ptr);    //each character read is 2 pixels - yes 4 bits per pixel - so 16 colors

        ch1= ch;
          ch2= ch;                          //find those colors using bitwise ops

        ch1= ch1&(0xf0);ch1=ch1>>4;       // ~~
        ch2= ch2&(0x0f);                  // ~~

        if(j*2<width)                     //ok so put the first pixel read on screen
             putpixel((j)*2,(height-1-i),getcol(ch1));

        if(j*2+1<width)                   //put the second pixel read on screen
             putpixel((j)*2+1,(height-1-i),getcol(ch2));
    }
    fclose(ptr);      //close the file handle
    return 1;
}


int scr()
{
    clrscr();
    int width = 640, height = 480, i = 0, j = 0;
    char color0=0, color1 = 0, color2 = 0, devnull=0;

    int gdriver = DETECT, gmode, errorcode;
    initgraph(&gdriver, &gmode, "");
    errorcode = graphresult();
    if (errorcode != grOk) {
        printf("Graphics error: %s\n", grapherrormsg(errorcode));
        exit(1);
    }

    loadbitmap ("bg.bmp");

    if (!getch()) getch();
    return 0;

}




ВАРИАНТ НОМЕР ДВА  (уже моё творение, не много косячит smile )

Код

int main() {
     // map for replace colors
     int gd = DETECT, gm;
     initgraph(&gd, &gm, "C:\\BORLANDC\\BGI");

//------------karta zamesheni9 cvetov dl9 sozdani9 vezualnogo effekta

     char map[] = {0,12,2,6,9,5,3,8,7,4,10,14,1,13,11,15};
     char c, ch, cl;
//     int x0 = getmaxx();
     int y0 = getmaxy();

//-----------------------Open picture
     FILE *f = fopen("C:\\COVER.BMP", "rb");
     if(f==NULL)
          return 2;

//---------------------4itaem shirinu kartinki
//vi4isl9em shirinu zapisanogo izobrajeni96
//shirina=(razmer_faila-118)/visota

     fseek(f, 0, 2);
     long l = (ftell(f) - 118);   //
     fseek( f, 22, 0 );
     int w, h;
     fread(&h, 2, 1, f);
     w = int (l / h);
//-------------------4itaem i risuem kartinku

     fseek(f, 118, 0);
     int x=0, y=0;

     while(1) {
          c = fgetc(f);
          if(feof(f))
               break;
          ch = map[c/16];
          cl = map[c%16];

          putpixel(2*x+0, y0-y, ch);
          putpixel(2*x+1, y0-y, cl);
          if(++x==w) {
               x=0;
               y++;
          } //if(++x==w)
     } //while(1)
     fclose(f);
     if(!getch()) getch();
     return 0;

}



P.S. повторюсь что дело происходит в BorlandC_3.1  на С-ях

Это сообщение отредактировал(а) Sentrashi - 22.11.2007, 22:28
PM MAIL ICQ   Вверх
somwan
  Дата 22.11.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Sentrashi спасибо за код по открытию bmp.Мне очень помогло.К сожалению твой код править немогу,он выше моего уровня.А за код спасибо.
PM MAIL   Вверх
Sentrashi
Дата 22.11.2007, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



somwan вот надыбал мож пригодиться: дровишка для работы с 256 цветами
подключить думаю разберешся как 

int gd = DETECT, gm, gr;
installuserdriver("BGI256V2", detect);
initgraph(&gd, &gm, " Disk:\\............. ");



Это сообщение отредактировал(а) Sentrashi - 22.11.2007, 20:35

Присоединённый файл ( Кол-во скачиваний: 21 )
Присоединённый файл  BGI256V2.BGI 8,81 Kb
PM MAIL ICQ   Вверх
somwan
Дата 23.11.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо ,теперь мне хватит материала  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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