lab2
DESCRIPTION
lucrare laborator 2TRANSCRIPT
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.
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
{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
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
5
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