#include <cv.h>
#include <highgui.h>
#include <iostream>
//#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <fstream>
#include<opencv2/opencv.hpp>

//必须得加上,才可以使用imread、MAT等opencv功能
using namespace cv;
using namespace std;

#pragma pack(2)//必须得写,否则sizeof得不到正确的结果
typedef unsigned char  BYTE;
typedef unsigned short WORD;
typedef unsigned long  DWORD;
typedef long  LONG;

typedef struct {
WORD    bfType;
DWORD   bfSize;
WORD    bfReserved1;
WORD    bfReserved2;
DWORD   bfOffBits;
} BITMAPFILEHEADER;

typedef struct {
DWORD      biSize;
LONG       biWidth;
LONG       biHeight;
WORD       biPlanes;
WORD       biBitCount;
DWORD      biCompression;
DWORD      biSizeImage;
LONG       biXPelsPerMeter;
LONG       biYPelsPerMeter;
DWORD      biClrUsed;
DWORD      biClrImportant;
} BITMAPINFOHEADER;

typedef struct tagPALETTEENTRY { // pe

// bmp中RGB的存放顺序是BGR,如果此处不写对的话,颜色会错

BYTE peBlue;
BYTE peRed;
BYTE peGreen;
BYTE peFlags;
} PALETTEENTRY;

//void saveBitmap()
int main()
{
//FILE *fptest = fopen("F:/Desktop/写bmp/test.bmp", "wb+");
//if (fptest == NULL)
//{
// printf("file open failed.");
// exit(1);
//}
//BYTE *test = (BYTE *)malloc(8);
//test[0] = 255;
//test[1] = 128;
//test[2] = 0;
//test[3] = 255;
//test[4] = 255;
//test[5] = 255;
//test[6] = 255;
//test[7] = 255;

//fwrite(test, 8, 1, fptest);
//fclose(fptest);

//原来图片的大小
Mat KH = imread("F:/Desktop/写bmp/1KH.tif", 0);
Mat KL = imread("F:/Desktop/写bmp/1KL.tif", 0);
Mat CH = imread("F:/Desktop/写bmp/2CH.tif", 0);
Mat CL = imread("F:/Desktop/写bmp/2CL.tif", 0);
Mat MH = imread("F:/Desktop/写bmp/3MH.tif", 0);
Mat ML = imread("F:/Desktop/写bmp/3ML.tif", 0);
Mat YH = imread("F:/Desktop/写bmp/4YH.tif", 0);
Mat YL = imread("F:/Desktop/写bmp/4YL.tif", 0);

//CMYK四分色片
    //Mat KH = imread("F:/Desktop/写bmp/K.tif", 0);
    //Mat KL = imread("F:/Desktop/写bmp/K.tif", 0);
    //Mat CH = imread("F:/Desktop/写bmp/C.tif", 0);
    //Mat CL = imread("F:/Desktop/写bmp/C.tif", 0);
    //Mat MH = imread("F:/Desktop/写bmp/M.tif", 0);
    //Mat ML = imread("F:/Desktop/写bmp/M.tif", 0);
    //Mat YH = imread("F:/Desktop/写bmp/Y.tif", 0);
    //Mat YL = imread("F:/Desktop/写bmp/Y.tif", 0);

int origin_row = MH.rows;//原图高(有多少行点)
int origin_col = MH.cols;//原图宽(有多少列点)
int col;

// Write to file
FILE *fp = fopen("F:/Desktop/写bmp/0707_test2.bmp", "wb+");
if (fp == NULL)
{
printf("file open failed.");
exit(1);
}

// Define BMP Size
const int height = origin_row;//高度:单位是像素
const int width = origin_col; //宽度:单位是像素,biWidth必须是4的倍数
const int BitPerPixel = 8;//用n位来表示每个像素点,n=1时8个像素占一个字节,n=4时两个像素一个字节,n=8时一个像素一个字节
  /*Windows规定一个扫描行所占的字节数必须是4的倍数,不足的用0去填补*/
  //一个扫描行所占的字节数:
int DataSizePerLine = (width * BitPerPixel + 31) / 8;
DataSizePerLine = DataSizePerLine / 4 * 4;
const int size = DataSizePerLine * height;//图像的大小:单位是位
  //const int size = height * width * BitPerPixel;//图像的大小

//参数设置:https://blog.csdn.net/lanbing510/article/details/8176231
  //程序主体:https://blog.csdn.net/kupepoem/article/details/43307387
  //调色板:https://blog.csdn.net/szlcw1/article/details/16891359
  //8位位深程序体参考:https://blog.csdn.net/jonahzheng/article/details/8029870
  /****************** Part.1 Create Bitmap File Header(bmp文件头)******************/

BITMAPFILEHEADER fileHeader;
fileHeader.bfType = 0x4D42;//说明文件的类型,该值必需是0x4D42,也就是字符'BM',否则表示根本不是BMP
fileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(PALETTEENTRY) * 256 + size;
//fileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + size;
//说明该位图文件的总的大小,单位为字节
fileHeader.bfReserved1 = 0;//保留,必须设置为0
fileHeader.bfReserved2 = 0;//保留,必须设置为0
fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(PALETTEENTRY) * 256;
//fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
//说明从文件头开始到实际的图象数据之间的字节的偏移量。
//这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。

fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, fp);

/******************* Part.2 Create Bitmap Info Header(位图信息段)******************/

BITMAPINFOHEADER bitmapHeader = { 0 };
bitmapHeader.biSize = sizeof(BITMAPINFOHEADER);//说明BITMAPINFOHEADER结构所需要的字节数
bitmapHeader.biWidth = width;//说明图象的宽度,以像素为单位。
bitmapHeader.biHeight = -height;//说明图象的高度,以象素为单位。
//如果height值是一个正数,说明图像是倒向的,即:数据的第一行其实是图像的最后一行,如果该值是一个负数,则说明图像是正向的。
bitmapHeader.biPlanes = 1;//表示bmp图片的平面属,显然显示器只有一个平面,所以恒等于1
bitmapHeader.biBitCount = BitPerPixel;//比特数/像素,每个像素点用几位来表示,其值为1、4、8、16、24、或32。
bitmapHeader.biCompression = 0; //BI_RGB没有压缩
bitmapHeader.biSizeImage = size;
//图象数据的大小,按照bit/像素*像素=bit,再除以8,得到图像大小的字节数
//以字节为单位。当用BI_RGB格式时,可设置为0。
//bitmapHeader.biXPelsPerMeter = 360 / 25.4 * 1000;//说明水平分辨率,用像素/米表示。
//bitmapHeader.biYPelsPerMeter = 400 / 25.4 * 1000;//说明垂直分辨率,用像素/米表示。
bitmapHeader.biClrUsed = 0; //实际使用的彩色表中的颜色索引数,设为0表示使用所有的调色板项。
bitmapHeader.biClrImportant = 0; //有重要影响的颜色索引数,设为0的时候表示都重要。
fwrite(&bitmapHeader, sizeof(BITMAPINFOHEADER), 1, fp);

int size_bitmapfileheader = sizeof(BITMAPFILEHEADER);
int size_bitmapinfoheader = sizeof(BITMAPINFOHEADER);
int size_palettentry = sizeof(PALETTEENTRY);
/************************ Part.3 Create PALETTEENTRY****************************/
//typedef struct tagPALETTEENTRY { // pe 
// BYTE peRed;
// BYTE peGreen;
// BYTE peBlue;
// BYTE peFlags;
//} PALETTEENTRY;

PALETTEENTRY paletteentry[256];
for (int k = 0; k < 256; k++)
{
int red;
int green;
int blue;
if (k <= 0)
{
red = 255;
green = 255;
blue = 255;
}
else if (k <= 3)
{
red = 255;
green = 241;
blue = 0;
}
else if (k <= 12)
{
red = 228;
green = 0;
blue = 127;
}
else if (k <= 15)
{
red = 230;
green = 0;
blue = 18;
}
else if (k <= 48)
{
red = 0;
green = 160;
blue = 233;
}
else if (k <= 51)
{
red = 0;
green = 153;
blue = 68;
}
else if (k <= 60)
{
red = 29;
green = 32;
blue = 136;
}
else if (k <= 63)
{
red = 31;
green = 49;
blue = 52;
}
else if (k <= 192)
{
red = 35;
green = 24;
blue = 21;
}
else if (k <= 195)
{
red = 34;
green = 27;
blue = 0;
}
else if (k <= 204)
{
red = 30;
green = 0;
blue = 1;
}
else if (k <= 207)
{
red = 32;
green = 0;
blue = 1;
}
else if (k <= 240)
{
red = 0;
green = 1;
blue = 34;
}
else if (k <= 243)
{
red = 0;
green = 3;
blue = 0;
}
else if (k <= 252)
{
red = 0;
green = 0;
blue = 5;
}
else if (k <= 255)
{
red = 0;
green = 0;
blue = 0;
}
paletteentry[k].peRed = red;
paletteentry[k].peGreen = green;
paletteentry[k].peBlue = blue;
paletteentry[k].peFlags = 0;
fwrite(&paletteentry[k], 4, 1, fp);
}

/************************ Part.4 Create Data****************************/
//fwrite(%获取数据的变量地址,写入数据项为几个字节大小size,数据项的个数 n,文件)
//int a = KH.rows;
//int b = KH.cols;
//int c = row;
//int d = col;
//成功的:.at<uchar>要小于这个数 KH.rows-1, KH.cols-1
//int bb = KH.at<uchar>(KH.rows-1, KH.cols-1) / 255;

//const int size = height * width * BitPerPixel;//图像的大小:单位是位
BYTE *bits = (BYTE *)malloc(size);
// Clear
//memset(bits, 0xFF, size);
int count = 0;
for (int q = 0;q < height;q++)
{
for (int w = 0;w < DataSizePerLine;w++)
{
//DataSizePerLine

if (w < width) {
int n7 = !(KH.at<uchar>(q, w) / 255);
int n6 = !(KL.at<uchar>(q, w) / 255);
int n5 = !(CH.at<uchar>(q, w) / 255);
int n4 = !(CL.at<uchar>(q, w) / 255);
int n3 = !(MH.at<uchar>(q, w) / 255);
int n2 = !(ML.at<uchar>(q, w) / 255);
int n1 = !(YH.at<uchar>(q, w) / 255);
int n0 = !(YL.at<uchar>(q, w) / 255);
bits[count++] = n7 * pow(2, 7) + n6 * pow(2, 6) + n5 * pow(2, 5) + n4 * pow(2, 4) + n3 * pow(2, 3) + n2 * pow(2, 2) + n1 * pow(2, 1) + n0 * pow(2, 0);
}
else
bits[count++] = 0;
}
}
fwrite(bits, size, 1, fp);
fclose(fp);
return 0;
}

C++:将六个tif分色片写成bmp格式图片(8位深)相关推荐

  1. bmp文件格式_一次性解决CAD转换成BMP格式图片的问题

    关于BMP格式图片,可能很多小伙伴都遇到得比较多,但在这里还是稍微解释一下吧. 它是Windows操作系统中的标准图像文件格式,大家都知道BMP格式的图片都非常大,那是因为它没有经过任何压缩. 当然, ...

  2. 医疗dcm格式图像解析成bmp格式图片

    医疗拍摄的dcm格式图像一般不能直观的给我们展示出来,需要使用程序对里面的元素进行解析.一般我们用ViewPersonal软件来查看dcm格式的图像. dcm格式图像解析过程一般如有图所示: 其中dc ...

  3. tif怎么转成jpg格式?

    tif怎么转成jpg格式?最近很多小伙伴都遇到了这个问题.图片的格式有很多种,tif是其中很特殊的一种,也是不常用的一种图片格式.因为绝大多数的系统和设备支持打开的图片格式,还是以jpg和png这两种 ...

  4. web怎么将dwg转换图片_怎么将DWG图纸转换成JPG格式图片

    AutoDWG DWG to Image Converter是一款好用的电脑DWG文档格式转换工具.使用AutoDWG DWG to Image Converter可以轻松将电脑中的DWG图纸转换成J ...

  5. 基于MuPDF库实现PDF文件转换成PNG格式图片

    背景 之所以会接触MuPDF是因为,有位群友在Q群里提问,如何将PDF保存为.PNG图片格式.我一看到这个问题,就蒙了,因为我没有接触过类似的项目或程序.但是,作为一群之主的我,还是要给初学者一个答复 ...

  6. 如何快速地将jpg转成bmp格式

    如果将jpg转成bmp格式呢?我们日常办公中常见的图片格式以jpg和png为主,很多其他图片格式类似tif,bmp等很少用到,今天我们来讲一讲bmp格式的图片. bmp是Bitmap(位图)的缩写,它 ...

  7. java如何把png转换成jpg_Java实现将png格式图片转换成jpg格式图片的方法【测试可用】...

    Java实现将png格式图片转换成jpg格式图片的方法[测试可用] 发布于 2020-4-9| 复制链接 摘记: 本文实例讲述了Java实现将png格式图片转换成jpg格式图片的方法.分享给大家供大家 ...

  8. cad转图片,cad图纸该如何转换成svg格式图片呢?

    CAD转SVG格式图片非 常实 用方便,优点是可以让用户直接用代码来描绘图像,而且用任 何文字处理工具都可以打开SVG图像.CAD制图工作中,我们需要把CAD转换成图片.cad图纸该如何转换成svg格 ...

  9. 使用java将word文档docx,doc(包含图形,文本框)完美转换成所有格式图片(pdf,png,gif,jpeg等等)

    使用java将word文档docx,doc(包含图形,文本框,图片等)完美转换成所有格式图片(pdf,png,gif,jpeg等等)下文中附带代码,效果图等 思路 使用到的包 实现代码 效果图: 思路 ...

最新文章

  1. 8086为什么不用c语言,现代汇编教材还是基于8086,对理解当今CPU(如i9)有帮助吗,还是教程太滞...
  2. 轻量级图卷积网络LightGCN介绍和构建推荐系统示例
  3. 服务行为 之 并发与实例化
  4. 【渝粤教育】国家开放大学2018年秋季 0273-22T中国现代文学 参考试题
  5. vue弹出层滑动禁止背景跟着滑动_vue移动端弹起蒙层滑动禁止底部滑动操作
  6. Azure 中国篇之网络服务—(2)Azure虚拟机使用公网ip(PIP)
  7. 湖南联通云计算与IDC掀发展浪潮
  8. html网页中加入音乐播放器,HTML网页调用 网易云 音乐播放器代码
  9. 解决谷歌浏览器安装插件失败:无法从该网站添加应用、扩展程序和用户脚本
  10. android 禁用home键
  11. mysql 进行加减乘除运算,mysql加减乘除
  12. Linux Ubuntu输入法安装设置及中文字体安装
  13. 并行网络测试软件,并行程序测试
  14. 用互动的方式打开“11月全国气象短视频(快手、抖音)影响力榜单“
  15. 智慧工地无线覆盖重点产品人员定位和移动考勤
  16. 第四天:关看门狗、设置栈、控制icache、重定位、链接脚本
  17. 电子科技大学软件工程860考研上岸初试经验分享
  18. wps怎么统一修改标点符号_Word2010中如何统一修改标点符号的字体格式?
  19. 迅视财经 设计牵手“黑科技”
  20. 快速完成小程序转App的方法

热门文章

  1. 还记得这些常用String方法吗?
  2. 先序序列和中序序列构造二叉树,中序序列和后序序列构造二叉树
  3. php 网站计数器,php网站计数器
  4. 微软平台程序员的悲哀
  5. Shading中的插值技术
  6. 前端大屏适配几种方案
  7. 脱离标准流(1)浮动
  8. 我打碎了夕阳开头...
  9. 汉语中的 熟语中的成语900个
  10. Python连接postgresql数据库入门