图像处理小节
来源:互联网 发布:怎么在淘宝上卖lol号 编辑:程序博客网 时间:2024/06/03 14:55
图像数字化的精度包括两部分,即分辨率和颜色的深度。
分辨率指数字化的空间精细程度,有显示分辨率和图像分辨率两种不同的分辨率。
数字图像的颜色深度表示每一像素的颜色值所占的二进制位数。颜色深度越大则能表示的颜色数目越多。颜色深度不同,就产生不同种类的图像文件,在计算机种常用的图像文件:
1 单色图像(每个像素点仅占一位)
2 灰度图像(每个像素点占8位)
3 伪彩色图像(每个像素点占8位)
4 24位彩色图像(每个像素占24位)
DIB.h
#ifndef __CDIB_H
#define __CDIB_H
class CDib:public CObject
{
public:
RGBQUAD* m_pRGB;
BYTE* m_pData;
UINT m_numberOfColors;
BOOL m_valid;
BITMAPFILEHEADER bitmapInfoHeader;
BITMAPINFO* m_pBitmapInfo;
BYTE *pDib;
DWORD size;
public:
CDib();
~CDib();
char m_fileName[256];
char* GetFileName();
BOOL IsValid();
DWORD GetSize();
UINT GetWidth();
UINT GetHeight();
UINT GetNumberOfColors();
RGBQUAD* GetRGB();
BYTE* GetRGB();
BYTE* GetData();
BITMAPINFO* GetInfo();
WORD PaletteSize(LPBYTE lpDIB);
WORD DIBNumColors(LPBYTE lpDIB);
void SaveFile(const CString filename);
public:
void LoadFile(const char* dibFileName);
};
#endif
DIB.CPP文件
#include "DIB.h"
#include "windowsx.h"
CDib::CDib()
{
size=0;
}
CDib::~CDib()
{
GlobalFreePtr(m_bBitmapInfo);
}
void CDib::LoadFile(const char *dibFileName)
{
strcpy(m_fileName,dibFileName);
CFile dibFile(m_fileName,CFile::mdeRead);
dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
if(bitmapFileHeader.bfType==0x4d42)//BM
{
DWORD fileLength=dibFile.GetLength();
size=fileLength-sizeof(BITMAPFILEHEADER);
pDib=(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE,size);
dibFile.Read((void*)pDib,size);
dibFile.Close();
m_pBitmapInfo=(BITMAPINFO*)pDib;
m_pBitmapInfoHeader=(BITMAPINFOHEADER*)pDib;
m_pRGB=(RGBQUAD*)(pDib+m_pBitmapInfoHeader->biSize);
int m_numberOfColors=GetNumberOfColors();
if(m_pBitmapInfoHeader->biClrUsed==0)
m_pBitmapInfoHeader->biClrUsed=m_numberOfColors
DWORD colorTableSize=m_numberOfColors*sizeof(RGBQUAD);
m_pData=pDib+m_pBitmapInfoHeaader->biSize+colorTableSize;
if(m_pRGB==(RGBQUAD*)m_pData)//no color table
m_pRGB=NULL;
m_pBitmapInfoHeader->biSizeImage=GetSize();
m_valid=TRUE;
}
else
{
m_valid=FALSE;
AfxMessageBox("This isn't a bitmap file!");
}
}
BOOL CDib::IsValid()
{
return m_valid;
}
char *CDib::GetFileName()
{
return m_fileName;
}
UINT CDib::GetWidth()
{
return (UINT)m_pBitmapInfoHeader->biWidh;
}
UINT CDib::GetHeight()
{
return (UINT)m_pBitmapInfoHeader->biHeight;
}
DWORD CDib::GetSize()
{
if(m_pBitmapInfoHeader->biSizeImage!=0)
return m_pBitmapInfoHeader->biSizeImage;
else
{
DWORD height=(DWORD)GetHeight();
DWORD width=(DWORD)GetWidth();
return height*width;
}
}
UINT CDib::GetNumberOfColors()
{
int numberOfColors;
if((m_pBitmapInfoHeader->biClrUsed==0) &&
(m_pBitmapInfoHeader->biBitCount<9))
{
switch(m_pBitmapInfoHeader->biBitCount)
{
case 1:
numberOfColors=2;break;
case 4:
numberOfColors=16;break;
case 8:
numberOfColors=256;break;
}
}
else
numberOfColors=(int)m_pBitmapInfoHeader->biClrUsed;
return numberOfColors;
}
BYTE *CDib::GetData()
{
return m_pData;
}
RGBQUAD* CDib::GetRGB()
{
return m_pRGB;
}
BITMAPINFO* CDib::GetInfo()
{
return m_pBitmapInfo;
}
WORD CDib::PaletteSize(LPBYTE lpDIB)
{
return (DIBNumColors(lpDIB)*sizeof(RGBTRIPLE));
}
WORD CDib::DIBNumColors(LPBYTE lpDIB)
{
WORD wBitCount;
wBitCount=((LPBITMAPCOREHEADER)lpDIB)->bcBitCount;
switch(wBitCount)
{
case 1:
return 2;
case 4:
return 16;
case 8:
return 256;
default:
return 0;
}
}
void CDib::SaveFile(const CString filename)
{//此函数只能保存经处理后宽度,高度均没有改变大小的图像
strcpy(m_filename,filename);
CFile dibFile(m_filename,CFile::modeCreate|CFile::modeWrite);
dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
dibFile.Write((void*)pDib,szie);
dibFile.Close();
}
下面是设备无关位图的读取步骤:
下面是设备无关位图的显示步骤:
- 图像处理小节
- 图像操作小节
- Android开发处理小节
- 【转】JAVA 日期处理小节
- 小节
- 小节
- 对异常处理学习的一点小节
- 图像处理
- 图像处理
- 处理图像
- 图像处理
- 图像处理~~
- 图像处理
- 图像处理
- 图像处理
- 图像处理
- 图像处理
- 图像处理
- ASP.NET一个简单的无刷新删除
- Jetspeed2 问题及解决办法
- Rational Rose 分析C++项目范例
- 库文件了(.tlb)件编译成.dll文件。
- 图解RedHat(Linux)培训与认证路径
- 图像处理小节
- 关键字mutable小议
- 在数据绑定 DataGridView 控件时控制是否自动生成列
- 前台直接读取Web.config中的值的方法 (转)
- http header详解
- vim 颜色设置,当然同样适用于命令行下的vi
- 编程时代码字体的选择
- 求字符串长度的函数strlen
- BDA(广播驱动架构)技术文章转载【和电视卡有关】