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

📄 rip.cpp

📁 合成4个代表K,C,M,Y通道的BMP位图为打印数据
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Rip.cpp: implementation of the CRip class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Rip.h"
#include "math.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CRip::CRip()
{			

	 lpmemc1=NULL,lpmemm1=NULL,lpmemy1=NULL,lpmemk1=NULL;
	 lpmemc2=NULL,lpmemm2=NULL,lpmemy2=NULL,lpmemk2=NULL;

	InkNums.Inkc=0;
	InkNums.Inkm=0;
	InkNums.Inky=0;
	InkNums.Inkk=0;
	pass=0;
	count=0;
	
}

CRip::~CRip()
{    
	if(lpmemc1)
	delete[] lpmemc1;
	if(lpmemm1)
	delete [] lpmemm1;
	if(lpmemy1)
	delete [] lpmemy1;
	if(lpmemk1)
	delete [] lpmemk1;
	if(lpmemc2)
	delete [] lpmemc2;
	if(lpmemm2)
	delete [] lpmemm2;
	if(lpmemy2)
	delete [] lpmemy2;
	if(lpmemk2)
	delete [] lpmemk2;
	if(filer!=CFile::hFileNull)
		filer.Close();

}


////////////////////////////////////////////////////////////////////////////////////
////////////////	INITIALIZE CRip CLASS DATA MEMBER  ///////////////	
///////////////////////////////////////////////////////////////////////////////////
bool CRip::LoadRipFile(LPCTSTR lpfilename)  
{
	 strs=CString(lpfilename); 
	
	filer.Open(LPCTSTR(strs),CFile::modeRead);
	filer.Read(&rh,sizeof(RipHeader));
		return true;

}
///////////////////////////rip to 4 bmp file ////////////////////////////////////////
bool CRip::Gener4bmp()
{
	::SetCursor(LoadCursor( NULL,IDC_WAIT ));
	CString strc,strm,stry,strk;
	RGBQUAD color[2];  
	CFile filec,filem,filey,filek;

 /////////////  set FOUR FILE NAME;  /////////////////////////
	strc=strs.Left(strs.GetLength()-4);
	strc=strc+"_c.bmp";
	strm=strs.Left(strs.GetLength()-4);
	strm=strm+"_m.bmp";	
	stry=strs.Left(strs.GetLength()-4);
	stry=stry+"_y.bmp";	
	strk=strs.Left(strs.GetLength()-4);
	strk=strk+"_k.bmp";

	bf.bfType=0x4d42;
	bf.bfSize=rh.BytesPerLine*rh.Height+2*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
	bf.bfReserved1=0;
	bf.bfReserved2=0;
	bf.bfOffBits=2*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
		
		bih.biBitCount=1;
		bih.biClrImportant=0;
		bih.biClrUsed=0;
		bih.biCompression=0;
		bih.biHeight=rh.Height;
		bih.biWidth=rh.Width;
		bih.biPlanes=1;
		bih.biSize=sizeof(BITMAPINFOHEADER);
		bih.biSizeImage=rh.BytesPerLine*rh.Height;
		bih.biXPelsPerMeter=(long)ceil(10000*rh.XDPI/254.0);
		bih.biYPelsPerMeter=(long)ceil(10000*rh.YDPI/254.0);
			
		color[0].rgbBlue=0xff;
		color[0].rgbGreen=0xff;
		color[0].rgbRed=0xff;
		color[0].rgbReserved=0;
		color[1].rgbBlue=0x0;
		color[1].rgbGreen=0x0;
		color[1].rgbRed=0x0;
		color[1].rgbReserved=0x0;

/////////////////////////////////////////////////////////////////////////////////////////////
		//	initialize four cfile object , the same time generate four CFile object.;
////////////////////////////////////////////////////////////////////////////////////////			

	LPBYTE lchar=new BYTE[rh.BytesPerLine];
	
	if(!filec.Open(strc,CFile::modeCreate|CFile::modeWrite))
		return false ;
	if(!filem.Open(strm,CFile::modeCreate|CFile::modeWrite))
		return false;
	if(!filey.Open(stry,CFile::modeCreate|CFile::modeWrite))
		return false ;
	if(!filek.Open(strk,CFile::modeCreate|CFile::modeWrite))
		return false;
	filec.Write(&bf,sizeof(BITMAPFILEHEADER));
	filem.Write(&bf,sizeof(BITMAPFILEHEADER));
	filey.Write(&bf,sizeof(BITMAPFILEHEADER));
	filek.Write(&bf,sizeof(BITMAPFILEHEADER));
	filec.Write(&bih,sizeof(BITMAPINFOHEADER));
	filem.Write(&bih,sizeof(BITMAPINFOHEADER));
	filey.Write(&bih,sizeof(BITMAPINFOHEADER));
	filek.Write(&bih,sizeof(BITMAPINFOHEADER));
	filec.Write(color,sizeof(color));
	filem.Write(color,sizeof(color));
	filey.Write(color,sizeof(color));
	filek.Write(color,sizeof(color));

	filec.Seek(62l,FILE_BEGIN);
	filem.Seek(62l,FILE_BEGIN);
	filey.Seek(62l,FILE_BEGIN);
	filek.Seek(62l,FILE_BEGIN);
//------------------------read from rip file begin to end------------------------------
/*	filer.Seek(sizeof(RipHeader),CFile::begin);
	for(DWORD i=0;i<rh.Height;i++)
	{   
		filer.Read(lchar,rh.BytesPerLine);		
		filey.Write(lchar,rh.BytesPerLine);
	   	filer.Read(lchar,rh.BytesPerLine);
		filem.Write(lchar,rh.BytesPerLine);
	   	filer.Read(lchar,rh.BytesPerLine);
		filec.Write(lchar,rh.BytesPerLine);
		filer.Read(lchar,rh.BytesPerLine);
		filek.Write(lchar,rh.BytesPerLine);
	}
*/
//-------------------read rip file from end to begin-----------------------------------
	
for(DWORD i=0;i<rh.Height;i++)
	{
		filer.Seek(-4*rh.BytesPerLine*(i+1),CFile::end);
		filer.Read(lchar,rh.BytesPerLine);		
		filey.Write(lchar,rh.BytesPerLine);
	   	filer.Read(lchar,rh.BytesPerLine);
		filem.Write(lchar,rh.BytesPerLine);
	   	filer.Read(lchar,rh.BytesPerLine);
		filec.Write(lchar,rh.BytesPerLine);
		filer.Read(lchar,rh.BytesPerLine);
		filek.Write(lchar,rh.BytesPerLine);
	}

	if(lchar)
	delete [] lchar;
	lchar=NULL;
	filec.Close();
	filem.Close();
	filey.Close();
	filek.Close();

	::SetCursor(LoadCursor( NULL,IDC_ARROW ));
	return true;

}

////////////////////////////////////////////////////////////////////////////////////////////
//------------- generate  color bmp file -------------------------------------------------------------
void CRip::Genercolor()
{
	colorstr=strs.Left(strs.GetLength()-4);
	colorstr=colorstr+"_color.bmp";
	CFile colorpic(colorstr,CFile::modeCreate|CFile::modeWrite);
//------------------------GET BITMAPFILEHEADER, BITMAPINFOHEADER-----------------------------
	BITMAPINFOHEADER bihcolor;
	BITMAPFILEHEADER bfhcolor;
                                                                                        
	bfhcolor.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
	bfhcolor.bfReserved1=0;
	bfhcolor.bfReserved2=0;
	bfhcolor.bfType=0x4d42;
                                                                      
	bihcolor.biBitCount=24;
	bihcolor.biClrImportant=0;
	bihcolor.biClrUsed=0;
	bihcolor.biCompression=BI_RGB; 
	bihcolor.biPlanes=1;
	bihcolor.biSize=sizeof(BITMAPINFOHEADER);
	bihcolor.biXPelsPerMeter=(long)ceil(10000*rh.XDPI/254.0);
	bihcolor.biYPelsPerMeter=(long)ceil(10000*rh.XDPI/254.0);
	bihcolor.biHeight=(long)(rh.Height/16.0);// height :pixel
	bihcolor.biWidth=rh.BytesPerLine/2; // width pixel 
	bihcolor.biSizeImage=((((rh.BytesPerLine/2)*24)+31)/32*4)*bihcolor.biHeight;

	bfhcolor.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bihcolor.biSizeImage;
	colorpic.Write(&bfhcolor,sizeof(BITMAPFILEHEADER));
	colorpic.Write(&bihcolor,sizeof(BITMAPINFOHEADER));

	BYTE dotnum[256]={0};
	for(unsigned i=0;i<256;i++)
	{
		if(i&1)
			dotnum[i]++;
		if(i&2)
			dotnum[i]++;
		if(i&4)
			dotnum[i]++;
		if(i&8)
			dotnum[i]++;
		if(i&16)
			dotnum[i]++;
		if(i&32)
			dotnum[i]++;
		if(i&64)
			dotnum[i]++;
		if(i&128)
			dotnum[i]++;
	}	                                                                         

///////////////////////////////////////////////////////////////////////////////////////
	LPBYTE lpc=new BYTE[rh.BytesPerLine*16];
	LPBYTE lpm=new BYTE[rh.BytesPerLine*16];
	LPBYTE lpy=new BYTE[rh.BytesPerLine*16];
	LPBYTE lpk=new BYTE[rh.BytesPerLine*16];
	LPBYTE lpcolor=new BYTE[(((rh.BytesPerLine/2)*24)+31)/32*4];

	LPBYTE lpr,lpg,lpb,lpblack,lpic;	                                              
	BYTE grayrc=0,graygm=0,grayby=0,grayk=0;
//--------------- read rip file from begin to end -------------------------------------
/*
	for(DWORD x=0;x<rh.Height*4/64;x++)   //read 16 lines data each mono file
	{		
		filer.Seek(sizeof(RipHeader)+(x*64)*rh.BytesPerLine,CFile::begin);
*/
//--------------------  read rip file from end to begin -------------------------------

	for(DWORD x=0;x<rh.Height*4/64;x++)   //read 16 lines data each mono file
	{		
		filer.Seek(-64*(x+1)*rh.BytesPerLine,CFile::end);
 
//-------------------------------------------------------------------------------------
		 lpr=lpc,lpg=lpm,lpb=lpy,lpblack=lpk,lpic=lpcolor;
		for(int y=0;y<16;y++)
		{
		filer.Read(lpy+y*rh.BytesPerLine,rh.BytesPerLine);
		filer.Read(lpm+y*rh.BytesPerLine,rh.BytesPerLine);
		filer.Read(lpc+y*rh.BytesPerLine,rh.BytesPerLine);
		filer.Read(lpk+y*rh.BytesPerLine,rh.BytesPerLine);
		}                                                        

		 for(DWORD m=0;m<rh.BytesPerLine/2;m++) 
		 {
		for(int z=0;z<16;z++)  
		{
			grayrc+=dotnum[*(lpr+z*rh.BytesPerLine+m*2)];
			graygm+=dotnum[*(lpg+z*rh.BytesPerLine+m*2)];
			grayby+=dotnum[*(lpb+z*rh.BytesPerLine+m*2)];
			grayk+=dotnum[*(lpblack+z*rh.BytesPerLine+m*2)];

			grayrc+=dotnum[*(lpr+z*rh.BytesPerLine+m*2+1)];            
			graygm+=dotnum[*(lpg+z*rh.BytesPerLine+m*2+1)];
			grayby+=dotnum[*(lpb+z*rh.BytesPerLine+m*2+1)];	
			grayk+=dotnum[*(lpblack+z*rh.BytesPerLine+m*2+1)];
		}
		grayrc=255-grayrc;
		graygm=255-graygm;
		grayby=255-grayby;
		
		*lpic++=grayby;
		*lpic++=graygm;
		*lpic++=grayrc;
		grayrc=0,graygm=0,grayby=0,grayk=0;
		 }
		 colorpic.Write(lpcolor,(((rh.BytesPerLine/2)*24)+31)/32*4);
	}
                                                                 
	colorpic.Close();
	delete [] lpc;delete [] lpm;delete [] lpy;delete [] lpk;delete [] lpcolor;
	lpc=0;lpm=0;lpy=0;lpk=0,lpcolor=0;
}


/////////////////////////////////////////////////////////////////////////////////////////
/////////////// INITIALIZE PASS AND COUNT DATA MEMBER(first assume p is 3,4); ////////////////
////////////////////////////////////////////////////////////////////////////////////////

void CRip::SetPass(int p)
{
	pass=p;	                                              
		count=(ULONG)ceil((float)rh.Height/(500/pass))+(pass-1);	

}

////////////////////////////////////////////////////////////////////////////////////////
	///////////// INITIALIZE MEMORY ////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
void CRip::Initmemory()
{
				// cache 1.
	lpmemc1=new BYTE[(500/pass)*pass*rh.BytesPerLine];
	lpmemm1=new BYTE[(500/pass)*pass*rh.BytesPerLine];
	lpmemy1=new BYTE[(500/pass)*pass*rh.BytesPerLine];
	lpmemk1=new BYTE[(500/pass)*pass*rh.BytesPerLine];
	ZeroMemory(lpmemc1,(500/pass)*pass*rh.BytesPerLine);
	ZeroMemory(lpmemm1,(500/pass)*pass*rh.BytesPerLine);
	ZeroMemory(lpmemy1,(500/pass)*pass*rh.BytesPerLine);
	ZeroMemory(lpmemk1,(500/pass)*pass*rh.BytesPerLine);

			// cache 2.
	lpmemc2=new BYTE[500*rh.BytesPerLine];
	lpmemm2=new BYTE[500*rh.BytesPerLine];
	lpmemy2=new BYTE[500*rh.BytesPerLine];
	lpmemk2=new BYTE[500*rh.BytesPerLine];
	ZeroMemory(lpmemc2,500*rh.BytesPerLine);
	ZeroMemory(lpmemm2,500*rh.BytesPerLine);
	ZeroMemory(lpmemy2,500*rh.BytesPerLine);
	ZeroMemory(lpmemk2,500*rh.BytesPerLine);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////  from cache1 to 2 by change order of strip  /////////////////////////////////////////////////
void CRip::Mem1to2(DWORD i)
{
	int x;
	LPBYTE lbc=lpmemc2,lbm=lpmemm2,lby=lpmemy2,lbk=lpmemk2;
	for(x=0;x<pass;x++)
	{
	CopyMemory(lbc,lpmemc1+(i%pass)*(500/pass)*rh.BytesPerLine,(500/pass)*rh.BytesPerLine);

	CopyMemory(lbm,lpmemm1+(i%pass)*(500/pass)*rh.BytesPerLine,(500/pass)*rh.BytesPerLine);
		
	CopyMemory(lby,lpmemy1+(i%pass)*(500/pass)*rh.BytesPerLine,(500/pass)*rh.BytesPerLine);

	CopyMemory(lbk,lpmemk1+(i%pass)*(500/pass)*rh.BytesPerLine,(500/pass)*rh.BytesPerLine);

	lbc=lbc+(500/pass)*rh.BytesPerLine;
	lbm=lbm+(500/pass)*rh.BytesPerLine;
	lby=lby+(500/pass)*rh.BytesPerLine;
	lbk=lbk+(500/pass)*rh.BytesPerLine;
	i++;
	}
}

/////////////////////////////////////////////////////////////////////////////////
	/////////////  3 or 4 pass , i is loop count  ////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
				
void CRip::Pumpdot(DWORD i)
{	
	LPBYTE lbc2=lpmemc2,lbm2=lpmemm2,lby2=lpmemy2,lbk2=lpmemk2;

/////////////////  pass=3  /////////////////////////////////////////////
 if(pass==3)
 {
	if(i%3==0)	
	for(int x=0;x<500;x++)	
	for(DWORD y=0;y<rh.BytesPerLine;y++)
	{	
		if(y%3==0)
		{
		*lbc2=*(lbc2++)&0x92;
		*lbm2=*(lbm2++)&0x92;
		*lby2=*(lby2++)&0x92;
		*lbk2=*(lbk2++)&0x92;
		}
		else if(y%3==1)
		{
		*lbc2=*(lbc2++)&0x49;
		*lbm2=*(lbm2++)&0x49;
		*lby2=*(lby2++)&0x49;
		*lbk2=*(lbk2++)&0x49;
		}
	    else
		{
		*lbc2=*(lbc2++)&0x24;
		*lbm2=*(lbm2++)&0x24;
		*lby2=*(lby2++)&0x24;
		*lbk2=*(lbk2++)&0x24;
		}
	}

		else if(i%3==1)		
	for(int x=0;x<500;x++)	
	for(DWORD y=0;y<rh.BytesPerLine;y++)
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -