|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
下面的代码可以将bmp24位图片进行膨胀处理,但仅限于bmp格式和24位色彩模式,请问怎样修改它才能让它直接处理TIF格式的1位色彩模式,或者8位色彩模式的二值图,因为图片比较大的时侯 photoshop没办法保存为bmp格式,只能保存为TIF格式
- #include "pch.h"
- #include "framework.h"
- #include "TTS.h"
- #include "TTSDlg.h"
- #include "afxdialogex.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #endif
- #pragma warning(disable:4996);//出现fopen错误使用此代码
- void CTTSDlg::OnBnClickedButton1()
- {
- int m_nWidth; //图像实际宽度
- int m_nHeight; //图像实际高度
- int m_nDrawWidth; //图像显示宽度
- int m_nDrawHeight; //图像显示高度
- DWORD m_nImage; //图像数据的字节数 只含位图
- DWORD m_nSize; //图像文件大小
- int m_nLineByte; //图像一行所占字节数
- int m_nBitCount; //图像每个像素所占位数
- int m_nPalette; //位图实际使用的颜色表中的颜色数
- CBitmap m_bitmaplin; //创建临时位图对象进行处理
- CString BmpNameLin; //保存图像副本文件
- BYTE* m_pImage; //读入图片数据后的指针
- BITMAPFILEHEADER bfh; //全局变量文件头
- BITMAPINFOHEADER bih; //全局变量信息头
- FILE* fp = fopen("test1.bmp", "rb");
- if (fp == 0)
- {
- AfxMessageBox(_T("无法打开文件!"), MB_OK, 0);
- return;
- }
- //读取文件头 解决BMP格式倒置的方法
- fread(&bfh.bfType, sizeof(WORD), 1, fp);
- fread(&bfh.bfSize, sizeof(DWORD), 1, fp);
- fread(&bfh.bfReserved1, sizeof(WORD), 1, fp);
- fread(&bfh.bfReserved2, sizeof(WORD), 1, fp);
- fread(&bfh.bfOffBits, sizeof(DWORD), 1, fp);
- //图像文件的总字节数
- m_nSize = bfh.bfSize;
- //判断是否是bmp格式图片
- if (bfh.bfType != 0x4d42) //'BM'
- {
- AfxMessageBox(_T("不是BMP格式图片!"), MB_OK, 0);
- return;
- }
- //读取信息头
- fread(&bih.biSize, sizeof(DWORD), 1, fp);
- fread(&bih.biWidth, sizeof(LONG), 1, fp);
- fread(&bih.biHeight, sizeof(LONG), 1, fp);
- fread(&bih.biPlanes, sizeof(WORD), 1, fp);
- fread(&bih.biBitCount, sizeof(WORD), 1, fp);
- fread(&bih.biCompression, sizeof(DWORD), 1, fp);
- fread(&bih.biSizeImage, sizeof(DWORD), 1, fp);
- fread(&bih.biXPelsPerMeter, sizeof(LONG), 1, fp);
- fread(&bih.biYPelsPerMeter, sizeof(LONG), 1, fp);
- fread(&bih.biClrUsed, sizeof(DWORD), 1, fp);
- fread(&bih.biClrImportant, sizeof(DWORD), 1, fp);
- if (bih.biSize != sizeof(bih))
- {
- AfxMessageBox(_T("本结构所占用字节数出现错误"));
- return;
- }
- //位图压缩类型,必须是 0(不压缩) 1(BI_RLE8压缩类型)或2(BI_RLE压缩类型)之一
- if (bih.biCompression == BI_RLE8 || bih.biCompression == BI_RLE4)
- {
- AfxMessageBox(_T("位图被压缩!"));
- return;
- }
- //获取图像高宽和每个像素所占位数
- m_nHeight = bih.biHeight;
- m_nWidth = bih.biWidth;
- m_nDrawHeight = bih.biHeight;
- m_nDrawWidth = bih.biWidth;
- m_nBitCount = bih.biBitCount; //每个像素所占位数
- //计算图像每行像素所占的字节数(必须是32的倍数)
- m_nLineByte = (m_nWidth * m_nBitCount + 31) / 32 * 4;
- //图片大小 调用系统自带的文件头 BITMAPFILEHEADER bfh; BITMAPINFOHEADER bih;
- //否则用 BITMAPFILEHEADER_ bfh; BITMAPINFOHEADER_ bih;要 m_nImage = m_nLineByte * m_nHeight - 2;
- m_nImage = m_nLineByte * m_nHeight;
- //位图实际使用的颜色表中的颜色数 biClrUsed
- m_nPalette = 0; //初始化
- if (bih.biClrUsed)
- m_nPalette = bih.biClrUsed;
- //申请位图空间 大小为位图大小 m_nImage
- //malloc只能申请4字节的空间 (未知)
- m_pImage = (BYTE*)malloc(m_nImage);
- int num;//记录每一行需要填充的字节
- if (m_nWidth * 3 % 4 != 0)
- {
- num = 4 - m_nWidth * 3 % 4;
- }
- else
- {
- num = 0;
- }
- //打开临时的图片
- FILE* fpw = fopen("output.bmp", "wb+");
- fwrite(&bfh, sizeof(BITMAPFILEHEADER), 1, fpw);
- fwrite(&bih, sizeof(BITMAPINFOHEADER), 1, fpw);
- fread(m_pImage, m_nImage, 1, fp);
- unsigned char* ImageSize;
- ImageSize = new unsigned char[m_nImage];
- int x, y, val, xx, yy, temp;
- for (y = 1; y < m_nHeight - 1; y++)
- {
- for (x = 1; x < m_nWidth - 1; x++)//由于使用3*3的结构元素,防止越界,不处理最左边和最右边的的像素
- {
- val = 0;
- for (int j = 0; j < 2; j++)
- {
- yy = y + j - 1;
- for (int i = 0; i < 2; i++)
- {
- xx = x + i - 1;
- if (m_pImage[(xx + yy * m_nWidth) * 3 + yy * num] > val)//因为结构元素都是0,所以原图像中各点与对应结构元素想加还是原图像本身,
- //找和的最大值作为点(x,y)的灰度
- {
- val = m_pImage[(xx + yy * m_nWidth) * 3 + yy * num];
- }
- }
- }
- ImageSize[(x + y * m_nWidth) * 3 + y * num] = unsigned char(val);
- ImageSize[(x + y * m_nWidth) * 3 + y * num + 1] = unsigned char(val);
- ImageSize[(x + y * m_nWidth) * 3 + y * num + 2] = unsigned char(val);
- }
- }
- fwrite(ImageSize, m_nImage, 1, fpw);
- fclose(fp);
- fclose(fpw);
- }
复制代码 |
|