Вывод Bmp на экран в C++ 3.1

Тема в разделе "Общие вопросы по С и С++", создана пользователем Neostead, 25 дек 2007.

  1. Neostead

    Neostead Гость

    Товарищи, помогите плз! Как воздух нужна функция вида f("C:\\m.bmp", x, y); где x,y - координаты левого верхнего угла картинки на экране. Сам пытался - не получилось (видимо, недостаточно
    пряморукий). Программлю под Borland C++ 3.1. Функция нужна ПОЗАРЕЗ, помогите плз! Выводить на экран нужно либо монохромные картинки, либо 16 цветов, либо 256 - не важно, на картинке будет схема чёрным по белому.
    Проблема ещё в том, что не знею как определить правильный размер заголовка (или обоих), палитры и самой картинки. Вот всё, чего я добился. Программа выводит на экран пиксельную абракадабру...


    Код (Text):
    #include <stdio.h>
    #include <conio.h>
    #include <graphics.h>
    #include <stdlib.h>
    #include <share.h>
    void InitGraph();
    int BMPP(char *name, int x, int y);
    void InitGraph()
    { //InitGraph start
    int gdriver=DETECT, gmode, errorcode;
    initgraph(&gdriver, &gmode, "D:\\Borlandc\\Bgi\\"); //Initialising graphics
    errorcode = graphresult(); //If there is an error
    if (errorcode !=grOk)
    { //Type of error start
    printf("Graphics error: %s\n.", grapherrormsg(errorcode));
    printf("Press any key to exit...");
    getch();
    exit(1);
    } //Type of error end
    setviewport (0,0,640,480,0);
    } //InitGraph end


    int BMPP(char *name, int x, int y)
    {
    char dataHeader[40];
    char *data=new char[5000];
    FILE *fp=fopen(name, "rb");
    if(!fp){return -1;}
    fread(dataHeader,1, 40, fp);
    fread(data, 5000, 1, fp);
    fclose(fp);
    for(int b=0; b<100; b++)
    {
    for (int a=0; a<100;a++)
    {
    char c=data[b*100/2+a/2];
    if(a&1){c>>=4;}
    else {c&=15;}
    putpixel(a+x, b+y, c);
    }
    }    
    return 0;
    }


    void main()
    {
    InitGraph();
    BMPP("C:\\m.bmp", 10, 10);
    getch();
    closegraph();
    }
    В данном коде картинка 100*100, 16 цветов...
     
  2. PowerUserX

    PowerUserX Гость

    если тебе надо под Win32
    то
    читай
    "Ч. Петзолд - Программирование для Windows95"

    хотя бы .....
     
  3. gamecreator

    gamecreator Гость

    тебе ж сказано что в Borland 3.1
    Код (Text):
    int importbmp(char *bmpname, int x, int y) //параметры - путь к бмп и координаты вывода
    {
    long int size;
    int i, j, h, w, offset, c1, c2, byte;
    unsigned char *file;
    FILE* bmp=fopen(bmpname,"rb");
    i=fgetc(bmp);
    if(i==EOF) return -2;
    if(i!='B') return -1;
    i=fgetc(bmp);
    if(i==EOF) return -2;
    if(i!='M') return -1;
    size=fgetc(bmp);
    size+=fgetc(bmp)*256;
    file=new char[size];
    freopen(bmpname,"rt",bmp);
    for(i=0;i<size;i++) file[i]=fgetc(bmp);
    if(file[28]!=4) return -1;
    offset=file[10]+file[11]*256;
    w=file[18];
    h=file[22];
    if(w<0) w+=256;
    if(h<0) h+=256;
    for(i=0;i<h*w;i+=2)
    {
    byte=file[offset+i/2];
    c1=byte/16;
    c2=byte%16;
    c1=(c1==1 || c1==4)?5-c1:c1;
    c2=(c2==1 || c2==4)?5-c2:c2;
    c1=(c1==3 || c1==6)?9-c1:c1;
    c2=(c2==3 || c2==6)?9-c2:c2;
    c1=(c1==7 || c1==8)?15-c1:c1;
    c2=(c2==7 || c2==8)?15-c2:c2;
    c1=(c1==9 || c1==12)?21-c1:c1;
    c2=(c2==9 || c2==12)?21-c2:c2;
    c1=(c1==11 || c1==14)?25-c1:c1;
    c2=(c2==11 || c2==14)?25-c2:c2;
    putpixel(x+i%w,y+h-i/w,c1);
    putpixel(x+(i+1)%w,y+h-i/w,c2);
    }
    fclose(bmp);
    delete[] file;
    return 1;
    }
     
  4. Neostead

    Neostead Гость

    Спасибо большое, но функция не работает... Выводит чёрный экран и всё...
    в main() писал это:
    Код (Text):
    InitGraph(); //инициализация графического режима
    importbmp("C:\\m.bmp", 0, 0);
    getch();
     
  5. gamecreator

    gamecreator Гость

    что возвращает?
     
  6. Neostead

    Neostead Гость

    -1

    Если загружать картинку 16 цветов, то она выводится, но сильно искажённая.
     
  7. gamecreator

    gamecreator Гость

    значит файл не является 16-цветным рисунком бмп.

    а еще по-моему у тебя какой-то другой графический режим, потому что функции InitGraph в борланде 3.1 нету, есть функция initgraph. читай в хелпе, там подробно все описано.
     
  8. Neostead

    Neostead Гость

    Нет, файл 16-ти цветный, это точно. А тело InitGraph() выглядит так:
    Код (Text):
    void InitGraph()    //function that initializing graphics mode
    { //InitGrpah start
    int gdriver=DETECT, gmode, errorcode;
    initgraph(&gdriver, &gmode, "C:\\Kurs\\");
    errorcode = graphresult(); //If there is an error
    if (errorcode !=grOk)
    { //Type of error start
    clrscr();
    printf("Graphics error: %s.\n", grapherrormsg(errorcode));
    printf("Press any key to exit...");
    getch();
    exit(1);
    } //Type of error end

    setviewport(0,0,640,480,0); //setting the viewport
    } //InitGraph end
     
  9. gamecreator

    gamecreator Гость

    я так понял проблема в папке драйвера "C:\\Kurs\\". ты загружаешь не системные драйвера. укажи папку ""
     
  10. Neostead

    Neostead Гость

    Если вы про egavga.bgi, то он лежит в папке C:\Kurs. Попробовал заменить на "" - ничего не поменялось.
    Я думаю, проблема в функции, т.к. та, которую я привёл в первом посте этой темы, всё-таки выводит картинку, но как-то странно: 100х100 (например) выводит без проблем, 101х101 не вывдоит, вообще всё вылетает в Винду, 160х240 выводит нормально, 320х240 - то же самое, что и при 101х101.
     
  11. gamecreator

    gamecreator Гость

    у меня та функция работала. попробуй убрать setvievport
     
  12. Neostead

    Neostead Гость

    Никакого эффекта.
     
Загрузка...

Поделиться этой страницей