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

  • Автор темы Neostead
  • Дата начала
N

Neostead

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


Код:
#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 цветов...
 
P

PowerUserX

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

хотя бы .....
 
G

gamecreator

Гость
#3
тебе ж сказано что в Borland 3.1
Код:
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;
}
 
N

Neostead

Гость
#4
тебе ж сказано что в Borland 3.1
Код:
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;
}
Спасибо большое, но функция не работает... Выводит чёрный экран и всё...
в main() писал это:
Код:
InitGraph(); //инициализация графического режима
importbmp("C:\\m.bmp", 0, 0);
getch();
 
N

Neostead

Гость
#6
-1

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

gamecreator

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

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

Neostead

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

а еще по-моему у тебя какой-то другой графический режим, потому что функции InitGraph в борланде 3.1 нету, есть функция initgraph. читай в хелпе, там подробно все описано.
Нет, файл 16-ти цветный, это точно. А тело InitGraph() выглядит так:
Код:
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
 
G

gamecreator

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

Neostead

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

gamecreator

Гость
#11
у меня та функция работала. попробуй убрать setvievport