#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);
}