www.pudn.com > 3DEDITOR.rar > PICTURE.CPP
#include "stdafx.h" #include#include #include #include #include "jpeg.h" int sizes[]={ 1,2,4,8,16,32,64,128,256 }; int nsizes=8; int byteRGB::Intensity(void) { return (int)(r*299/1000 + g*587/1000 + b*114/1000); } void byteRGB::ToYIQ(void) { unsigned char y,i,q; y=(299*r+587*g+114*b)/1000; i=(596*r-275*g-321*b)/1192+127; q=(212*r-523*g+311*b)/1046+127; y=((int)y-127)*2/3+127; i=((int)i-127)*2/3+127; q=((int)q-127)*2/3+127; r=y; g=i; b=q; } void byteRGB::FromYIQ(void) { unsigned char y,i,q; int u,I,Q; I=((int)g-127)*166/127; Q=((int)b-127)*148/127; u=(int)r+(956*I+621*Q)/1000; u=(u-127)*3/2+127; y=u<0?0:u>255?255:u; u=(int)r-(272*I+647*Q)/1000; u=(u-127)*3/2+127; i=u<0?0:u>255?255:u; u=(int)r+(1703*Q-1106*I)/1000; u=(u-127)*3/2+127; q=u<0?0:u>255?255:u; r=y; g=i; b=q; } void picture::ErasePicture(char c) { int a; for( a=0;a =0;a-- ) { fread((char *)buf[a],sx,3,fp); int z=0,p=0; for( ;z =0;a-- ) { for( b=0;b sx) break; if (i sy) break; if (i =0;a-- ) fread( (char *)buf[a],wx,1,fp ); fclose(fp); build_icon(); return 1; } return 0; } int picture::LoadJPG(char *name) { FreePicture(); JPEGDATA data; FILE *fp; fp=fopen(name,"rb"); if (fp) { memset(&data,0,sizeof(JPEGDATA)); data.input_file = fp; JpegInfo(&data); fclose(fp); if (data.components==3 || data.components==1) { bytespixel=data.components; if (bytespixel==3) CreatePicture24(data.width,data.height); else CreatePicture8(data.width,data.height,0); fp=fopen(name,"rb"); data.ptr = buf[0]; data.input_file = fp; data.hWnd = 0; data.ProgressMsg = 0; JpegRead(&data); fclose(fp); if (data.status==0) { build_icon(); return 1; } else FreePicture(); } } return 0; } void picture::ToYIQ() { if (bytespixel!=3) return ; int x,y; byteRGB *rgb; for( y=0;y ToYIQ(); } } void picture::FromYIQ() { if (bytespixel!=3) return ; int x,y; byteRGB *rgb; for( y=0;y FromYIQ(); } } void cor_inter(float xi[3], float yi[3], float c[3][3], float x, float y, byteRGB *rgb) { int a; float v[3][2],m[3][2],n[3]; for( a=0;a<3;a++ ) { v[a][0]=xi[a]; v[a][1]=yi[a]; } m[0][0]=x-v[0][0]; m[0][1]=y-v[0][1]; m[1][0]=v[2][0]-v[0][0]; m[1][1]=v[2][1]-v[0][1]; m[2][0]=v[1][0]-v[0][0]; m[2][1]=v[1][1]-v[0][1]; n[0]=m[1][0]*m[2][1]-m[1][1]*m[2][0]; n[1]=m[0][0]*m[2][1]-m[0][1]*m[2][0]; n[2]=m[0][0]*m[1][1]-m[0][1]*m[1][0]; for( a=0;a<3;a++ ) *((&rgb->r)+a)=(unsigned char)(((c[2][a]-c[0][a])*n[1]-(c[1][a]-c[0][a])*n[2])/n[0]+c[0][a]); } void picture::GetPixel(int x,int y,byteRGB *rgb) { if (buf==0) return; x=(x%sx); y=(y%sy); if(x<0) x=sx+x; if(y<0) y=sy+y; if (bytespixel==3) *rgb=*((byteRGB *)&buf[y][x*3]); else if (pal) *rgb=pal[buf[y][x]]; else rgb->r=rgb->g=rgb->b=buf[y][x]; } #define ROUND(x) ((x)>=0?((int)(x)):((int)(x)-1)) void picture::GetPixel(float x, float y, byteRGB * rgb,int textinterp) { if (textinterp==0) { GetPixel(ROUND(x), ROUND(y), rgb); return; } float xi[3], yi[3]; float cor[3][3]; int ix=ROUND(x),iy=ROUND(y); byteRGB rgbt; if (buf==0) return; GetPixel(ix, iy, &rgbt); cor[2][0]=rgbt.r; cor[2][1]=rgbt.g; cor[2][2]=rgbt.b; GetPixel(ix, iy+1, &rgbt); cor[2][0]+=rgbt.r; cor[2][1]+=rgbt.g; cor[2][2]+=rgbt.b; GetPixel(ix+1, iy, &rgbt); cor[2][0]+=rgbt.r; cor[2][1]+=rgbt.g; cor[2][2]+=rgbt.b; GetPixel(ix+1, iy+1, &rgbt); cor[2][0]+=rgbt.r; cor[2][1]+=rgbt.g; cor[2][2]+=rgbt.b; cor[2][0]/=4; cor[2][1]/=4; cor[2][2]/=4; if((y-iy)>(ix+1-x)) { xi[0]=(float)(ix+1); yi[0]=(float)(iy+1); } else { xi[0]=(float)(ix); yi[0]=(float)(iy); } if((x-ix)>(y-iy)) { xi[1]=(float)(ix+1); yi[1]=(float)(iy); } else { xi[1]=(float)(ix); yi[1]=(float)(iy+1); } GetPixel((int)xi[0], (int)yi[0], &rgbt); cor[0][0]=rgbt.r; cor[0][1]=rgbt.g; cor[0][2]=rgbt.b; GetPixel((int)xi[1], (int)yi[1], &rgbt); cor[1][0]=rgbt.r; cor[1][1]=rgbt.g; cor[1][2]=rgbt.b; xi[2]=ix+0.5f; yi[2]=iy+0.5f; cor_inter(xi, yi, cor, x, y, rgb); }