Форум — Ответы ( К темам )
? | 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 — все обьекты полностью трёхмерные и независимые, но алгоритм выбран, что по проще и, как следствие, угловая скорость всех обьектов и ось вращения одинаковая, хотя можно было сделать зависящей например от скорости. |