bmp256 -> BC3.1
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Только начинаю.
Умею вставить в свою программу картинку из файла bmp 800*600*24
16 цветов, т.е. делаю первые шаги, работая с допотопным BC3.1.
Не умею еще пользоваться классами, собирать файлы в проект и
многое другое. Читаю, но пока не все понимаю.
--------------------------------------------------------------------------------
Хотелось бы иметь исходник законченной, работающей программы,
вставляющей bmp с 256 цветами 640*480 для BC3.1 со знакомым
void main(void).
--------------------------------------------------------------------------------
Нигде не могу прочитать о подобном работающем примере - только
фрагменты, которые самому использовать пока слабо.
Сейчас пытаюсь читать о VESA - режимах.
???????????????????????????????????????????????????????????????????????
Может, у кого в загашниках валяется что-нибудь подобное? Подкиньте
Ученику, объясните, что там к чему, станьте ему Учителем, пожалуйста!
Умею вставить в свою программу картинку из файла bmp 800*600*24
16 цветов, т.е. делаю первые шаги, работая с допотопным BC3.1.
Не умею еще пользоваться классами, собирать файлы в проект и
многое другое. Читаю, но пока не все понимаю.
--------------------------------------------------------------------------------
Хотелось бы иметь исходник законченной, работающей программы,
вставляющей bmp с 256 цветами 640*480 для BC3.1 со знакомым
void main(void).
--------------------------------------------------------------------------------
Нигде не могу прочитать о подобном работающем примере - только
фрагменты, которые самому использовать пока слабо.
Сейчас пытаюсь читать о VESA - режимах.
???????????????????????????????????????????????????????????????????????
Может, у кого в загашниках валяется что-нибудь подобное? Подкиньте
Ученику, объясните, что там к чему, станьте ему Учителем, пожалуйста!
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
У меня валялся где-то дома, правда не на С++, а на асме. Подойдёт? 

Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Можно попробовать, если программа закончена. Когда видишь результат - легче разбираться.
Как можно дописать этот код для вставки в него из файла
bmp 640*480*256?
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();
}
Как дописать этот код, чтобы вставить из файла
bmp 640x480x256 цветов?
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;
}
Я тоже только начинаю (учу Си полгода), а зашел на форум точно с таким же вопросом: нужно вывести на экранТолько начинаю.
Умею вставить в свою программу картинку из файла bmp 800*600*24
16 цветов
MS DOS bmp-файл..., хотя бы 16 цветов..., Так вот Ученик, к тебе большая просьба, если ты это умеешь, то, может быть подскажешь мне (очень буду благодарен за исходник). [/quote]
Заглянул сюда совершенно случайно. Чем могу - помогу.
Рисуешь 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();
}
Рисуешь 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();
}
Пардон, поленился оформить код как положено,
и получил смайлик вместо восьмерки и закрывающей скобки.
и получил смайлик вместо восьмерки и закрывающей скобки.
А готовых библиотек разве нет? Или обязательно писать самому?
Думаю, для начинающих изучать язык
(таких, каким являюсь и сам), лучше все писать
самому (ведь простые программы не велики по
объему), чтобы разбираться, что как работает,
а не использовать готовое, не понимая, как
все работает.
(таких, каким являюсь и сам), лучше все писать
самому (ведь простые программы не велики по
объему), чтобы разбираться, что как работает,
а не использовать готовое, не понимая, как
все работает.