lab2

6
Ministerul Educatiei al Republicii Moldova Universitatea de Stat din Moldova Facultatea de Matematica si Informatică Darea de seama Lucrare de laborator nr. 2 la „Grafica 2D” Tema: “Prelucrarea BMP” A efectuat:Cîrciumaru Ilie grupa IA21 A verificat : G. Marin

Upload: faliboga-anatolie

Post on 13-Jul-2016

213 views

Category:

Documents


1 download

DESCRIPTION

lucrare laborator 2

TRANSCRIPT

Page 1: lab2

Ministerul Educatiei al Republicii Moldova

Universitatea de Stat din Moldova

Facultatea de Matematica si Informatică

Darea de seamaLucrare de laborator nr. 2

la „Grafica 2D”

Tema: “Prelucrarea BMP”

A efectuat:Cîrciumaru Ilie

grupa IA21

A verificat : G. Marin

Chişinău 2014

Condiția:De citit imaginea cu extensia bmp si de a o afisa in in DialogBox utilizind Visual Studio. De implementat efectul Drag & Drop cu mouse asupra imaginei date.

Page 2: lab2

Imaginea data este pe 4 bits / px.

Codul sursă.

//convertirea valorilor hezacimale pe pozitii de grad(g) in decimalint getDec(unsigned char *a, int g){

int aiT = *a>>4;int aiL = (*a) & 0x0F;int g1 = 1;int i = 0;if(!g) return aiT*16 + aiL;for(;i<g;i++){

g1 *=16;}aiL *= g1;aiT *= g1*16;return aiT + aiL;

}

//coordonatele imaginei coltului stinga sus si dreapta josint x1 = 5, y1 = 5, x2 = 0, y2 = 0;

//diferenta intre coltul stinga sus a imaginei si pozitia lui mouseint dx1, dy1;bool clickFlag = false;void Cl2Dlg::OnPaint(){

if (IsIconic())

2

Page 3: lab2

{CPaintDC dc(this); // контекст устройства для рисования

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// Выравнивание значка по центру клиентского прямоугольникаint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;

// Нарисуйте значокdc.DrawIcon(x, y, m_hIcon);

}else{

CPaintDC dc(this);FILE *f = fopen("carpetmall16.bmp","rb");if(f == NULL) return;

//bufer pentru date initialeunsigned char b[200];

//aici se va citi fiecare culoareaunsigned char c[4];CString o;//pastrarea paleteiCOLORREF a[16];

int n;int d,w,h; // d - diminsiunea, w - width, h - heightint i,j,k;

//54 - marimea standarda a antelului fisierului bmpn = fread(b,1,54,f);

d = getDec(b + 10,0) + getDec(b + 11,2) + getDec(b + 12,4)+getDec(b + 13,6);w = getDec(b + 18,0) + getDec(b + 19,2) + getDec(b + 20,4)+getDec(b + 21,6);h = getDec(b + 22,0) + getDec(b + 23,2) + getDec(b + 24,4)+getDec(b + 25,6);

//citirea paletei//16 - 16 culorifor(i=0;i<16;i++){

fread(c,1,4,f);a[i] = RGB(c[2],c[1],c[0]);

}

//citirea si afisarea pe pixelsfor(i=0;i<h;i++){

for(j=0;j<w;j++){fread(c,1,1,f);dc.SetPixel(j+x1,-i+h+y1,a[c[0]>>4]);j++;if(j==w)break;dc.SetPixel(j+x1,-i+h+y1,a[c[0]&0x0F]);

}

//scaparea de octeti care sunt umplute cu 0, pentru complementarea liniei//for(j=0;j<(int) ((float) w / 2 + 0.5) % 4;j++)

3

Page 4: lab2

fread(c,1,1,f);}x2 = x1 + w;y2 = y1 + h;fclose(f);CDialogEx::OnPaint();

}}

void Cl2Dlg::OnMouseMove(UINT nFlags, CPoint point){

if(clickFlag){x1 = point.x - dx1 ;y1 = point.y - dy1 ;Invalidate();

}

CDialogEx::OnMouseMove(nFlags, point);}

void Cl2Dlg::OnLButtonDown(UINT nFlags, CPoint point){

if(point.x >= x1 && point.y >= y1 && point.x <= x2 && point.y <=y2){clickFlag = true;dx1 = point.x - x1 ;dy1 = point.y - y1 ;

}

CDialogEx::OnLButtonDown(nFlags, point);}

void Cl2Dlg::OnLButtonUp(UINT nFlags, CPoint point){

clickFlag = false;CDialogEx::OnLButtonUp(nFlags, point);

}

Rezultat

4

Page 5: lab2

5

Page 6: lab2

Concluzie.Am citit binar fisier bmp si l-am afisat pe pixel pe ecran. Dupa efectuarea lucrării foarte bine am învățat strcutra fișierului, plus am aflat detalii amplasarii biților în memorie. De asemenea și am lucrat cu biți utiliînd deplasările și măștile. Am implementat efectul Drag & Drop utiliznd evenimente generate de lucrul cu mouse.

6