将1bpp的bmp图像存储为1bpp或者2bpp的tiff格式
// 将1bpp的位图转换为 1bit/2bit tiff
/**
参数:BYTE *src 二值图像的像素数据,不包含头部信息, 1bpp, int src_width 原图的宽度, in pixles,int src_height 原图的高度, in pixlesint bpp 转换tiff指定的bpp
*/
static BYTE *BW2Tif(BYTE *src, int src_width, int src_height, int bpp, DWORD& totalSize)
{int dst_width = (bpp == 1) ? src_width : src_width/2;int dst_height = src_height;// get src and dst scan widthint src_pitch = (src_width + 7)/8 + 3 & ~3; int dst_pitch = (dst_width * bpp + 31)/32*4;// get src and dst sizeunsigned int tif_size, bmp_size;if(0x80000000 & dst_height){bmp_size= src_pitch*(0 - src_height);tif_size = dst_pitch*(0 - dst_height);}else{bmp_size = src_pitch*src_height;tif_size = dst_pitch*dst_height;}// Image File Headerconst unsigned char tif_ifh[10]={'I','I', //intel顺序0x2a,0x00, //tiff版本号0x08,0x00,0x00,0x00, //IFD(图形文卷目录 Image File Diretory)偏移, 8个字节0x0F,0x00, // 这两个字节属于IFD了,指定有多少个Directory Entry};// Directory Entry ,每个都是12个字节的 , TIFF 6.0规定,标签要以升序的方式排列unsigned long tif_ifd[0x0f*3+4]={0x000400FE, 0x01, 0x000, // NewSubfileType, 0x00030100, 0x01, 0x018, // ImageWidth,The number of columns in the image, i.e., the number of pixels per scanline0x00030101, 0x01, 0x018, // ImageLength, The number of rows (sometimes described as scanlines) in the image.0x00030102, 0x01, bpp, // BitPerSample 2580x00030103, 0x01, 0x001, // Compression, 1无压缩0x00030106, 0x01, 0x000, // PhotometricInterpretation, 对于bilevel图像,值0=WhiteIsZero,1=BlackIsZero0x00040111, 0x01, 0x0CE, // StripOffsets,For each strip, the byte offset of that strip, // N = StripsPerImage for PlanarConfiguration equal to 1; // N = SamplesPerPixel * StripsPerImage for PlanarConfiguration equal to 2// 从字面上看来, StripOffsets是个数组,小于64kb, 这里是0xce, 就是头部的206个字节了0x00030112, 0x01, 0x001, // Orientation0x00030115, 0x01, 0x001, // SamplesPerPixel0x00030116, 0x01, 0xffff, // RowsPerStrip, The number of rows in each strip (except possibly the last strip.)// RowsPerStrip and ImageLength together tell us the number of strips in the entire image. default is 2^32-1, 推荐每个strip是8k数据// image. The equation is: StripsPerImage= floor ((ImageLength + RowsPerStrip - 1) / RowsPerStrip).0x00040117, 0x01, 0x07F, // StripByteCounts0x0005011A, 0x01, 0x0BE, // XResolution0x0005011B, 0x01, 0x0C6, // YResolution0x0003011C, 0x01, 0x001, // PlanarConfiguration , 1是单平面格式, 2多平面格式0x00030128, 0x01, 0x002, // ResolutionUnit, 0x002 = inch0x60031280, 0x01000000, // X分辨率ofset=1640x60031280, 0x01000000, // Y分辨率ofset=16C};//tif_ifd[ 5] = dst_width;tif_ifd[ 8] = dst_height;tif_ifd[29] = (tif_size + 0x0f) & 0xfffffff0; // 简单的做成一个striptif_ifd[32] = tif_size;// allocate dst image hpglunsigned int total_size = sizeof(tif_ifh) + sizeof(tif_ifd) + tif_size;TRACE1("tiff size=0x%x\n", sizeof(tif_ifh) + sizeof(tif_ifd));BYTE *dst = new BYTE[total_size];if(NULL == dst) return FALSE;BYTE *curr = dst;totalSize = total_size;// memcpy(curr, tif_ifh, sizeof(tif_ifh));curr += sizeof(tif_ifh);memcpy(curr, tif_ifd, sizeof(tif_ifd));curr += sizeof(tif_ifd);// 当src图像的宽度是整数个字节的时候,可以直接复制数据,如果多出几个bit,就不好搞了//memcpy(curr, src, tif_size);// gray2bmp_to_tif.c 中程序,是把每个像素用一个字节来存储了,而这里不是的// 所以不能照着写程序了int width_align = src_width & 0xffffFFF8;int nBytes = width_align/8;if (src_width - width_align) // 有边角bit位nBytes += 1;LPBYTE src2 = src; LPBYTE dst2 = curr;int x,y;for (y = 0; y < src_height; y++){src2 = src + y * src_pitch;dst2 = curr + y * nBytes; //写入tiff的数据流,不要自己补充空白数据memcpy(dst2, src2, nBytes);src2 += nBytes;dst2 += nBytes;}return dst;
}// 这个是测试代码
void CPagePt::OnBnClickedButtonCv()
{CFileDialog fd(TRUE, _T("bmp"), NULL, NULL, _T("All files(*.*)|*.*|Wibdows Bitmap(*.bmp)|*.bmp||"));if(fd.DoModal() != IDOK)return;CString filename = fd.GetPathName();HBITMAP hImage = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP,0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_DEFAULTSIZE);//CBitmap* m_Bitmap = CBitmap::FromHandle(hImage);BITMAP bm; //获取位图信息 GetObject(hImage, sizeof(BITMAP), &bm); // Sumit: memory allocation is still 1800x1800 in your code..BYTE* bmpBuffer=(BYTE*)bm.bmBits; // GlobalAlloc(GPTR, bm.bmWidthBytes * bm.bmHeight); //allocate memoryDWORD tifSize;BYTE *tif = BW2Tif(bmpBuffer, bm.bmWidth, bm.bmHeight, 2, tifSize);CFile cf("C:\\bw2tif_out.tif", CFile::modeCreate | CFile::modeWrite);cf.Write(tif, tifSize);cf.Close();delete tif;}
将1bpp的bmp图像存储为1bpp或者2bpp的tiff格式相关推荐
- DICOM医学图像处理:DICOM存储操作之“多幅BMP图像数据存入DCM文件”
背景: 本专栏"DICOM医学图像处理"受众较窄,起初只想作为自己学习积累和工作经验的简单整理.前几天无聊浏览了一下,发现阅读量两极化严重,主要集中在"关于BMP(JPG ...
- 9.1 图像处理的基本概念(图像读入、图像信息查询、图像显示和图像存储)
1.图像读入 函数:imread 功能:读入图像数据 格式:I = imread('filename'):filename指定图像文件的完整路径和文件名:如果在搜索目录下,只需提供文件名 例1:假设b ...
- 【转】BMP图像文件格式
5.1 BMP图像文件格式 BMP图像文件格式是游戏中常用的图像资源文件格式,BMP图像文件起源早,程序员对BMP都比较熟悉,再加上BMP格式简单,读取和写入非常容易实现,所以无论Windows的还 ...
- BMP图像文件格式分析附带图解
From: http://www.raidcn.com/js/BMPTuXiangWenJianGeShiFenXiFuDaiTuJie.html 认识BMP文件格式,以及bmp文件存储结构 ,通过w ...
- C语言(二)BMP图像 文本数据保存为图像
BMP图像数据处理 申请空间读取像素数据 读取TXT文本数据,并保存为图像 读取图片,并将数据存入数组 参考 申请空间读取像素数据 使用VS2015连续读取TXT文本数据时,如果申请数组过大时,会导致 ...
- C语言读取bmp图像
BMP图像编码 BMP即bitmap,也就是位图,一般由4部分组成:文件头信息块.图像描述信息块.颜色表(在真彩色模式无颜色表)和图像数据区. 在图像数据之前,如图所示,共有54位数据 其中,0x42 ...
- BMP图像的读写处理
最近一段时间我学习了计算机图像处理这门课程,通过这门课程的学习,我了解到了图片具有灰度和彩色的区别,并且通过具体的代码可以将一些图片数据进行读写与转化. 第一部分:BMP图像的读写 1.BMP图像的读 ...
- 多媒体技术与应用实验——BMP图像Huffman(霍夫曼)编解码
编译器是CLion,代码是C的,但是保存为.c的时候没能通过,保存为.cpp才能运行. //Bmp图像的哈夫曼编码代码 #include <stdio.h> #include <st ...
- 图像存储方式及使用OpenCV简单处理图像
一.目的 简述图像存储方式及使用OpenCV简单处理图像. 二.图像存储方式 2.1.YUV 2.1.1.简介 YUV是编译true-color颜色空间(color space)的种类,Y'UV, Y ...
最新文章
- LambdaMART的思想
- python中通过元类(TYPE)简单实现对象关系映射(ORM)
- php5.3+for+linux,Centos 安装 nginx + php5.3
- C ++ 指针 | 指针与字符_4
- 职业学校计算机知识试卷答案,2016中等职业学校计算机等级考试题库(含答案)计算机基础题库...
- 内存分析工具 MAT 的使用
- python通过函数类属性_函数作为类属性的赋值如何成为Python中的一个方法?
- how to solve undefined reference in igllib
- 深入了解clientXY,offsetXY,pageXY的区别
- RStudio的下载与安装
- 2022年最新的百度云盘在线倍速播放实践可用
- wfGo 围棋 联机对战模式
- Allergo 无法修改单位
- 计算机能力怎么填制作ppt,电脑怎么制作PPT
- win10卸载vivado
- quickBI嵌入自研系统
- 32位的md5校验程序
- 面试最后我一般会问面试官什么问题
- [Python] [邮件发送] 用Python的smtplib和email库进行邮件发送
- form表单提交且接口回调显示提交成功
热门文章
- 保存cisco设备配置
- [linux] 查看网络丢包信息
- aix和linux脚本,AIX系统资源监控SHELL脚本
- textarea 通过 json在各浏览器的显示回车换行的问题
- git push 的符号笔有什么用_Git 标签(tag)作用、分支区别及常用命令
- quartus怎么仿真波形_单相半波可控整流电路电阻负载的Matlab Simulink仿真
- 存储1m图像错误_【1m 讲堂】“跨专业挑战空调施工常见错误,你敢来参加吗?”...
- python画熊猫论文_Python数据可视化之美:专业图表绘制指南(全彩)
- Aroma's Search(暴力)
- php长传文件到数据库,php上传文件并存储到mysql数据库的简单示例