C++:将六个tif分色片写成bmp格式图片(8位深)
#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位深)相关推荐
- bmp文件格式_一次性解决CAD转换成BMP格式图片的问题
关于BMP格式图片,可能很多小伙伴都遇到得比较多,但在这里还是稍微解释一下吧. 它是Windows操作系统中的标准图像文件格式,大家都知道BMP格式的图片都非常大,那是因为它没有经过任何压缩. 当然, ...
- 医疗dcm格式图像解析成bmp格式图片
医疗拍摄的dcm格式图像一般不能直观的给我们展示出来,需要使用程序对里面的元素进行解析.一般我们用ViewPersonal软件来查看dcm格式的图像. dcm格式图像解析过程一般如有图所示: 其中dc ...
- tif怎么转成jpg格式?
tif怎么转成jpg格式?最近很多小伙伴都遇到了这个问题.图片的格式有很多种,tif是其中很特殊的一种,也是不常用的一种图片格式.因为绝大多数的系统和设备支持打开的图片格式,还是以jpg和png这两种 ...
- web怎么将dwg转换图片_怎么将DWG图纸转换成JPG格式图片
AutoDWG DWG to Image Converter是一款好用的电脑DWG文档格式转换工具.使用AutoDWG DWG to Image Converter可以轻松将电脑中的DWG图纸转换成J ...
- 基于MuPDF库实现PDF文件转换成PNG格式图片
背景 之所以会接触MuPDF是因为,有位群友在Q群里提问,如何将PDF保存为.PNG图片格式.我一看到这个问题,就蒙了,因为我没有接触过类似的项目或程序.但是,作为一群之主的我,还是要给初学者一个答复 ...
- 如何快速地将jpg转成bmp格式
如果将jpg转成bmp格式呢?我们日常办公中常见的图片格式以jpg和png为主,很多其他图片格式类似tif,bmp等很少用到,今天我们来讲一讲bmp格式的图片. bmp是Bitmap(位图)的缩写,它 ...
- java如何把png转换成jpg_Java实现将png格式图片转换成jpg格式图片的方法【测试可用】...
Java实现将png格式图片转换成jpg格式图片的方法[测试可用] 发布于 2020-4-9| 复制链接 摘记: 本文实例讲述了Java实现将png格式图片转换成jpg格式图片的方法.分享给大家供大家 ...
- cad转图片,cad图纸该如何转换成svg格式图片呢?
CAD转SVG格式图片非 常实 用方便,优点是可以让用户直接用代码来描绘图像,而且用任 何文字处理工具都可以打开SVG图像.CAD制图工作中,我们需要把CAD转换成图片.cad图纸该如何转换成svg格 ...
- 使用java将word文档docx,doc(包含图形,文本框)完美转换成所有格式图片(pdf,png,gif,jpeg等等)
使用java将word文档docx,doc(包含图形,文本框,图片等)完美转换成所有格式图片(pdf,png,gif,jpeg等等)下文中附带代码,效果图等 思路 使用到的包 实现代码 效果图: 思路 ...
最新文章
- 8086为什么不用c语言,现代汇编教材还是基于8086,对理解当今CPU(如i9)有帮助吗,还是教程太滞...
- 轻量级图卷积网络LightGCN介绍和构建推荐系统示例
- 服务行为 之 并发与实例化
- 【渝粤教育】国家开放大学2018年秋季 0273-22T中国现代文学 参考试题
- vue弹出层滑动禁止背景跟着滑动_vue移动端弹起蒙层滑动禁止底部滑动操作
- Azure 中国篇之网络服务—(2)Azure虚拟机使用公网ip(PIP)
- 湖南联通云计算与IDC掀发展浪潮
- html网页中加入音乐播放器,HTML网页调用 网易云 音乐播放器代码
- 解决谷歌浏览器安装插件失败:无法从该网站添加应用、扩展程序和用户脚本
- android 禁用home键
- mysql 进行加减乘除运算,mysql加减乘除
- Linux Ubuntu输入法安装设置及中文字体安装
- 并行网络测试软件,并行程序测试
- 用互动的方式打开“11月全国气象短视频(快手、抖音)影响力榜单“
- 智慧工地无线覆盖重点产品人员定位和移动考勤
- 第四天:关看门狗、设置栈、控制icache、重定位、链接脚本
- 电子科技大学软件工程860考研上岸初试经验分享
- wps怎么统一修改标点符号_Word2010中如何统一修改标点符号的字体格式?
- 迅视财经 设计牵手“黑科技”
- 快速完成小程序转App的方法