Министерство Образования Российской Федерации
ГОУВПО «КнАГТУ»
Факультет компьютерных технологий
Кафедра МОП ЭВМ
ЛАБОРАТОРНАЯ РАБОТА № 3
по курсу " ЧЕЛОВЕКО-МАШИННОЕ ВЗАИМОДЕЙСТВИЕ "
Тема: "Форматы Хранения Графических данных"
Студента группы 4ВC-1: Рогозин В.А.
Проверил: Хусаинов А.А.
2006 г.
Задание
Написать программу, которая сохраняет и загружает графическое изображение в формате PIC.
Общие сведения о формате PIC
Графический формат PIC является векторным форматом.
Заголовок файла занимает 17 байт: 1,0,0,0,1,0,8,0,0x44,0,0,0,0,0x0C,0x7F,9,6.
В файле содержатся команды, рисование линии, установка цвета и их параметры. Каждая команда занимает один байт. В зависимости от команды, параметры могут занимать несколько байт.
Файл glav.cpp
#include "stdafx.h"
#include "Kurs.h"
#include <math.h>
#include <commdlg.h>
#include <stdio.h>
//---->PIC GLOBALS
static char *header=
"\x01\x00\x00\x00"
"\x01\x00\x08\x00"
"\x44\x00\x00\x00"
"\x00\x0C\x7F\x09"
"\x06";
union charInt
{
short i;
char c[2];
};
FILE *fp;
//Считывание изображения из файла на экран
struct Point { unsigned int x,y; };
struct Rect { unsigned int minx,maxx,miny,maxy; };
struct Pipe
{
struct Rect win, vp;
float kx, ky, sx, sy;
};
//<----PIC
int PolysX[MAXPOINTS][2];
int PolysY[MAXPOINTS][2];
int PointsCnt[2] = {0, 0};
bool IsComplete[2] = {false, false};
int FillColor = 0;
int PixelSize = 6;
int IsPixelBox = 1;
int xUser =0x7ffffff, yUser = 0x7fffffff, xmaxW, ymaxW;
int xmax, xmin=0, ymax, ymin=0 ;
bool IsIn(int x, int y, int p);
void flstr(int x, int y);
void SelectColor(HWND hWnd)
{ CHOOSECOLOR cc;
static COLORREF acrCustClr[16];
cc.rgbResult = FillColor;
}
bool SelectOpenFile(HWND hWnd, LPSTR File, int FSize)
{ OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = "PIC Files (*.pic)\0*.pic";
ofn.nFilterIndex = 1;
ofn.lpstrFile = File;
ofn.lpstrFile[0] = '\0';
ofn.lpstrDefExt = "pic";
ofn.nMaxFile = FSize;
ofn.Flags = OFN_OVERWRITEPROMPT;
if (GetSaveFileName(&ofn))
{ strcpy(File, ofn.lpstrFile);
return true;
}
return false;
}
bool SelectLoadFile(HWND hWnd, LPSTR File, int FSize)
{ OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = "PIC Files (*.pic)\0*.pic";
ofn.nFilterIndex = 1;
ofn.lpstrFile = File;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = FSize;
if (GetOpenFileName(&ofn))
{ strcpy(File, ofn.lpstrFile);
return true;
}
return false;
}
//------->PIC
void saveByte(char b)
{ fwrite(&b,1,1,fp); }
void saveCoord(unsigned x,
unsigned y)
{ union charInt r;
unsigned c;
/* В файле PIC порядок байтов */
/* у целых чисел обратный. */
r.i=x ;
c=r.c[0]; r.c[0]=r.c[1]; r.c[1]=c;
fwrite(&r.i,2,1,fp);
r.i=y ;
c=r.c[0]; r.c[0]=r.c[1]; r.c[1]=c;
fwrite(&r.i,2,1,fp);
}
void PICHeader(void)
{ fwrite(header,17,1,fp); }
void PICMove(unsigned x,unsigned y)
{ saveCoord(x, y);
}
void PICDraw(unsigned x,unsigned y)
{ saveCoord(x,y);
}
void PICFill(char n, int *mx, int *my)
{ char k, com=0x30;
saveByte(com);
saveByte(n);
for (k=0; k<n; k++)
saveCoord (mx[k], my[k]) ;
}
void PICFill0(char n, int *mx, int *my)
{ char k,com=0xD0;
saveByte(com);
saveByte(n);
for (k=0; k<n; k++)
saveCoord(mx[k],my[k]);
}
void PICColor(char color)
{ char com=0xB0;
com|=color&0x0F;
saveByte(com);
}
void PICText(char direction,
char justify,
char *str)
{ char atr=direction<<4 & justify,
com=0xA8;
saveByte(com);
saveByte(atr);
fwrite(str,1,strlen(str), fp);
}
void PICFont(char f)
{ char com=0xA7;
saveByte(com);
saveByte(f) ;
}
void PICTextSize(int x,int y)
{ char com=0xAC;
saveByte(com);
saveCoord(x, y);
}
void PICEnd(void)
{ char com=0x60;
saveByte(com);
}
//Считывание изображения из файла на экран
void eval(struct Pipe *p)
{ p->kx=((float)(p->vp.maxx-p->vp.minx))
/((long)p->win.maxx - (long)p->win.minx );
p->ky=((float)(p->vp.maxy-p->vp.miny))
/((long)p->win.maxy - (long)p->win.miny );
p->sx=p->vp.maxx-p->kx*p->win.maxx;
p->sy=p->vp.maxy-p->ky*p->win.maxy;
}
struct Point r;
void transform(struct Point *pp,
struct Pipe *pip,
struct Point *pd)
{ pd->x=pip->kx*pp->x+pip->sx;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.