Страница 1 из 1

bmp256 -> BC3.1

Добавлено: 01 июл 2004, 23:55
Ученик
Только начинаю.
Умею вставить в свою программу картинку из файла bmp 800*600*24
16 цветов, т.е. делаю первые шаги, работая с допотопным BC3.1.
Не умею еще пользоваться классами, собирать файлы в проект и
многое другое. Читаю, но пока не все понимаю.
--------------------------------------------------------------------------------
Хотелось бы иметь исходник законченной, работающей программы,
вставляющей bmp с 256 цветами 640*480 для BC3.1 со знакомым
void main(void).
--------------------------------------------------------------------------------
Нигде не могу прочитать о подобном работающем примере - только
фрагменты, которые самому использовать пока слабо.
Сейчас пытаюсь читать о VESA - режимах.
???????????????????????????????????????????????????????????????????????
Может, у кого в загашниках валяется что-нибудь подобное? Подкиньте
Ученику, объясните, что там к чему, станьте ему Учителем, пожалуйста!

Добавлено: 02 июл 2004, 11:07
Romeo
У меня валялся где-то дома, правда не на С++, а на асме. Подойдёт? :)

Добавлено: 02 июл 2004, 12:35
Ученик
Можно попробовать, если программа закончена. Когда видишь результат - легче разбираться.

Добавлено: 02 июл 2004, 21:45
Ученик
Как можно дописать этот код для вставки в него из файла
bmp 640*480*256?

Код: Выделить всё

#include	<conio.h>
#include	<dos.h>
#include	<process.h>
#include	<stdio.h>
#include	<string.h>
#include	"myvesa.h"

#define LOWORD(l)	((int)(l))
#define HIWORD(l)	((int)((l)>>16))

static int		curBank	=0;
static int		granularity=1;
static VESAModeInfo	curMode;

int	findVESA(VESAInfo& vi)
{
#if defined(__COMPACT__)||defined(__LARGE__)||defined(__HUGE__)
	asm{
		push	es
		push	di
		les	di,dword ptr vi
		mov	ax,4F00h
		int	10h
		pop	di
		pop	es
	}
#else
	asm{
		push	di
		mov	di,word ptr vi
		mov	ax,4F00h
		int	10h
		pop	di
	}
#endif
	if(_AX != 0x004F)
		return 0;
	return !strncmp(vi.sign,"VESA",4);
}
int	findVESAMode(int mode, VESAModeInfo& mi)
{
#if defined(__COMPACT__)||defined(__LARGE__)||defined(__HUGE__)
	asm{
		push	es
		push	di
		les	di,dword ptr mi
		mov	ax,4F01h
		mov	cx, mode
		int	10h
		pop	di
		pop	es
	}
#else
	asm{
		push	di
		move	di,word ptr mi
		mov	ax,4F01h
		mov	cx,mode
		int	10h
		pop	di
	}
#endif
	return _AX==0x004F;
}
int	setVESAMode(int mode)
{
	if(!findVESAMode(mode,curMode))
		return 0;
	granularity=64/curMode.winGranularity;
	asm{
		mov	ax,4F02h
		mov	bx,mode
		int	10h
	}
	return _AX==0x004F;
}
int	getVESAMode()
{
	asm{
		mov	ax,4F03h
		int	10h
	}
	if(_AX!=0x004F)
		return 0;
	else
		return _BX;
}
void	setVESABank(int start)
{
	if(start==curBank)
		return;
	curBank=start;
	start *=granularity;
	asm{
		mov	ax,4F05h
		mov	bx,0
		mov	dx,start
		push	dx
		int	10h
		mov	bx,1
		pop	dx
		int	10h
	}
}
void	writePixel(int x,int y,int color)
{
	long	addr=(long)curMode.bytesPerScanLine*(long)y+(long)x;
	setVESABank(HIWORD(addr));
	pokeb(0xA000,LOWORD(addr),color);
}
void main()
{
	VESAInfo vi;
	if(!findVESA(vi))
	{
		printf("\nVESA VBE not found.");
		exit( 1 );
	}
	if(!setVESAMode(VESA_640x480x256))
		exit( 1 );
	for(int i=0;i<640;i++)
		for(int j=0;j<480;j++)
			writePixel(i,j,((i/20)+1)*(j/20+1));
	getch();
}




Добавлено: 20 июл 2004, 23:26
Ученик
Как дописать этот код, чтобы вставить из файла
bmp 640x480x256 цветов?

Код: Выделить всё

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

int main(void)
{
/* request auto detection */
int d , m,errorcode;
int i;
d = installuserdriver("svga256" , NULL);
//Загружаем наш драйвер (вместь обычного egavga.bgi)
// другие режимы
// 0 - 320х240
// 1 - какой-то не стандарнтый, не помню точно может 640х400
// 2 - 640х480
// 3 - 800х600
// 4 - 1024х768
m = 2; //Установим режим

initgraph(&d , &m , "");

//далее используются ф-ции из graphics.h
//svga256.bgi, должна быть там же, где и ехешник.

errorcode = graphresult();

if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
getch();
for (i=0;i<256;i++)
{
setcolor(i);
line(i*2, 0, i*2, 440);
line(i*2+1, 0, i*2+1, 440);
}

getch();
closegraph();
return 0;
}

bmp256 -> BC3.1

Добавлено: 24 сен 2004, 17:37
Alt0
Только начинаю.
Умею вставить в свою программу картинку из файла bmp 800*600*24
16 цветов
Я тоже только начинаю (учу Си полгода), а зашел на форум точно с таким же вопросом: нужно вывести на экран
MS DOS bmp-файл..., хотя бы 16 цветов..., Так вот Ученик, к тебе большая просьба, если ты это умеешь, то, может быть подскажешь мне (очень буду благодарен за исходник). [/quote]

Добавлено: 02 окт 2004, 22:42
Ученик
Заглянул сюда совершенно случайно. Чем могу - помогу.
Рисуешь 24-разрядный рисунок, например, my_picture.bmp.
Помещаешь его туда, где исходник компилируется, вместе с
драйвером EGAVGA.BGI. Я работал в BC3.1, поэтому размещал
копии картинки и драйвера и в тот каталог, где создается и
exe файл.
Сейчас научился вставлять 640х480х256. Пытаюсь узнать,
как сделать прозрачным цвет фона спрайта.
Этот код выводит на экран картинку 800х600х24
#include <conio.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <io.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <graphics.h>

unsigned long readnb(int handle,int from,int n)
{
int j=0;
unsigned char c;
unsigned long s=0;
lseek(handle,from,SEEK_SET);
do
{
read(handle,&c,1);
s=s+c*pow(2,j*8);
j++;
}while(j<n);
return(s);
}

int main(void)
{
int handle,i,bppixel,ctype,x=0,y=0;
FILE *stream;
unsigned char ch,r,g,b;
unsigned long fsize,width,height,asize,aloc;
int graphdriver=DETECT;
int graphmode;
initgraph(&graphdriver,&graphmode,"");

clrscr();
if ((handle=open("my_picture.bmp",O_RDONLY | O_BINARY))==-1)
{
perror("Error");
}
stream=fdopen(handle,"r+");

fsize=readnb(handle,2,4);


aloc=readnb(handle,10,4);


width=readnb(handle,18,4);


height=readnb(handle,22,4);


bppixel=readnb(handle,28,2);


ctype=readnb(handle,30,4);


asize=readnb(handle,34,4);

lseek(handle,aloc,SEEK_SET);
cleardevice();
y=height;
do
{
read(handle,&r,1);
read(handle,&g,1);
read(handle,&b,1);

putpixel(x,y,((r+g+b)/51));
x++;
if (x==width)
{
x=0;
y--;
}
//getch();
}while(!eof(handle));
fclose(stream);
close(handle);

getch();
closegraph();
}

Добавлено: 02 окт 2004, 22:52
Ученик
Пардон, поленился оформить код как положено,
и получил смайлик вместо восьмерки и закрывающей скобки.

Добавлено: 02 окт 2004, 23:17
0b0rm0t
А готовых библиотек разве нет? Или обязательно писать самому?

Добавлено: 03 окт 2004, 20:44
Ученик
Думаю, для начинающих изучать язык
(таких, каким являюсь и сам), лучше все писать
самому (ведь простые программы не велики по
объему), чтобы разбираться, что как работает,
а не использовать готовое, не понимая, как
все работает.