📄 bk_2_pic.cpp
字号:
if (m_buf==NULL) return false;
BOOL ok;
if(flag==1)//color
{
unsigned char *tbuf=new unsigned char[ m_width * 3*m_height];
memcpy(tbuf,m_buf, m_width * 3*m_height);
JpegFile::VertFlipBuf(tbuf, m_width * 3, m_height);
// we swap red and blue for display, undo that.
JpegFile::BGRFromRGB(tbuf, m_width, m_height);
// save RGB packed buffer to JPG
ok=JpegFile::RGBToJpegFile(filename,
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)
{
BMPFile theBmpFile;
if (NULL != m_buf) delete [] m_buf;
m_buf = theBmpFile.LoadBMP(filename, &m_width, &m_height);
if ((NULL == m_buf) || ("OK" != theBmpFile.m_errorText))
{
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 (1 == fileType)
{
if (1 == flag)
loadjpg(m_filename.GetBuffer(256));
else
loadjpgGry(m_filename.GetBuffer(256));
}
else
{
loadbmp(m_filename.GetBuffer(256));
}
}
void
CPic::VertFlip()
{
if (1 == flag)
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 (NULL == m_buf) return;
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;
theDC->SetStretchBltMode(COLORONCOLOR);
int lines = StretchDIBits(theDC->m_hDC,
x, y, w, h,
sx, sy, sw, sh,
tmp,
(LPBITMAPINFO)&bmiHeader,
DIB_RGB_COLORS,
SRCCOPY);
delete [] tmp;
tmp = NULL;
}
void
CPic::ChgConBri(int con, int bri)
{
if (NULL == m_buf) return;
long wh = m_width * m_height;
if (1 == flag) wh *= 3;
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;
}
}
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];
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 (NULL == m_buf) return;
long wh=m_width*m_height;
if(flag==1) wh *= 3;
//BYTE *pbuf=new BYTE[wh];
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=sy=0;
ddx = int(m_width * zoom - w);
ddy = int(m_height * zoom - h);
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;*/
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(flag!=1)
{
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(m_buf!=NULL)
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)
{
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"};
int k;
FILE *fp;
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:
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 + -