Форматы Хранения Графических данных

Страницы работы

Содержание работы

Министерство Образования Российской Федерации

ГОУВПО «КнАГТУ»

Факультет компьютерных технологий

Кафедра МОП ЭВМ

ЛАБОРАТОРНАЯ РАБОТА № 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;

Похожие материалы

Информация о работе