⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bk_2_pic.cpp

📁 超声影像工作站系统可与各种型号的B超、彩超连接
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -