[TOC](图像rip 挂网 灰度图转单色,2bit图)

tiff 彩色 CMYK打印

通常彩色打印,印刷,需要Tiff 图并为cmyk印刷模式,软件会将其分离成4通道8位灰度图,如果图像不是cmyk模式图而是rgb图,则需要将rgb转为cmyk,如下c++代码

 ///RGB转cmyk 此方法做了8倍宽度对齐
  static void rgbtocmyk(BYTE* &rgb, BYTE*& buf_c, BYTE*& buf_m, BYTE*& buf_y, BYTE*&buf_k, int &w, int &h)
  {


	  BYTE* buf_rgb = rgb + 54;
	  int linewidth = (((BITMAPINFO*)(rgb + sizeof(BITMAPFILEHEADER)))->bmiHeader.biWidth * 24 + 31) / 32 * 4;
	  w = ((BITMAPINFO*)(rgb + sizeof(BITMAPFILEHEADER)))->bmiHeader.biWidth / 8 * 8;
	  h = ((BITMAPINFO*)(rgb + sizeof(BITMAPFILEHEADER)))->bmiHeader.biHeight;



	  buf_c = (BYTE*)malloc(w*h);
	  buf_m = (BYTE*)malloc(w*h);
	  buf_y = (BYTE*)malloc(w*h);
	  buf_k = (BYTE*)malloc(w*h);
	  memset(buf_c, 0x255, w*h);
	  memset(buf_m, 0x255, w*h);
	  memset(buf_y, 0x255, w*h);
	  memset(buf_k, 0x255, w*h);

      
	  for (int i = h - 1; i >= 0; i--)
	  {
         
		  for (int j = 0; j < w * 3; j += 3)
		  {
			 

			  int b = buf_rgb[i*linewidth + j];
			  int g = buf_rgb[i*linewidth + j + 1];
			  int r = buf_rgb[i*linewidth + j + 2];
			  
			  float r1 = r / 255.0;
			  float g1 = g / 255.0;
			  float b1 = b / 255.0;
			  float k1 = 1 - max(b1, max(r1, g1));
			  
			  buf_c[i*w + j / 3] = 255- (  (1-r1-k1)/(1-k1)*255);
			  buf_m[i*w + j / 3] =255- ((1 - g1 - k1) / (1 - k1) * 255);
			  buf_y[i*w + j / 3] =255- ( (1 - b1 - k1) / (1 - k1) * 255);
			  buf_k[i*w + j / 3] =255-(  k1*255);


			 


		  }
	  }

 
  }

cmyk 4通道灰度图提取

void myrip::getCMYK_Tiff(const char* path, BYTE* &Cmage, BYTE* &Mmage, BYTE* &Ymage, BYTE* &Kmage, int &newWidth, int &height)
{ 

	 
	int allbuffsize;
	int width;
		TIFF* tif = TIFFOpen(path, "r");
		TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height);
		TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width);
	 
		 
		int	perlines = TIFFScanlineSize(tif);
		BYTE* cmykbuf = (BYTE*)malloc(perlines*height);
		for (int i = 0; i < height; i++)
		{
		 
		  	TIFFReadScanline(tif, cmykbuf + i*perlines, i);
		}

		newWidth = width / 8 * 8;
		Cmage = (BYTE*)malloc((newWidth * 8 + 31) / 32 * 4 * height);
		//memset(Cmage, 0x0, width*height);
		Mmage = (BYTE*)malloc((newWidth * 8 + 31) / 32 * 4 * height);
		Ymage = (BYTE*)malloc((newWidth * 8 + 31) / 32 * 4 * height);
		Kmage = (BYTE*)malloc((newWidth * 8 + 31) / 32 * 4 * height);

		int grayPerline = (newWidth * 8 + 31) / 32 * 4;
		for (int i = 0; i <height; i++)
		{

			for (int j = 0; j < newWidth; j++)
			{

				Cmage[(height - 1 - i)*grayPerline + j] = cmykbuf[i*perlines + j * (perlines / width)];
				Mmage[(height - 1 - i)*grayPerline + j] = cmykbuf[i*perlines + j * (perlines / width) + 1];
				Ymage[(height - 1 - i)*grayPerline + j] = cmykbuf[i*perlines + j * (perlines / width) + 2];
				Kmage[(height - 1 - i)*grayPerline + j] = cmykbuf[i*perlines + j * (perlines / width) + 3];


			}
		}



		free(cmykbuf);

		TIFFClose(tif);


 
}

8位灰度图转单色(二值图仅0和255),3级灰度图,后续转为2bit图,进行彩色印刷,打印。如简单的进行阈值二值化,或者通过抖动则效果差很多,以下是挂网后图效果。

1、原始灰度图
在这里插入图片描述
2、3级灰度图 里面包含 0,85,170三个灰度等级
在这里插入图片描述

软件下载测试效果:
https://download.csdn.net/download/janedew/87749577

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐