link9246 link9247 link9248 link9249 link9250 link9251 link9252 link9253 link9254 link9255 link9256 link9257 link9258 link9259 link9260 link9261 link9262 link9263 link9264 link9265 link9266 link9267 link9268 link9269 link9270 link9271 link9272 link9273 link9274 link9275 link9276 link9277 link9278 link9279 link9280 link9281 link9282 link9283 link9284 link9285 link9286 link9287 link9288 link9289 link9290 link9291 link9292 link9293 link9294 link9295 link9296 link9297 link9298 link9299 link9300 link9301 link9302 link9303 link9304 link9305 link9306 link9307 link9308 link9309 link9310 link9311 link9312 link9313 link9314 link9315 link9316 link9317 link9318 link9319 link9320 link9321 link9322 link9323 link9324 link9325 link9326 link9327 link9328 link9329 link9330 link9331 link9332 link9333 link9334 link9335 link9336 link9337 link9338 link9339 link9340 link9341 link9342 link9343 link9344 link9345 link9346 link9347 link9348 link9349 link9350 link9351 link9352 link9353 link9354 link9355 link9356 link9357 link9358 link9359 link9360 link9361 link9362 link9363 link9364 link9365 link9366 link9367 link9368 link9369 link9370 link9371 link9372 link9373 link9374 link9375 link9376 link9377 link9378 link9379 link9380 link9381 link9382 link9383

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