📄 pic.cpp
字号:
tbuf,
m_width,
m_height,
TRUE,
95); // quality value 1-100.
//JpegFile::VertFlipBuf(m_buf, m_width * 3, m_height);
delete[] tbuf;
}
else
{
unsigned char *tbuf=new unsigned char[ m_width *m_height];
memcpy(tbuf,m_buf, m_width * m_height);
JpegFile::VertFlipBuf(tbuf, m_width , m_height);
// save RGB packed buffer to JPG
ok=JpegFile::GryToJpegFile(filename,
tbuf,
m_width,
m_height,
95);
delete[] tbuf;
}
return ok;
}
void CPic::loadbmp( char *filename )
{
if (m_buf!=NULL) {
delete [] m_buf;
}
BMPFile theBmpFile;
m_buf=theBmpFile.LoadBMP(filename, &m_width, &m_height);
if ((m_buf==NULL) || (theBmpFile.m_errorText!="OK")) {
AfxMessageBox(theBmpFile.m_errorText);
m_buf=NULL;
return;
}
//////////////////////
// set up for display
// do this before DWORD-alignment!!!
// this works on packed (not DWORD-aligned) buffers
// swap red and blue for display
JpegFile::BGRFromRGB(m_buf, m_width, m_height);
// vertical flip for display
JpegFile::VertFlipBuf(m_buf, m_width * 3, m_height);
m_filename=_T(filename);
fileType = 2;
flag = 1;//color;
}
void CPic::FindEdge()
{
}
void CPic::HFlip()
{
JpegFile::HerzFlipBuf(m_buf,m_height,m_width,flag);
}
void CPic::RoteL()
{
JpegFile::leftroteBuf(m_buf,&m_height,&m_width,flag);
}
void CPic::RoteR()
{
JpegFile::rightroteBuf(m_buf,&m_height,&m_width,flag);
}
void CPic::ReLoad()
{
if(fileType==1)
{
if(flag==1)
loadjpg(m_filename.GetBuffer(256));
else
loadjpgGry(m_filename.GetBuffer(256));
}
else
{
loadbmp(m_filename.GetBuffer(256));
}
}
void CPic::VertFlip()
{
if(flag==1)
JpegFile::VertFlipBuf(m_buf,m_width*3,m_height);
else
JpegFile::VertFlipBuf(m_buf,m_width,m_height);
}
void
CPic::CutBMP(CDC *theDC,int x,int y,int w,int h,int sx,int sy,int sw,int sh)
{
if (m_buf==NULL) return;
if (theDC!=NULL) {
BYTE *tmp;
// DWORD-align for display
tmp = JpegFile::MakeDwordAlignedBuf(m_buf,
m_width,
m_height,
&m_widthDW,flag);
// set up a DIB
BITMAPINFOHEADER bmiHeader;
bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmiHeader.biWidth = m_width;
bmiHeader.biHeight = m_height;
bmiHeader.biPlanes = 1;
bmiHeader.biBitCount = 24;
bmiHeader.biCompression = BI_RGB;
bmiHeader.biSizeImage = 0;
bmiHeader.biXPelsPerMeter = 0;
bmiHeader.biYPelsPerMeter = 0;
bmiHeader.biClrUsed = 0;
bmiHeader.biClrImportant = 0;
theDC->SetStretchBltMode(COLORONCOLOR);
int lines = StretchDIBits(theDC->m_hDC,
x, y,
w,
h,
sx,sy,
//bmiHeader.biWidth,
//bmiHeader.biHeight,
sw,sh,
tmp,
(LPBITMAPINFO)&bmiHeader,
DIB_RGB_COLORS,
SRCCOPY);
delete [] tmp;
}
}
void CPic::ChgConBri(int con,int bri)
{
if (m_buf==NULL) return;
//if(pbuf!=NULL) delete [] pbuf;
long wh=m_width*m_height;
if(flag==1) wh *= 3;
//BYTE *pbuf=new BYTE[wh];
int bit;
for(long ix=0;ix<wh;ix++)
{
bit=m_buf[ix]+bri;
if(bit>127)
{
bit-=con;
if(bit<127)bit=127;
}
else
{
bit+=con;
if(bit>127)bit=127;
}
if(bit>255) bit=255;
if(bit<0) bit=0;
m_buf[ix]=bit;
}
//delete[] pbuf;
}
void CPic::ChgGryWinW(int left,int right)
{
if (m_buf==NULL) return;
//if(pbuf!=NULL) delete [] pbuf;
long wh=m_width*m_height;
if(flag==1) wh *= 3;
//BYTE *pbuf=new BYTE[wh];
// int bit;
for(long ix=0;ix<wh;ix++)
{
if(m_buf[ix]<left)
m_buf[ix]=0;
else if(m_buf[ix]>right)
m_buf[ix]=0;
else
m_buf[ix]=(m_buf[ix]-left)*255/(right-left+1);
}
}
void CPic::ChgGryWin(int left,int right)
{
if (m_buf==NULL) return;
//if(pbuf!=NULL) delete [] pbuf;
long wh=m_width*m_height;
if(flag==1) wh *= 3;
//BYTE *pbuf=new BYTE[wh];
// int bit;
for(long ix=0;ix<wh;ix++)
{
if(m_buf[ix]<left) m_buf[ix]=0;
if(m_buf[ix]>right) m_buf[ix]=0;
}
}
void CPic::SetZoom( CDC* theDC,float zoompic,int w,int h)
{
zoom = zoompic;
sx = 0;
sy = 0;
ddx = (int)(m_width * zoom - w);
ddy = (int)(m_height * zoom - h);
if (NULL == theDC) return;
BYTE *tmp = NULL;
// DWORD-align for display
tmp = JpegFile::MakeDwordAlignedBuf(m_buf,
m_width,
m_height,
&m_widthDW,flag);
// set up a DIB
/*BITMAPINFOHEADER bmiHeader;
bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmiHeader.biWidth = m_width;
bmiHeader.biHeight = m_height;
bmiHeader.biPlanes = 1;
bmiHeader.biBitCount = 24;
bmiHeader.biCompression = BI_RGB;
bmiHeader.biSizeImage = 0;
bmiHeader.biXPelsPerMeter = 0;
bmiHeader.biYPelsPerMeter = 0;
bmiHeader.biClrUsed = 0;
bmiHeader.biClrImportant = 0;*/
BYTE *tempxx=new BYTE[sizeof(BITMAPINFOHEADER)+256*4];
if(tempxx==NULL) {AfxMessageBox("Out of Memory!");return;}
BITMAPINFO *BMIInfo = (BITMAPINFO *) tempxx;
memset(BMIInfo,0,sizeof(BITMAPINFOHEADER)+256*4);
BMIInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
BMIInfo->bmiHeader.biWidth = m_width;
BMIInfo->bmiHeader.biHeight = m_height;
BMIInfo->bmiHeader.biPlanes = 1;
BMIInfo->bmiHeader.biBitCount = 8;
BMIInfo->bmiHeader.biCompression = BI_RGB;
BMIInfo->bmiHeader.biSizeImage = 0;
BMIInfo->bmiHeader.biXPelsPerMeter = 0;
BMIInfo->bmiHeader.biYPelsPerMeter = 0;
BMIInfo->bmiHeader.biClrUsed = 0;
BMIInfo->bmiHeader.biClrImportant = 0;
//theDC->FillSolidRect(x,y,w,h,RGB(240,240,240));
CPalette *oldp;
if(flag==1)
{
BMIInfo->bmiHeader.biBitCount = 24;
}
else
{
BMIInfo->bmiHeader.biBitCount = 8;
oldp = theDC->SelectPalette(pScrnPalette, FALSE);
theDC->RealizePalette();
theDC->SetStretchBltMode(COLORONCOLOR);
//RGBQUAD* mtt=(RGBQUAD*)(BMIInfo->bmiColors);
//BMIInfo->bmiColors = new RGBQUAD[256];
for( int k = 0; k < 256; ++k){
BMIInfo->bmiColors[k].rgbBlue = (BYTE)k;
BMIInfo->bmiColors[k].rgbGreen = (BYTE)k;
BMIInfo->bmiColors[k].rgbRed = (BYTE)k;
BMIInfo->bmiColors[k].rgbReserved = 0;
}
}
theDC->FillSolidRect(0,0,w,h,RGB(240,240,240));
int bw = (int)(m_width * zoom);
int bh = (int)(m_height * zoom);
int x = 0, y = 0;
int tsx, tsy;
if(w>bw)
{
x+=(w-bw)/2;
w=bw;
tsx=sx=0;
bw=BMIInfo->bmiHeader.biWidth;
}
else
{
if ((sx + w) > bw ) sx = bw - w;
tsx = (int)(sx / zoom);
bw = (int)(w / zoom);
}
if(h>bh)
{
y+=(h-bh)/2;
h=bh;
tsy=sy=0;
bh=BMIInfo->bmiHeader.biHeight;
}
else
{
if( (sy+h)>bh ) sy = bh -h;
bh = (int)(h / zoom);
tsy = (int)(sy / zoom);
tsy = BMIInfo->bmiHeader.biHeight - bh-tsy;
}
theDC->SetStretchBltMode(COLORONCOLOR);
int lines = StretchDIBits(theDC->m_hDC,
x, y,
w,
h,
tsx,tsy,
bw,
bh,
tmp,
BMIInfo,
DIB_RGB_COLORS,
SRCCOPY);
if (1 != flag)
{
theDC->SelectPalette(oldp, FALSE);
theDC->RealizePalette();
theDC->SetStretchBltMode(COLORONCOLOR);
}
delete [] tmp;
if (imageID > 0)
{
char ids[5];
sprintf(ids, "%d", imageID);
theDC->SetTextColor(RGB(255, 255, 255));
theDC->SetBkColor(RGB(0, 0, 255));
theDC->TextOut(10, 10, ids);
float zz = (float)(w / bw * 100);
sprintf(ids, "%.0f%%", zz);
theDC->TextOut(10, 50, ids);
}
delete [] tempxx;
}
void
CPic::CreateGry(BYTE* buf, int w, int h)
{
if (NULL != m_buf) delete [] m_buf;
m_buf = new BYTE[w * h];
memcpy(m_buf, buf, w * h);
m_width = w;
m_height = h;
flag = 0;
}
void
CPic::CreatePlate(int flag)
{
int k;
FILE* fp = NULL;
char *fn[] =
{
"blackbdy.lut",
"cardiac.lut",
"flow.lut",
"ge_color.lut",
"gold.lut",
"hotiron.lut",
"nih.lut",
"nih_fire.lut",
"nih_ice.lut",
"Rainramp.lut",
"spectrum.lut",
"x_hot.lut",
"x_rain.lut"
};
switch (flag)
{
case 1:
for( k=0;k<256;k++)
{
m_Rra[k]=k;
m_Gra[k]=k;
m_Bra[k]=k;
}
break;
case 2:
for( k=0;k<256;k++)
{
m_Rra[k]=255-k;
m_Gra[k]=255-k;
m_Bra[k]=255-k;
}
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
fp = fopen(fn[flag - 3], "rb");
if(fp==NULL) break;
fread(m_Rra,256,1,fp);
fread(m_Gra,256,1,fp);
fread(m_Bra,256,1,fp);
fclose(fp);
break;
/* case 4:
fp = fopen(fn[flag-3],"rb");
if(fp==NULL) break;
fread(m_Rra,256,1,fp);
fread(m_Gra,256,1,fp);
fread(m_Bra,256,1,fp);
fclose(fp);
break;
case 5:
fp = fopen(fn[flag-3],"rb");
if(fp==NULL) break;
fread(m_Rra,256,1,fp);
fread(m_Gra,256,1,fp);
fread(m_Bra,256,1,fp);
fclose(fp);
break;
case 6:
fp = fopen(fn[flag-3],"rb");
if(fp==NULL) break;
fread(m_Rra,256,1,fp);
fread(m_Gra,256,1,fp);
fread(m_Bra,256,1,fp);
fclose(fp);
break;
case 7:
fp = fopen(fn[flag-3],"rb");
if(fp==NULL) break;
fread(m_Rra,256,1,fp);
fread(m_Gra,256,1,fp);
fread(m_Bra,256,1,fp);
fclose(fp);
break;
case 8:
fp = fopen(fn[flag-3],"rb");
if(fp==NULL) break;
fread(m_Rra,256,1,fp);
fread(m_Gra,256,1,fp);
fread(m_Bra,256,1,fp);
fclose(fp);
break;
case 9:
fp = fopen(fn[flag-3],"rb");
if(fp==NULL) break;
fread(m_Rra,256,1,fp);
fread(m_Gra,256,1,fp);
fread(m_Bra,256,1,fp);
fclose(fp);
break;
case 10:
fp = fopen(fn[flag-3],"rb");
if(fp==NULL) break;
fread(m_Rra,256,1,fp);
fread(m_Gra,256,1,fp);
fread(m_Bra,256,1,fp);
fclose(fp);
break;
case 11:
fp = fopen(fn[flag-3],"rb");
if(fp==NULL) break;
fread(m_Rra,256,1,fp);
fread(m_Gra,256,1,fp);
fread(m_Bra,256,1,fp);
fclose(fp);
break;
case 12:
fp = fopen(fn[flag-3],"rb");
if(fp==NULL) break;
fread(m_Rra,256,1,fp);
fread(m_Gra,256,1,fp);
fread(m_Bra,256,1,fp);
fclose(fp);
break;
case 13:
fp = fopen(fn[flag-3],"rb");
if(fp==NULL) break;
fread(m_Rra,256,1,fp);
fread(m_Gra,256,1,fp);
fread(m_Bra,256,1,fp);
fclose(fp);
break;
case 14:
fp = fopen(fn[flag-3],"rb");
if(fp==NULL) break;
fread(m_Rra,256,1,fp);
fread(m_Gra,256,1,fp);
fread(m_Bra,256,1,fp);
fclose(fp);
break;
case 15:
fp = fopen(fn[flag-3],"rb");
if(fp==NULL) break;
fread(m_Rra,256,1,fp);
fread(m_Gra,256,1,fp);
fread(m_Bra,256,1,fp);
fclose(fp);
break;
*/
default:
for( k=0;k<256;k++)
{
m_Rra[k]=k;
m_Gra[k]=k;
m_Bra[k]=k;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -