Форум — Ответы     (  К темам )
 ?  Alexandr: С (23-04-2003 19:14:15)
Как в С(Досовском) отобразить на экране BItMap
 Matt (23-04-2003 20:18:54)
Ну ты, блин замутил!!!
Разберись с форматом файла *.bmp (он не особо сложный и инфы по нему навалом)
и выводи по пикселю. Только для этого надо сначала перейти в соответствующий графический режим (про эти режимы прочитай в документации по графическим функциям BIOS) а потом пиши в видеопамять (про работу с видеопамятью прочитай в книге по Assembler (Финогенова, например)).
Удачи!
 Alexandr (23-04-2003 21:18:11)
Дело в том , что я точно знаю, что это можно сделать без ассемблера, так как это лабораторная работа первого курса, а ассемблер у нас на третьем, посему ни у кого нет более конструктивных предложений????
 Георгий (23-04-2003 23:25:20)
лоботрясы всех стран обьединяйтесь.
лови халяву:
http://georgiestar.pisem.net/seebmp.rar
это мой сокурсник на первом кусре сделал от нечего делать
работа не "засвечена", но графика на асме, чем и тебе советую заняться.
переделка на чистый С (без асма) элементарна, но если вызовет проблемы могу помочь
 Matt (24-04-2003 13:03:29)
Сразу прошу прощения за offtopic!!!
Alexandr, а ты случаем не в МИЭМ учишься?
 Георгий (24-04-2003 17:58:27)
У вас это типа стандартное индивидуальное задание?
честно говоря не вижу в нём пректической ценности — на первой лабе человек ничего не знает, а ему и работу с файлами, графикой, циклы, условные переходы дают — тяжело будет и процент успешно освоивших курс возможно мало.
 Alexandr (24-04-2003 19:26:20)
Нет , я учусь в ОГТУАЭ на факультете кибернетики, немогу сказать что ничего не знаю , но задача индивидуальна, а ее собственно я уже сделал , прошу прощение за беспокойство.Кстати вот текст проги (только части касающейся загрузки BITMAP )
///////////////////////////////////////
#include <graphics.h>
#include <stdio.h>
#include <io.h>
#include <conio.h>
#include <stdlib.h>
struct bf {
unsigned p1:1;
unsigned p2:1;
unsigned p3:1;
unsigned p4:1;
unsigned p5:1;
unsigned p6:1;
unsigned p7:1;
unsigned p8:1;
};
typedef unsigned short WORD;
typedef unsigned char BYTE;
typedef unsigned long int DWORD;
typedef long int LONG;
typedef struct
{
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
typedef struct
{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE reserved;
} RGBQUAD;
typedef struct
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
typedef struct
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
void main()
{
char path1[255];
scanf("%s",path1);
char path2[255];
scanf("%s",path2);
FILE *f;
FILE *f1;
f=fopen(path1,"rb");
f1=fopen(path2,"w++");
fseek(f,0,SEEK_SET);
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
fread(&(bmfh),sizeof(bmfh),1,f);
fread(&(bmih),sizeof(bmih),1,f);
fseek(f,bmfh.bfOffBits,SEEK_SET);
struct bf pi1;
int x,y,co,ct;
x=0;
co=0;
ct=0;
y=bmih.biHeight;
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
while(y>=0)
{
fread(&(pi1),sizeof(pi1),1,f);
if(pi1.p8==0) putpixel(x,y,1);
else putpixel(x,y,15);
ct++;
x++;
co++;
if(co>=bmih.biWidth)
{
x=0;
co=0;
y--;
};
if(pi1.p7==0) putpixel(x,y,1);
else putpixel(x,y,15);
ct++;
x++;
co++;
if(co>=bmih.biWidth)
{
x=0;
co=0;
y--;
};
if(pi1.p6==0) putpixel(x,y,1);
else putpixel(x,y,15);
ct++;
x++;
co++;
if(co>=bmih.biWidth)
{
x=0;
co=0;
y--;
};
if(pi1.p5==0) putpixel(x,y,1);
else putpixel(x,y,15);
ct++;
x++;
co++;
if(co>=bmih.biWidth)
{
x=0;
co=0;
y--;
};
if(pi1.p4==0) putpixel(x,y,1);
else putpixel(x,y,15);
ct++;
x++;
co++;
if(co>=bmih.biWidth)
{
x=0;
co=0;
y--;
};
if(pi1.p3==0) putpixel(x,y,1);
else putpixel(x,y,15);
ct++;
x++;
co++;
if(co>=bmih.biWidth)
{
x=0;
co=0;
y--;
};
if(pi1.p2==0) putpixel(x,y,1);
else putpixel(x,y,15);
ct++;
x++;
co++;
if(co>=bmih.biWidth)
{
x=0;
co=0;
y--;
};
if(pi1.p1==0) putpixel(x,y,1);
else putpixel(x,y,15);
ct++;
x++;
co++;
if(co>=bmih.biWidth)
{
x=0;
co=0;
y--;
};
};
}
 Георгий (24-04-2003 22:22:56)
как и ожидалось код не гладкий:
я бы на твоём месте анализ битовых флагов сделал бы так:
union union_bf{
struct {
unsigned p1:1;
unsigned p2:1;
unsigned p3:1;
unsigned p4:1;
unsigned p5:1;
unsigned p6:1;
unsigned p7:1;
unsigned p8:1;
} bf;
char b;
};
union_bf z;
int i;
char mask;
for (mask=1,i=0;i<7;i++,mask>>=1)
{
if(!(z.b&mask)) putpixel(x,y,1);
else putpixel(x,y,15);
ct++;
x++;
co++;
if(co>=bmih.biWidth)
{
x=0;
co=0;
y--;
};
};
как ты видишь не достаточно просто "знать" восприми пожалуйста это как конструктивную критику
 Alexandr (25-04-2003 00:09:44)
Спасибо за подсказку Георгий .
Приму к сведению.Кстати, не подскажете какой-нибудь адресок, где можно было-бы почитать что-нибудь на русском языке по поводу графики в С, заранее благодарен.
 Георгий (25-04-2003 01:07:55)
как таковой графики в С нет а у разработчиков компиляторов свой подход:

borland C для DOS использует *.bgi библиотеки (которые кстати можно превратить в obj и линковать вместе с основной программой) + набор функций из странно линкуемой графической библиотики (нужно галочку в настройках линкера ставить)
для windows предлагают использовать Win API

watcom C (судя по всему прекративший существование) использовал относительно быструю графическую библиотеку (присоединяемую к проекту как и все остальные), но набор функций там несколько отличается от борланда.

конкретных ссылок дать не могу, но советую определиться с платформой (DOS, Win, Unix, Linux, .NET) и искать набор её функций для рисования графики — например:
DOS — библиотеки борланда, ваткома или работа с железом на прямую (спецификации VESA, EGA — а всё остальное не очень стандартное)

Win — или классы обёртки среды разработки (у BCB это разные canvas) или функции Win API, или библиотеки DirectX, OpenGL

о других средах и ОС только слышал, да и то не со стороны программирования графики

PS. когда я делал на 1-м курсе графическую программу, то у меня уже был экзамен автоматом и препод несколько странно на меня смотрел, когда я ему стал показывать её, а после демонстрации хотел опять автомат поставить, но тут его ждал облом. пока у тебя есть время и желание сделай нечто сильное, что потом тебе самому будет нравиться, а потом, на 3-4 курсе, я думаю этот же человек у тебя будет опять что-то вести, возможно и УИР и диплом у него будешь делать и не мучиться.
PPS. слабо сделать круче, чем я? http://georgiestar.pisem.net/ — прога 3dgraph_.exe — все обьекты полностью трёхмерные и независимые, но алгоритм выбран, что по проще и, как следствие, угловая скорость всех обьектов и ось вращения одинаковая, хотя можно было сделать зависящей например от скорости.