// 将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格式相关推荐

  1. DICOM医学图像处理:DICOM存储操作之“多幅BMP图像数据存入DCM文件”

    背景: 本专栏"DICOM医学图像处理"受众较窄,起初只想作为自己学习积累和工作经验的简单整理.前几天无聊浏览了一下,发现阅读量两极化严重,主要集中在"关于BMP(JPG ...

  2. 9.1 图像处理的基本概念(图像读入、图像信息查询、图像显示和图像存储)

    1.图像读入 函数:imread 功能:读入图像数据 格式:I = imread('filename'):filename指定图像文件的完整路径和文件名:如果在搜索目录下,只需提供文件名 例1:假设b ...

  3. 【转】BMP图像文件格式

    5.1  BMP图像文件格式 BMP图像文件格式是游戏中常用的图像资源文件格式,BMP图像文件起源早,程序员对BMP都比较熟悉,再加上BMP格式简单,读取和写入非常容易实现,所以无论Windows的还 ...

  4. BMP图像文件格式分析附带图解

    From: http://www.raidcn.com/js/BMPTuXiangWenJianGeShiFenXiFuDaiTuJie.html 认识BMP文件格式,以及bmp文件存储结构 ,通过w ...

  5. C语言(二)BMP图像 文本数据保存为图像

    BMP图像数据处理 申请空间读取像素数据 读取TXT文本数据,并保存为图像 读取图片,并将数据存入数组 参考 申请空间读取像素数据 使用VS2015连续读取TXT文本数据时,如果申请数组过大时,会导致 ...

  6. C语言读取bmp图像

    BMP图像编码 BMP即bitmap,也就是位图,一般由4部分组成:文件头信息块.图像描述信息块.颜色表(在真彩色模式无颜色表)和图像数据区. 在图像数据之前,如图所示,共有54位数据 其中,0x42 ...

  7. BMP图像的读写处理

    最近一段时间我学习了计算机图像处理这门课程,通过这门课程的学习,我了解到了图片具有灰度和彩色的区别,并且通过具体的代码可以将一些图片数据进行读写与转化. 第一部分:BMP图像的读写 1.BMP图像的读 ...

  8. 多媒体技术与应用实验——BMP图像Huffman(霍夫曼)编解码

    编译器是CLion,代码是C的,但是保存为.c的时候没能通过,保存为.cpp才能运行. //Bmp图像的哈夫曼编码代码 #include <stdio.h> #include <st ...

  9. 图像存储方式及使用OpenCV简单处理图像

    一.目的 简述图像存储方式及使用OpenCV简单处理图像. 二.图像存储方式 2.1.YUV 2.1.1.简介 YUV是编译true-color颜色空间(color space)的种类,Y'UV, Y ...

最新文章

  1. LambdaMART的思想
  2. python中通过元类(TYPE)简单实现对象关系映射(ORM)
  3. php5.3+for+linux,Centos 安装 nginx + php5.3
  4. C ++ 指针 | 指针与字符_4
  5. 职业学校计算机知识试卷答案,2016中等职业学校计算机等级考试题库(含答案)计算机基础题库...
  6. 内存分析工具 MAT 的使用
  7. python通过函数类属性_函数作为类属性的赋值如何成为Python中的一个方法?
  8. how to solve undefined reference in igllib
  9. 深入了解clientXY,offsetXY,pageXY的区别
  10. RStudio的下载与安装
  11. 2022年最新的百度云盘在线倍速播放实践可用
  12. wfGo 围棋 联机对战模式
  13. Allergo 无法修改单位
  14. 计算机能力怎么填制作ppt,电脑怎么制作PPT
  15. win10卸载vivado
  16. quickBI嵌入自研系统
  17. 32位的md5校验程序
  18. 面试最后我一般会问面试官什么问题
  19. [Python] [邮件发送] 用Python的smtplib和email库进行邮件发送
  20. form表单提交且接口回调显示提交成功

热门文章

  1. 保存cisco设备配置
  2. [linux] 查看网络丢包信息
  3. aix和linux脚本,AIX系统资源监控SHELL脚本
  4. textarea 通过 json在各浏览器的显示回车换行的问题
  5. git push 的符号笔有什么用_Git 标签(tag)作用、分支区别及常用命令
  6. quartus怎么仿真波形_单相半波可控整流电路电阻负载的Matlab Simulink仿真
  7. 存储1m图像错误_【1m 讲堂】“跨专业挑战空调施工常见错误,你敢来参加吗?”...
  8. python画熊猫论文_Python数据可视化之美:专业图表绘制指南(全彩)
  9. Aroma's Search(暴力)
  10. php长传文件到数据库,php上传文件并存储到mysql数据库的简单示例