实验一 位图文件的读取与显示

实验一 位图文件的读取与显示
实验一 位图文件的读取与显示

实验一位图文件的读取与显示

一、实验背景

1 位图文件格式说明

位图文件格式由四部分组成,如图1所示,分别是位图文件头、位图信息头、调色板以及位图像素数据,其中调色板信息为可选信息,只有当每个像素的比特数小于或等于8(BITMAPINFOHEADER.biBitCount<=8)时才存在,即为一个颜色查找表。

需要注意的是,位图文件存储时为了提高内存访问的速度,每一行的字节数必须是4的倍数,即:如果一幅图像的宽度为253,每个像素用8bit表示,因此,该图像实际每行所占的存储空间数为253Byte,但为了与4对齐,存储时所用的存储空间为256Byte。具体而言,假设图像的宽度为w,每个像素用n比特表示,则图像每行像素所占的字节数为:

(w * n + 31)/32 * 4

位图文件头(14 Byte)BITMAPFILEHEADER

位图信息头(40 Byte)BITMAPINFOHEADER

调色板(可选)

RGBQUAD 0

……

RGBQUAD n

位图像素数据

ImageData

Typedef struct tagBITMAPFILEHEADER {

WORD bfType; //必须是‘BM’,

//即Ox424D

DWORD bfSize; //整个文件的大小

WORD bfReserved1;

WORD bfReserved2;

DWORD bfOffBits; //位图数据相对于

//文件头的偏移量

}BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER{

DWORD biSize; //该结构大小

LONG biWidth; //图像宽度(单位:像素)

LONG biHeight; //图像高度(单位:像素)

WORD biPlanes; //必须为1

WORD biBitCount //每个像素使用的比特数

//1:2色; 4:16色;

//8:256色 24:真彩色

DWORD biCompression; //是否压缩

//BI_RGB:不压缩

//BI_RLE4、BI_RLE8:压缩

DWORD biSizeImage; //图像数据大小,

//未压缩时该字段可以为0

LONG biXPelsPerMeter;

LONG biYPelsPerMeter;

DWORD biClrUsed; //使用到的颜色数

//为0时,颜色数为2^biBitCount

DWORD biClrImportant;

}BITMAPINFOHEADER;

typedef struct tagRGBQUAD{

BYTE rgbBlue; //蓝色分量

BYTE rgbGreen;//绿色分量

BYTE rgbRed;//红色分量

BYTE rgbReserved; //保留值

}RGBQUAD;

图1 位图文件格式说明

2 位图文件读取

位图文件的读取包括两步:(1)根据第1节中的位图文件格式说明,对位图文件进行解析;(2)根据读取的内容创建可供显示的位图句柄。

(1)位图文件解析

//open file

FILE *fp = NULL;

fopen_s(&fp, strPath, _T("rb"));

if (fp == NULL)

{

CString str = _T("File not exist: " )+ strPath;

AfxMessageBox(str);

return NULL;

}

//bitmap file header

BITMAPFILEHEADER bmFileHeader;

fread(&bmFileHeader, sizeof(BITMAPFILEHEADER), 1, fp);

if (bmFileHeader.bfType != 0x4d42)

{

AfxMessageBox(_T("file type is not bitmap"));

return NULL;

}

//bitmap info header

BITMAPINFO bmInfo;

BITMAPINFOHEADER &bmInfoHeader = bmInfo.bmiHeader;

fread(&bmInfoHeader, sizeof(BITMAPINFOHEADER), 1, fp);

if (bmInfoHeader.biSize != sizeof(BITMAPINFOHEADER))

{

AfxMessageBox(_T("size of bitmap info header is inconsistent"));

return NULL;

}

//whether is compressed

if (bmInfoHeader.biCompression != BI_RGB)

{

AfxMessageBox(_T("File is compressed"));

return NULL;

}

int nPalettes = bmInfoHeader.biClrUsed;

if (nPalettes == 0 && bmInfoHeader.biBitCount <= 8)

nPalettes = 1 << bmInfoHeader.biBitCount;

if (bmFileHeader.bfOffBits != sizeof(BITMAPFILEHEADER) +

sizeof(BITMAPINFOHEADER) + nPalettes * sizeof(RGBQUAD))

{

AfxMessageBox(_T("off bits is inconsistent"));

return NULL;

}

//Palette

//RGBQUAD *pPalette = NULL;

byte *pBmInfo = NULL;

if (nPalettes > 0)

{

pBmInfo = new byte[sizeof(BITMAPINFOHEADER) + nPalettes *

sizeof(RGBQUAD)];

memcpy(pBmInfo, &bmInfoHeader, sizeof(BITMAPINFOHEADER));

byte *pPalette = pBmInfo + sizeof(BITMAPINFOHEADER);

fread(pPalette, sizeof(RGBQUAD), nPalettes, fp);

}

//line width

int nLineByte = (bmInfoHeader.biWidth * bmInfoHeader.biBitCount + 31) / 32 * 4;

//不直接使用bmInfoHeader.biSizeImage,因为图像不压缩时该字段可以为零

int nImageBytes = nLineByte * bmInfoHeader.biHeight;

//image data

byte *pContents = new byte[nImageBytes];

fread(pContents, nImageBytes, 1, fp);

(2)将读取的内容转换为Bitmap句柄

该步骤需使用系统函数CreateDIBitmap。CreateDIBitmap的函数说明如下:HBITMAP CreateDIBitmap(HDC hdc, CONST BITMAPINFOHEADER *lpbmih, DWORD fdwlnit, CONST VOID *lpblnit, CONST BITMAPINFO *lpbmi, UINT fuUsage);

参数:

hdc:设备环境句柄。

lpbmih:指向位图信息头结构的指针,它可以是下列操作系统位图信息头之一:

Fdwlnit:位标识集。它指定系统如何对位图的位进行初始化。

CBM_INIT:如果设置了该标志,那么系统将使用lpblnit和lpbmi两个参数指向的数据来对位图中的位进行初始化。如果没有该标志,那么表示上述两个参数指向的数据无效。如果fdwlnit为0,那么系统不会对位图的位进行初始化。

lpblnit:该指针指向包含初始的位图数据的字节类型数组。数据格式与参数lpbmi指向的BITMAPINFO结构中的成员biBitCount有关。

lpbmi:指向BITMAPINFO结构的旨针。该结构描述了参数lpbmi指向的数组的维数和

颜色格式。

fuUsage:表示BITMAPINFO结构的成员bmiColors是否初始化过,并且如果是,那么bmiColors是否包含明确的红、绿、蓝(RGB)值或调色板索引。参数fuUsage 必须取下列值中的一个,这些值的含义为:

DIB_PAL_COLORS:表示提供一个颜色表,并且该表由该位图要选入的设备

环境的逻辑调色板的16位索引值数组组成。

DIB_RGB_COLORS:表示提供一个颜色表,并且表中包含了原义的RGB值。

if (pBmInfo == NULL)

//无调色板时,BITMAPINFO就等同于BITMAPINFOHEADER

pBmInfo = (byte *)&bmInfo;

//create DIB Bitmap

HDC hdc = GetDC(AfxGetMainWnd()->GetSafeHwnd());

HBITMAP hBitmap = CreateDIBitmap(hdc, &bmInfoHeader, CBM_INIT,

pContents, (BITMAPINFO *)pBmInfo, DIB_RGB_COLORS);

delete []pContents;

if (nPalettes > 0)

delete []pBmInfo;

3 位图的显示

位图的显示分为三步:(1)利用CreateCompatibleDC()函数创建兼容内存设备环境;(2)利用SelectObject()函数将位图对象放入兼容内存设备环境;(3)使用BitBlt()函数或者StrechBlt()函数将位图显示在屏幕上。BitBlt()只能按照位图原来的大小进行显示,而StrechBlt()可以对位图进行放大或缩小。

CDC compDC;

compDC.CreateCompatibleDC(pDC); //创建pDC兼容的设备环境

compDC.SelectObject(pBitmap); //将位图对象放入兼容设备环境

//显示位图

BITMAP bitmap;

pBitmap->GetBitmap(&bitmap); //获取位图信息

pDC->BitBlt(0, 0, //位图显示位置

bitmap.bmWidth, bitmap.bmHeight, //显示位图的宽度和高度

&compDC, //位图所在兼容DC

0, 0, //兼容DC中的位置

SRCCOPY); //显示方式

二、主要问题

在Windows环境下,通过解析位图文件的格式,读入位图并进行显示,不能使用Windows中已有的API(如LoadImage函数)读取位图文件,即自己实现LoadImage函数的功能:

LoadImage(NULL, “lenna.bmp”, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)

三、采取的解决方法

1、生成一名为Bitmap的基于MFC的应用程序框架:

选择“文件”菜单“新建”选项,在打开的窗口中选择“工程”选项,选中MFC AppWizard(exe)。并在“工程名称”中输入Bitmap ,选择存放“工程”的位置。如下图所示:

选择确定,进入下一步。选择“单文档”,并在最后CdipView类的基类中选择CscrollView,使应用程序视图具有滚动条。

2、在应用程序中加入具体的函数和变量。

如上图所示,在FileView中,选择头文件中的BitmapView.h文件并打开,添加如下列的公共变量:

public:

int m_x;

HBITMAP m_Bmp;

LPVOID m_ColorList;

LPBYTE m_Image;

LPBITMAPINFOHEADER m_DibHead;

enum allocate {None, crtallocate, heapallocate};

allocate m_nBmpallocate;

allocate m_nImageallocate;

DWORD m_ImageSize;

int m_nPalette;

HANDLE m_hFile;

HANDLE m_hMap;

LPVOID m_lpvFile;

HPALETTE m_hPalette;

HGLOBAL m_hGlob;

在Class View中选择CGsmView单击右键选择添加成员函数,把下列函数加入到C++View类中

void SetPaletteSize(int nBitCount);

void Clear();

BOOL ReadFile(CFile *pFile);

BOOL SetPalette();

BOOL GetPalette();

BOOL DibToDC(CDC* pDC,CSize size);

BOOL MemToDib(LPVOID lmem);

CSize GetDibSize();

3、把对应函数代码拷贝到新的函数中;

void CBitmapView::SetPaletteSize(int nBitCount)

{

if(m_DibHead->biSize!=sizeof(BITMAPINFOHEADER))

{ throw new CException; }

m_ImageSize=m_DibHead->biSizeImage;

if(m_ImageSize==0)

{

DWORD

dwBytes=((DWORD)m_DibHead->biWidth*m_DibHead->biBitCount)/32;

if(((DWORD)m_DibHead->biWidth*m_DibHead->biBitCount)%32)

{

dwBytes++; }

dwBytes*=4;

m_ImageSize=dwBytes*m_DibHead->biHeight;

}

m_ColorList=(LPBYTE)m_DibHead+sizeof(BITMAPINFOHEADER);

if((m_DibHead==NULL)||(m_DibHead->biClrUsed==0))

{

switch(nBitCount)

{

case 1:

m_nPalette=2;

break;

case 4:

m_nPalette=16;

break;

case 8:

m_nPalette=256;

break;

case 16:

case 24:

case 32:

m_nPalette=0;

break;

default:

ASSERT(FALSE);

}

}

else

{ m_nPalette=m_DibHead->biClrUsed; }

ASSERT((m_nPalette>=0)&&(m_nPalette<=256));

}

void CBitmapView::Clear()

{

if(m_hFile==NULL) return;

::UnmapViewOfFile(m_lpvFile);

::CloseHandle(m_hMap);

::CloseHandle(m_hFile);

m_hFile=NULL;

if(m_nBmpallocate==crtallocate)

{ delete[] m_DibHead; }

else if(m_nBmpallocate==heapallocate)

{ ::GlobalUnlock(m_hGlob);

::GlobalFree(m_hGlob);

}

if(m_nImageallocate==crtallocate) delete[] m_Image;

if(m_hPalette!=NULL) ::DeleteObject(m_hPalette);

if(m_Bmp!=NULL) ::DeleteObject(m_Bmp);

m_nBmpallocate=m_nImageallocate=None;

m_hGlob=NULL;

m_DibHead=NULL;

m_Image=NULL;

m_ColorList=NULL;

m_nPalette=0;

m_ImageSize=0;

m_lpvFile=NULL;

m_hMap=NULL;

m_hFile=NULL;

m_Bmp=NULL;

m_hPalette=NULL;

}

BOOL CBitmapView::ReadFile(CFile *pFile)

{

int nCount,nSize;

BITMAPFILEHEADER bmfh;

Clear();

try{

nCount=pFile->Read((LPVOID)&bmfh,sizeof(BITMAPFILEHEADER));

if(nCount!=sizeof(BITMAPFILEHEADER))

{ throw new CException; }

if(bmfh.bfType!=0x4d42)

{ throw new CException; }

nSize=bmfh.bfOffBits-sizeof(BITMAPFILEHEADER);

m_DibHead=(LPBITMAPINFOHEADER) new char[nSize];

m_nBmpallocate=m_nImageallocate=crtallocate;

nCount=pFile->Read(m_DibHead,nSize);

SetPaletteSize(m_DibHead->biBitCount);

GetPalette();

m_Image=(LPBYTE) new char[m_ImageSize];

nCount=pFile->Read(m_Image,m_ImageSize); }

catch(CException* tmpc){

AfxMessageBox("文件读取错误");

tmpc->Delete();

return FALSE; }

return TRUE;

}

BOOL CBitmapView::SetPalette()

{

if(m_nPalette!=0)

return FALSE;

CClientDC dc(this);

CDC *pDC=&dc;

m_hPalette=::CreateHalftonePalette(pDC->GetSafeHdc());

return TRUE;

}

BOOL CBitmapView::GetPalette()

{

if(m_nPalette==0)

return FALSE;

if(m_hPalette!=NULL)

::DeleteObject(m_hPalette);

LPLOGPALETTE pTempPalette=(LPLOGPALETTE) new char[2*sizeof(WORD)+m_nPalette*sizeof(PALETTEENTRY)];

pTempPalette->palVersion=0x30;

pTempPalette->palNumEntries=m_nPalette;

LPRGBQUAD pRGBQuad=(LPRGBQUAD)m_ColorList;

for(int i=0;i

{

pTempPalette->palPalEntry[i].peRed=pRGBQuad->rgbRed;

pTempPalette->palPalEntry[i].peGreen=pRGBQuad->rgbGreen;

pTempPalette->palPalEntry[i].peBlue=pRGBQuad->rgbBlue;

pTempPalette->palPalEntry[i].peFlags=0;

pRGBQuad++;

}

m_hPalette=::CreatePalette(pTempPalette);

delete pTempPalette;

return TRUE;

}

BOOL CBitmapView::DibToDC(CDC *pDC, CSize size)

{

if(m_DibHead==NULL)

return FALSE;

if(m_hPalette!=NULL){

HDC hdc=pDC->GetSafeHdc();

::SelectPalette(hdc,m_hPalette,TRUE);

}

pDC->SetStretchBltMode(COLORONCOLOR);

::StretchDIBits(pDC->GetSafeHdc(),0,0,size.cx,size.cy,0,0,m_DibHead->biWidt h,m_DibHead->biHeight,m_Image,(LPBITMAPINFO)m_DibHead,DIB_RGB_COL ORS,SRCCOPY);

return TRUE;

}

BOOL CBitmapView::MemToDib(LPVOID lmem)

{

Clear();

m_DibHead=(LPBITMAPINFOHEADER)lmem;

SetPaletteSize(m_DibHead->biBitCount);

m_Image=(LPBYTE)m_ColorList+sizeof(RGBQUAD)*m_nPalette;

GetPalette();

return TRUE;

}

CSize CBitmapView::GetDibSize()

{

if(m_DibHead==NULL)

return CSize(0,0);

return CSize((int)m_DibHead->biWidth,(int)m_DibHead->biHeight);

}

4、编译检验没有出现错误;

出现显示位图的菜单框Bitmap,结果如下:

5、在程序资源中创建位图条为默认;

经查资料,在这里简单介绍一下如何建立一个位图资源。

新建一个VC++工程,取名为“Bitmap”,具体的步骤参考菜单实例中的工程创建,创建好后,单击主菜单中的“插入”→“资源”,弹出“插入资源”对话框。或者单击项目工作区中的“Resource View”标签,激活资源视图选项卡,然后选中其中任一节点右键单击,在快捷菜单中选择“插入”命令,会弹出相同的资源对话框。

在“插入资源”对话框中选择Bitmap,单击右边的“新建”按钮新建一个位图资源,其ID为IDB_BITMAP1(或者单击“引入”按钮,从文件中导入一个位图资源),如图下图所示:

在项目工作区中的“Resource View”标签下,点鼠标右键选择Bitmap下的“IDB_BITMAP1”,选择“属性”命令,弹出属性对话框,如下图所示。在其中,对诸如ID、File name等属性取默认值。

“位图属性”对话框

在项目工作区中的“Resource View”标签下,双击Bitmap下的

“IDB_BITMAP1”,在弹出的文件测览窗口中出现位图资源编辑器,如下图所示。

在该编辑区里可以完成与画图程序同样的各种编辑功能,包括填充各种形状,擦去错误等,可在其中绘制期望的位图。

位图资源编辑器

绘制好位图后,单击“文件”→“保存”命令保存资源文件。

这样,一个位图资源就制作好了。在程序中,可利用CBitmap类的LoadBitmap 函数来加载位图资源。

6、修改OnInitialUpdate函数中的代码;

void CBitmapView::OnInitialUpdate()

{

CScrollView::OnInitialUpdate();

CSize sizeTotal;

// TODO: calculate the total size of this view

m_x=25;

CSize MaxSize(24000,32000);

CSize MinSize(MaxSize.cx/100,MaxSize.cy/100);

SetScrollSizes(MM_HIMETRIC,MaxSize,MaxSize,MinSize);

LPVOID

lFirstBMP=(LPVOID)::LoadResource(NULL,::FindResource(NULL,MAKEINTRES OURCE(IDB_BITMAP1),RT_BITMAP));

MemToDib(lFirstBMP);

}

7、修改OnDraw函数中的代码;

void CBitmapView::OnDraw(CDC* pDC)

{

CBitmapDoc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

// TODO: add draw code for native data here

BeginWaitCursor();

CSize DibSize=GetDibSize();

DibSize.cx*=m_x;

DibSize.cy*=-m_x;

DibToDC(pDC,DibSize);

EndWaitCursor();

}

8、建立打开文件的消息响应函数。

在Menu中打开菜单编辑窗口,单击“查看”,在下拉菜单中选中“建立类向导”并打开,弹出如下对话框。

在类名中选择CBitmapView,在Object IDs中选中“ID_FILE_OPEN”,单击COMMAND,单击Addfunction建立消息响应函数OnFileOpen(),点击“OK”,如下图所示:

并加入入下代码:

void CBitmapView::OnFileOpen()

{

// TODO: Add your command handler code here

CFileDialog filedlg(TRUE,"bmp","*.bmp");

if(filedlg.DoModal()!=IDOK)

return;

CFile myfile;

myfile.Open(filedlg.GetPathName(),CFile::modeRead);

if(ReadFile(&myfile)==TRUE)

Invalidate();

SetPalette();

}

9、编译并检验,完成bmp位图的读取与显示。

四、实验的结果

五、实验的总结

通过本次实验我了解了以下一些成员函数的作用:

void SetPaletteSize(int nBitCount);//设置调色板大小

void Clear();//清除

BOOL ReadFile(CFile *pFile);//读取数据到内存

BOOL SetPalette();//当前位图颜色数大于256设置调色板

BOOL GetPalette();//创建颜色数不大于256的调色板

BOOL DibToDC(CDC* pDC,CSize size);显示位图

BOOL MemToDib(LPVOID lmem);//得到内存中位图象素位置CSize GetDibSize();//返回位图尺寸

如何保存中的图片

如何保存中的图片 This model paper was revised by the Standardization Office on December 10, 2020

如何保存Word中的图片 很多影友在看到word文档或PPT文件中有好图片希望单独保留时,不知道如何将里面的照片提取出来。其实这个过程很简单。 有些影友打开文件后选中图片,右键点击然后选择复制,再存储到文件夹中。但这样做并不能将原图复制出来,而是只保存了一个“片段”文件,双击这个片段打开还是word文档。要想保存原始图片,应点击word软件菜单中的“文件”选项,选择“另存为”或“另存为网页”,弹出对话框后,点击最下面的“保存类型”下拉菜单,选择“网页”,点击确定。这时在这个word文档所在的文件夹中会出现一个HTM文件和一个后缀名为“.files”的文件夹,我们所要保存的图片就都在这个“.files”的文件夹中了。需要注意的是, “.files”文件夹中每幅图片都会出现一大一小两个尺寸不同的图片文件,这是因为word文档在显示的时候会自动保存一个缩略图,这个缩略图的尺寸会根据word文档中最终显示照片的尺寸来保存,因此要选择“.files”文件里大尺寸的文件,才是我们想保留的原始图片。同理,在PPT文件中提取保存照片是同样的操作。 当一个word或PPT文件中有许多页面,我们只需提取其中某一页的图片时,也可以先把这一页单独拷贝成一个word或PPT文件,再按上述方法操作,这样可以减少后期从“.files”文件中查找原图的麻烦。 选择“另存为”或“另存为网页”。 时常,我们会把图片加入到word中,但是将word文件与其他人分享之后,却发现朋友们想从word中再把图片“扣出来”是一件非常困难的事情。在word 中,本身是不提供保存word中的图片功能。不知微软的Office为何不支持这一点,或许是他的一个失误吧。 方法一: 面对这样的一个需求,网上已经有很多解决办法。其中一个比较好用的办法是打开word文件后,点击“文件”->“另存为网页”。这样你就会发现,图片已经被单独保存在一个文件夹中。于是就可以使用了。但是这个方法有一个弊端,那就是需要将整个文档转成html格式,如果这个文件比较大,那可是有得转换了。并且,这样做是把整个文档都转换了,如果只想保存其中的几个图片,这种方法就不太适合了。 方法二: 使用截图工具,将要保存的图片截个图。这种方法优点很明显,那就是我需要哪张图,就截哪张图,不用管word文档的其它部分。但是其缺点有两个:第一是需要有专门的截图工具或是利用QQ的截图功能,而一般人都不会有或要登录QQ才可;第二是可能使得图片尺寸变小。 方法三(推荐): 既然以上两个方法都有各自很明显的缺点,那么还有没有一种最简单、最方便并且效果最好的保存word中图片的方法呢答案是肯定的,那就是我们的方法三。我们可以对word中的图片点击右键后选择“复制”,然后新打开一个ppt(一般来说,安装office的话,有 word就会有Powerpoint演示文稿ppt 程序的),新建一个空白页,对着ppt中空白页点击“粘帖”。这个时候,你对着ppt中的图片点击右键,就会发现有一个“另存为图片”。然后你就可以

位图是什么-

位图是什么? 篇一:位图变成矢量图 位图转矢量图 教学目标: 1、教会学生将位图转矢量图而且不改变图型色彩的方法。 2、教会学生渐变工具和填充色彩面板的使用方法。 3、教会学生如何将凤凰卫视图标的位图转矢量图。 教学重点:如何将位图转矢量图而且不改变图型色彩。 教学难点:渐变工具和填充色彩工具的使用方法 教学方法:讲解法、演示法、实训法相结合。 教学地点:二机房。 教学工具:投影仪、教学课件。 学习工具:机房电脑。 教学过程: 导入新课: 广告行业使用的大部分图片来自网上的位图,我们都知道网上的位图很多不清晰,存在锯齿,不好再进行更细致的处理。如何消除锯齿成了所有设计者的一道难题。 矢量图和位图相比,矢量图就没有了锯齿的困惑,而AI软件就恰恰能帮助我们解决这道难题。听起来有些不可思议。 知识讲解:

下面我们在学习位图转矢量图而且不改变图型色彩的方法之前我们得先学习一些工具的使用方法。 一、位于AI软件工具面板下端有这样一些图标。可以使用“工具”面板中的以下任何控件来指定颜色: 填充按钮 描边按钮 通过双击此按钮,可以使用拾色器来选择填充颜色。通过双击此按钮,可以使用拾色器来选择描边颜色。通过单击此按钮,可以在填充和描边之间互换颜色。 通过单击此按钮,可以恢复默认颜色设置(白色填充和黑互换填色和描边按钮默认填色和描边按钮 色描边)。颜色按钮 “无”按钮通过单击此按钮,可以将上次选择的纯色应用于具有渐变填充或者没有描边或填充的对象。(快捷键是“”号键。)通过单击此按钮,可以将当前选择的填充更改为上次选择的渐变。(快捷键是 二、渐变工具和渐变面板的使用 1、渐变工具的快捷键是G键。 2、渐变面板的介绍: 渐变面板的类型选项只有径向和线性两种形式。 新增加了反向渐变图标。可以直接调换色彩的方向。。角度的设置可以改变渐变的方向

位图图形格式介绍

位图图形格式介绍

位图图形格式介绍 BMP:Windows 位图 Windows 位图可以用任何颜色深度(从黑白到24 位颜色)存储单个光栅图像。Windows 位图文件格式与其他Microsoft Windows 程序兼容。它不支持文件压缩,也不适用于Web 页。 从总体上看,Windows 位图文件格式的缺点超过了它的优点。为了保证照片图像的质量,请使用PNG 文件、JPEG 文件或TIFF 文件。BMP 文件适用于Windows 中的墙纸。 优点:BMP 支持 1 位到24 位颜色深度。 BMP 格式与现有Windows 程序(尤其是较旧的程序)广泛兼容。 缺点:BMP 不支持压缩,这会造成文件非常大。 BMP 文件不受Web 浏览器支持。 PCX:PC 画图 “PC 画图”图片(也被称为Z-Soft 位图)会以任何颜色深度存储单个光栅图像。画笔图片更广泛地用于较早的Windows 程序和基于MS-DOS 的程序。画笔图片与许多较新的程序兼容。PCX 图片支持“行程长度编码”(RLE) 内

部压缩。 优点:PCX 在许多基于Windows 的程序和基于MS-DOS 的程序间是标准格式。 PCX 支持内部压缩。 缺点:PCX 不受Web 浏览器支持。 PNG:可移植网络图形 PNG 图片以任何颜色深度存储单个光栅图像。PNG 是与平台无关的格式,同时PNG格式可以很好的支持无损压缩。 优点:PNG 支持高级别无损耗压缩。 PNG 支持alpha 通道透明度。 PNG 支持伽玛校正。 PNG 支持交错。 PNG 受最新的Web 浏览器支持。 缺点:较旧的浏览器和程序可能不支持PNG 文件。 作为Internet 文件格式,与JPEG 的有损耗压缩相比,PNG 提供的压缩量较少。 作为Internet 文件格式,PNG 对多图像文件或动画文件不提供任何支持。GIF 格式支持多图像文件和动画文件。

位图存储格式

位图存储格式 2009-08-26 02:31 BMP位图文件的存储格式 摘要:本文简单介绍了位图文件的两种存储格式,并且在VC++6.0下实现了读取位图文件中的数据,用SetPixel()函数在窗口中重现图像,最后在程序中实现了一种存储格式到另一种存储格式的转换。 关键字:BMP、灰度位图、24位真彩色位图、存储格式 一、前言 BMP(Bitmap的缩写)图像是指文件名后缀为BMP的位图图像。位图图像在计算机中使用很广泛,例如在windows中,记事本、写字板中的文字就是用位图图像表示出来的。许多以其它格式存储的图像,就是在位图图像的基础上,进行优化处理后得到的,例如JPEG图像等。 在数字图像处理中,许多算法就是针对24位真彩色位图或灰度位图设计的。因此,很有必要介绍一下位图文件的这两种存储格式。 二、24位真彩色图像存储格式 把下图的24位真彩色图像格式在16位编辑器(例如VC编辑器)中打开,可以看到图像的二进制数据。 24位真彩色的二进制数据为: 这是24位真彩色位图文件数据一部分。这一部分数据包括位图文件头、位图信息头和位图阵列三部分。 (一)位图文件头 位图文件头用来记录标志文件大小的一些信息,在文件中占14个字节,存储的内容如下:字节 1 2 3 4 5 6 7 8 9 10 11 12 13 14 000000

42 4D CC B4 02 00 00 00 00 00 36 00 00 00 其中: 42 4D 为位图的标志,即ASCII码为BM CC B4 02 表示位图文件的总字节数,换算成十进制为(02B4CC)H=(177356)10,即这副图像的大小为177356字节。 00 00 00 00 00 为保留字节,用来存储文件大小的数据。 36 00 00 00 00 表示位图阵列的起始位置,(36)H=(54)10即54字节开始为位图阵列。 (二) 位图信息头 位图信息头记录和位图相关的一些信息,在文件中占40个字节,存储的内容如下: 字节 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

位图文件

一、位图文件结构 位图文件由三部分组成:文件头+ 位图信息+ 位图像素数据 1、位图文件头。位图文件头主要用于识别位图文件。以下是位图文件头结构的定义:[cpp]view plaincopyprint? 1.typedef struct tagBITMAPFILEHEADER { // bmfh 2.WORD bfType; 3.DWORD bfSize; 4.WORD bfReserved1; 5.WORD bfReserved2; 6.DWORD bfOffBits; 7.} BITMAPFILEHEADER; 1.typedef struct tagBITMAPINFO { 2.BITMAPINFOHEADER bmiHeader; 3.RGBQUAD bmiColors[1]; 4.} BITMAPINFO;

[cpp]view plaincopyprint? 1.typedef struct tagBITMAPINFOHEADER{ // bmih 2.DWORD biSize; 3.LONG biWidth; 4.LONG biHeight; 5.WORD biPlanes; 6.WORD biBitCount 7.DWORD biCompression; 8.DWORD biSizeImage; 9.LONG biXPelsPerMeter; 10.LONG biYPelsPerMeter; 11.DWORD biClrUsed; 12.DWORD biClrImportant; 13.} BITMAPINFOHEADER;

每个像素的位数*(1) biCompression 图像的压缩格式(这个值几乎总是为0) biSizeImage 以字节为单位的图像数据的大小(对BI_RGB压缩方式而言) biXPelsPermeter 水平方向上的每米的像素个数 biYpelsPerMeter 垂直方向上的每米的像素个数 biClrused 调色板中实际使用的颜色数(2) biClrImportant 现实位图时必须的颜色数(3) 说明:*是需要加以注意的部分,因为它们是我们在进行位图操作时经常参考的变量 (1)对于每个像素的字节数,分别有一下意义: 0,用在JPEG格式中 1,单色图,调色板中含有两种颜色,也就是我们通常说的黑白图片 4,16色图 8,256色图,通常说的灰度图 16,64K图,一般没有调色板,图像数据中每两个字节表示一个像素,5个或6个位表示一个RGB分量 24,16M真彩色图,一般没有调色板,图像数据中每3个字节表示一个像素,每个字节表示一个RGB分量 32,4G真彩色,一般没有调色板,每4个字节表示一个像素,相对24位真彩图而言,加入了一个透明度,即RGBA模式 (2)这个值通常为0,表示使用biBitCount确定的全部颜色,例外是使用的颜色数目小于制定的颜色深度的颜色数目的最大值。 (3)这个值通常为0,表示所有的颜色都是必需的 2.2颜色表。颜色表一般是针对16位一下的图像而设置的,对于16位和16位以上的图像,由于其位图像素数据中直接对对应像素的RGB(A)颜色进行描述,因而省却了调色板。而对于16位一下的 图像,由于其位图像素数据中记录的只是调色板索引值,因而需要根据这个索引到调色板去取得相应的RGB(A)颜色。颜色表的作用就是创建调色板。 下图是带调色板和不带调色板的位图的简单示意图 图1 带调色板和不带调色板位图之间的区别

Bmp图像存储格式

摘要:本文简单介绍了位图文件的两种存储格式,并且在VC++6.0下实现了读取位图文件中的数据,用SetPixel()函数在窗口中重现图像,最后在 程序中实现了一种存储格式到另一种存储格式的转换。 关键字:BMP、灰度位图、24位真彩色位图、存储格式 一、前言 BMP(Bitmap的缩写)图像是指文件名后缀为BMP的位图图像。位图图像在计算机中使用很广泛,例如在windows中,记事本、写字板中的文字就是用位图图像表示出来的。许多以其它格式存储的图像,就是在位图图像的基础上,进行优化处理后得到的,例如JPEG图像等。 在数字图像处理中,许多算法就是针对24位真彩色位图或灰度位图设计的。因此,很有必要介绍一下位图文件的这两种存储格式。 二、24位真彩色图像存储格式 把下图的24位真彩色图像格式在16位编辑器(例如VC编辑器)中打开,可以看到图像的二进制数据。 24位真彩色的二进制数据为: 这是24位真彩色位图文件数据一部分。这一部分数据包括位图文件头、位图信息头和位图阵列三部分。 (一)位图文件头 位图文件头用来记录标志文件大小的一些信息,在文件中占14个字节,存储的内容如下: 字节 1 2 3 4 5 6 7 8 9 10 11 12 13 14 000000 42 4D CC B4 02 00 00 00 00 00 36 00 00 00 其中: 42 4D 为位图的标志,即ASCII码为BM CC B4 02 表示位图文件的总字节数,换算成十进制为 (02B4CC)H=(177356)10,即这副图像的大小为177356字节。 00 00 00 00 00 为保留字节,用来存储文件大小的数据。 36 00 00 00 00 表示位图阵列的起始位置,(36)H=(54)10即54字节开始为位 图阵列。 (二) 位图信息头 位图信息头记录和位图相关的一些信息,在文件中占40个字节,存储的内容如下: 字节 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 00000 0 2 8 00001 6 0 2 C 1 C 5 1 1 8 00003 2 0 1 2 B 1 2 B 00004 8 0 其中:

VC中保存BMP位图文件的方法及BMP文件格式带源码实现

#include "stdio.h" #include "Windows.h" //几个全局变量,存放读入图像的位图数据、宽、高、颜色表及每像素所占位数(比特) //此处定义全局变量主要为了后面的图像数据访问及图像存储作准备 unsigned char *pBmpBuf;//读入图像数据的指针 int bmpWidth;//图像的宽 int bmpHeight;//图像的高 RGBQUAD *pColorT able;//颜色表指针 int biBitCount;//图像类型 bool readBmp(char *bmpName) { //二进制读方式打开指定的图像文件 FILE *fp=fopen(bmpName,"rb"); if(fp==0) return 0; //跳过位图文件头结构BITMAPFILEHEADER fseek(fp, sizeof(BITMAPFILEHEADER),0); //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中 BITMAPINFOHEADER head; fread(&head, sizeof(BITMAPINFOHEADER), 1,fp); //获取图像宽、高、每像素所占位数等信息 bmpWidth = head.biWidth; bmpHeight = head.biHeight; biBitCount = head.biBitCount; //定义变量,计算图像每行像素所占的字节数(必须是4的倍数) int lineByte=(bmpWidth * biBitCount/8+3)/4*4; //灰度图像有颜色表,且颜色表表项为256 if(biBitCount==8){ //申请颜色表所需要的空间,读颜色表进内存 pColorTable=new RGBQUAD[256]; fread(pColorTable,sizeof(RGBQUAD),256,fp); } //申请位图数据所需要的空间,读位图数据进内存 pBmpBuf=new unsigned char[lineByte * bmpHeight]; fread(pBmpBuf,1,lineByte * bmpHeight,fp);

图像、位图和图元文件

图像、位图和图元文件 .NET Framework 4.5 其他版本 Image类是抽象基类,它提供了处理光栅图像(位图)和矢量图像(图元文件)的方法。Bitmap类和Metafile类都继承自Image类。Bitmap类提供了用于加载、保存和处理光栅图像的更多方法,因而扩展了Image类的功能。Metafile类提供了用于记录和检查矢量图像的更多方法,因而扩展了Image类的功能。 本节内容 位图类型 讨论各种图像格式。 GDI+ 中的图元文件 讨论对图元文件的 GDI+ 支持。 在 GDI+ 中绘制、定位和克隆图像 讨论用托管代码绘制矢量图像和光栅图像的方法。 在 GDI+ 中裁切和缩放图像 讨论用托管代码对矢量图像和光栅图像进行裁剪和缩放的方法 参考 Image 描述此类并提供指向其所有成员的链接。 Bitmap 描述此类并提供指向其所有成员的链接 位图类型 .NET Framework 4.5 其他版本 位图是位的数组,它指定了像素矩阵中各像素的颜色。专用于单个像素的位数决定了可分配到该像素的颜色数。例如,如果用 4 位来呈现每个像素,那么一个给定的像素就可以分配到 16 (2^4 = 16) 种颜色中的一种。下表中的几个示例显示了可分配到由给定位数代表的像素的颜色数量。

存储位图的磁盘文件通常包含一个或多个信息块,信息块中存储了如每像素位数、每行的像素数以及数组中的行数等信息。这样一个文件也可能包含颜色表(有时称为调色板)。颜色表将位图中的数值映射到特定的颜色。下面的插图显示了一幅放大的图像以及它的位图和颜色表。每个像素用一个 4 位数表示,那么颜色表中有 2^4 = 16 种颜色。表中的每种颜色用一个 24 位数表示:8 位用于红色,8 位用于绿色,8 位用于蓝色。数字以十六进制(基 16)形式显示:A = 10,B = 11,C = 12,D = 13,E = 14,F = 15。 请看位于该图像第 3 行、第 5 列的像素。位图中对应的数字为 1。颜色表告诉我们 1 表示红色,因此该像素是红色的。该位图最上面一行中所有的项都是 3。颜色表告知我们 3 表示蓝色,因此该图像最上面一行中的所有像素都是蓝色。 说明 在颜色表中存储索引的位图称为“调色板索引位图”。有些位图不需要颜色表。例如,如果位图使用每像素 24 位的格式,那么该位图就可以将颜色本身(而不是索引)存储到颜色表中。下面的插图显示了一个直接存储颜色(24 位/像素)而不使用颜色表的位图。该插图也显示了相应图像的放大视图。在位图中,FFFFFF 表示白色,FF0000 表示红色,00FF00 表示绿色,0000FF 表示蓝色。

保存word中图片的几种方法

保存word中图片的几种方法 如果我们想把word中的图片保存下来,根据需要,可采用以下几种方法 一、复制法: 在图片上击右键,选择“复制”,然后打开“画图”等处理软件,粘贴过来,进行必要的修改后保存为图片。 提示:这种方法只适用于保存较少的图片。 二、“另存为Web页”方式 点击菜单栏上的“文件→另存为”,也可以直接按F12键,在弹出的“另存为”窗口中,在“保存类型”下拉框中选择“Web页”;然后单击“保存”按钮,关闭窗口,打开文件所在位置,这时同名的以“.files”为后缀名的文件夹中有以jpg和gif格式存在的图片,这些图片就是word文档中嵌入的所有图片,保留所需的图片,把不用的删除即可。 提示:这种方法适于保存大量图片的情况,缺点是图片在保存为gif格式时质量会有所下降。 三、用“Microsoft Photo Editor” Word2000/XP中提供了一个专门用于图片处理的工具——Microsoft Photo Editor,借助这个工具我们可以轻松地将插入Word文档中的图片单独保存,并可指定图片的格式。 在Office “典型”安装方式下,Photo Editor并没有随Office工具一起安装,所以我们必须另外添加。插入Office安装光盘,自动运行后进入“Office维护模式”,选择“添加或删除功能”,并在“更新功能”向导步骤中展开“Office工具”列表,将Photo Editor设置成“从本机上运行”。 安装完成后,重新打开Word,依次单击“工具→选项→编辑”,从下拉列表中选择Photo Editor,将它作为默认的图片处理工具。(见下图) 将Photo Editor设置成默认的图片编辑器,在Word文档中选定需要保存或转换的图片,从右键菜单中选择“编辑图片”,这时Word会自动调用Photo Editor将图片打开,从“文件”菜单下选择“另存为”命令,在弹出的对话框中我们可以选择保存图片的格式为GIF、JPG、BMP、TIF或者PNG,同时下方还有一个“高级”按钮,可以对图像转换时一些参数进行设置。 提示:这种方法比较灵活,保存的图片质量没有损失,前提是要安装“Microsoft Photo Ed itor” 四、用QQ截图的方式 用QQ截图的方式把图片截下来,然后保存。 首先打开QQ,然手打开有图片的word文档,按快捷方式:Ctrl+Ait+A,调出QQ截图,用鼠标圈划要保存的图片,然后击右键选择另存为

位图保存下来是翻转的!怎么正过来

位图保存下来是翻转的!!!!!!!!!!!!!!!!如何正过来 CString str; str="c:\\temp2.bmp";//目标图像 CBitmap *bitmap; BITMAP bm; bitmap=CBitmap::FromHandle((HBITMAP)::LoadImage(0,"c:\\temp1.bmp",IMAGE_BITM AP,0,0,LR_CREATEDIBSECTION |LR_DEFAULTSIZE |LR_LOADFROMFILE));//调用原始图像 bitmap->GetBitmap(&bm); BYTE *pBits=new BYTE[bm.bmWidthBytes*bm.bmHeight]; memmove(pBits,bm.bmBits,bm.bmWidthBytes*bm.bmHeight); //读到缓冲区,应该是这里就开始被反了?????可是我无法解决,水平不够 //同态滤波代码 IGPI_Homomorphic(pBits,bm.bmHeight,bm.bmWidthBytes,0.5,2,3,8);//这个外部函数应没问题 bitmap->SetBitmapBits(bm.bmWidthBytes*bm.bmHeight,pBits); //将滤波处理后的回填到原始图像 SaveBitmapToFile(bitmap,(LPSTR)(LPCTSTR)str);//保存位图到temp2 同态滤波的例子 temp1原始图temp2目标图

最后得到的temp2.bmp是temp1.bmp翻转的图像 保存下来的bmp图像是上下翻转的,如何不翻转?! 求代码修改 ------解决方案-------------------- 探讨 SaveBitmapToFile(bitmap,(LPSTR)(LPCTSTR)str);//保存位图到temp2 ------解决方案-------------------- 楼主试试CXImage类,这个可以把buffer中的图像保存成图片的,你看看memmove(pBits,bm.bmBits,bm.bmWidthBytes*bm.bmHeight)之后,pBits里的图像是不是反的。 有一个效率低一些的办法,再把图像反过来: DWORD dwRGB24BufLen = iWidth * iHeight * 3; BYTE *pTempBuf = new BYTE[dwRGB24BufLen]; if(NULL == pTempBuf) { return; } memset(pTempBuf, 0, dwRGB24BufLen * sizeof(BYTE)); DWORD dwLineData = (iWidth * 24) >> 3; for(DWORD dwLoop = 0; dwLoop < iHeight; dwLoop++) { memcpy(pTempBuf + dwLoop * dwLineData, pBits + dwRGB24BufLen - (dwLoop + 1) * dwLineData, dwLineData * sizeof(BYTE)); } memcpy(pBits, pTempBuf, dwRGB24BufLen);

BMP位图格式详解

位图格式BMP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图。它一般由4部分组成:文件头信息块、图像描述信息块、颜色表(在真彩色模式无颜色表)和图像数据区组成。在系统中以BMP为扩展名保存。 打开Windows的画图程序,在保存图像时,可以看到三个选项:2色位图(黑白)、16色位图、256色位图和24位位图。 现在讲解BMP的4个组成部分: 1.文件头信息块 0000-0001 :文件标识,为字母ASCII码“BM”。 0002-0005 :文件大小。 0006-0009 :保留,每字节以“00”填写。 000A-000D :记录图像数据区的起始位置。各字节的信息含义依次为:文件头信息块大小,图像描述信息块的大小,图像颜色表的大小,保留(为01)。 2.图像描述信息块 000E-0011:图像描述信息块的大小,常为28H。 0012-0015:图像宽度。 0016-0019:图像高度。 001A-001B:图像的plane总数(恒为1)。 001C-001D:记录像素的位数,很重要的数值,图像的颜色数由该值决定。 001E-0021:数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩)。 0022-0025:图像区数据的大小。 0026-0029:水平每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。 002A-002D:垂直每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。 002E-0031:此图像所用的颜色数,如值为0,表示所有颜色一样重要。 3.颜色表 颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像位64字节;256色图像为1024字节。其中,每4字节表示一种颜色,并以B(蓝色)、G(绿色)、R(红色)、alpha(32位位图的透明度值,一般不需要)。即首先4字节表示颜色号0的颜色,接下来表示颜色号1的颜色,依此类推。 4.图像数据区 颜色表接下来位是位图文件的图像数据区,在此部分记录着每点像素对应的颜色号,其记录方式也随颜色模式而定,既2色图像每点占1位;16色图像每点占4位;256色图像每点占8位;真彩色图像每点占24位。所以,整个数据区的大小也会随之变化。究其规律而言,可的出如下计算公式:图像数据信息大小=(图像宽度*图像高度*记录像素的位数)

位图格式

BMP格式 BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大。所以,目前BMP在单机上比较流行。 目录 BMP文件格式分析 1bmp位图和调色板的概念RGB颜色阵列?? 1加载文件?1、加载文件头? 12、加载位图信息头? 13、行对齐? 14、加载图片数据? 15、绘制? 16、3D(OpenGL)的不同之处? BMP文件格式分析 简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。

Windows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP 图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。 1.2 文件结构 位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它具有如下所示的形式。 位图文件的组成 结构名称符号 位图文件头(bitmap-file header) BITMAPFILEHEADER bmfh 位图信息头(bitmap-information header) BITMAPINFOHEADER bmih 彩色表(color table) RGBQUAD aColors[] 图象数据阵列字节BYTE aBitmapBits[] 位图文件结构可综合在表6-01中。

位图图像存储容量

1.位图图像: 位图,又叫光栅图,是由许多像小方块一样的“像素”组成的图像。其放大或缩小都会使原有图像产生失真。 ①位图文件容量的计算: 800*600像素的黑白图像如何计算? 分析:一个像素可以存放黑或者白图像,所以每个像素就是一个比特。因此,可以算出这幅图像的容量为:800*600/8=60000(B) 如果换成256色的800*600的图像又该如何计算呢? 分析:256色也即在每个像素里有256种色彩的可能。也就是说存储一个像素要用8个比特即1个字节的存储空间。因此,可以算出这幅图像的容量为:800*600*8/8=480000(B)学生思考:如果一幅1024*768的16位色彩的图像又该如何计算它的容量? 提醒:16位色彩和16色的不同。16色实际上是2的4次方,即4位色彩。而256色是2的8次方,即8位色彩。 ②常见的位图图像处理软件简介: 画图软件、Photoshop、Ulead PhotoImpact等。 2.矢量图形: 矢量图形是通过计算机将一串线条和图形转换为一系列指令,在计算机中只存储这些指令,而不是像素。矢量图形看起来没有位图图像真实,但矢量图形的存储空间比位图图像要小得多,而且矢量图形通过拉伸、移动、放大等操作,图形不会产生实真。 常见的矢量图像处理软件简介:CorelDRAW 计算机中信息存储单位 计算机中的信息用二进制表示,常用的单位有位、字节和字。 1.位(bit) 计算机中最小的数据单位是二进制的一个数位,每个0或1就是一个位。它也是存储器存储信息的最小单位,通常用“b”来表示。 2.字节(Byte) 字节是计算机中表示存储容量的基本单位。一个字节由8位二进制数组成,通常用“B”表示。一个字符占一个字节,一个汉字占两个字节。 存储容量的计量单位有字节B、千字节KB、兆字节MB以及十亿字节GB等。它们之间的换算关系如下: 1B=8bit 1KB=210B=1024B 1MB=210KB=1024KB 1GB=210MB=1024MB 因为计算机用的是二进制,所以转换单位是2的10次方。 3.字(Word) 字是指在计算机中作为一个整体被存取、传送、处理的一组二进制数。一个字由若干个字节组成,每个字中所含的位数,是由CPU的类型所决定,如64位微机的一个字是指64位二进制数。通过运算器是以字节为单位进行运算的,而控制器是以字为单位进行接收和传递的。 考点二:数制转换 基础再现 1、二进制代码 由“0”和“1”两个基数组成,规则为“逢二进一”。 将二制制代码转换为十进制代码采用“按位权展开法”

jpeg文件数据结构以及将位图保存为jpg的代码

jpeg文件数据结构以及将位图保存为jpg的代码 JPEG文件数据结构以及将位图保存为JPG的代码一、简述 JPEG是一个压缩标准,又可分为标准JPEG、渐进式JPEG及JPEG2000三种:①标准JPEG:以24位颜色存储单个光栅图像,是与平台无关的格式,支持最高级别的压缩,不过,这种压缩是有损耗的。此类型图片在网页下载时只能由上而下依序显示图片,直到图片资料全部下载完毕,才能看到全貌。 ②渐进式JPEG:渐进式JPG为标准JPG的改良格式,支持交错,可以在网页下载时,先呈现出图片的粗略外观后,再慢慢地呈现出完整的内容,渐进式JPG的文件比标准JPG 的文件要来得小。 ③JPEG2000:新一代的影像压缩法,压缩品质更好,其压缩率比标准JPEG高约30%左右,同时支持有损和无损压缩。一个极其重要的特征在于它能实现渐进传输,即先传输图像的轮廓,然后逐步传输数据,让图像由朦胧到清晰显示。以一幅24位彩色图像为例,JPEG的压缩分为四个步骤: ①颜色转换:在将彩色图像进行压缩之前,必须先对颜色模式进行数据转换。转换完成之后还需要进行数据采样。 ②DCT 变换:是将图像信号在频率域上进行变换,分

离出高频和低频信息的处理过程,然后再对图像的高频部分(即图像细节)进行压缩。首先以象素为单位将图像划分为多个8×8的矩阵,然后对每一个矩阵作DCT 变换。把8×8的象素矩阵变成8×8的频率系数矩阵(所谓频率就是颜色改变的速度),频率系数都是浮点数。 ③量化:由于下面第四步编码过程中使用的码本都是整数,因此要对频率系数进行量化,将之转换为整数。数据量化后,矩阵中的数据都是近似值,和原始图像数据之间有了差异,这一差异是造成图像压缩后失真的主要原因。这一过程中,质量因子的选取至为重要。值选得大,可以大幅度提高压缩比,但是图像质量就比较差,质量因子越小图像重建质量越好,但是压缩比越低。 ④编码:编码是基于统计特性的方法。四个步骤都完成后的JPEG文件,其基本数据结构为两大类型:“段”和经过压缩编码的图像数据。二、数据结构 1.段的一般结构如下表所示:表1:段的一般结构 ----------------------------------------------------------------- 名称字节数数据说明 ----------------------------------------------------------------- 段标识 1 FF 每个新段的开始标识 段类型 1 类型编码(称作“标记码”) 段长度 2 包括段内容和段长度本身,不包括段

保存图片的几种格式详解

PHOTOSHOP保存图片的几种格式详解1.PSD: Photoshop 的自身格式能支持Photoshop 的全部信息α的任何颜色深度和图象模式。PSD格式是采用RLE的无损压缩。在Photoshop 中存储和打开此格式也是较快速的。2.TIFF: TIFF 支持位图、灰度模式、索引模式、RGB、CMYK、和Lab等图象模式。TIFF支持RLE。也支持LZW压缩模式。它是跨平台的图象格式既可在Windows又可在Macintosh中打开和存储。它被页面布局程序广泛地接受常用于出版和印刷业中。 3.EPS: EPS是Photoshop 用PostScript语言开发的一个图象格式它既能包含栅格图又能包含矢量图。它还支持剪贴路径并在页面布局应用程序中成为透明图象。它不支持α通道。Photoshop 中保存的EPS文件只包含栅格图。EPS 的编码ASCII 在打印时不易出问题二进位制在打印时易发生错误 4. PCX: 它是最早得到广泛应用的文件格式。它支持位图、索引模式、灰度模式和真彩色的RGB 模式但不支持通道和CMYK 模式。它也和PSD 一样用RLE压缩但它的文件较PSD 要大些。

5.PDF: 它是Adobe Acrobat 电子阅读器所使用的格式可以在很多操作系统中阅读它的文件。它与web 文件一样有超文本链接阅读极其方便。但它们文件质量要高于web 文件。如在Photoshop 中置入的PDF文件只能置入首页。用“文件/自动/多页面PDF到PSD” 命令可以图层的形式置入PDF。它以Photoshop PDF格式保存时可用位图、灰度模式、索引模式、RGB、CMYK以及Lab模式保存。但不支持α通道。 6.GIF: 它是目前最重要的图象格式之一它之所以重要是因为它在web 上的广泛应用。它是索引模式最多也只有256 种颜色信息量小在web 上图象下载较快。它因信息量小而制作的动画在web 上受到极大的欢迎。它支持α通道并以此可在web 上形成透明图象。它支持隔行扫描在web 上观看时图象会及时地显示较模糊图象逐渐清晰。GIF89a 是89 年开发的图象格式。 7.JPEG: 严格地来说JPEG 不是一个图象格式而是一种压缩计算技术。如PICT 和EPS 格式就应用了该技术。JPEG 实际上应该是JFIFJPEG File Interchange Format 格式简称为JPEG。此格式是有损压缩可调节它的压缩量而改变文件的大小因此它与GIF 格式一样被web 应用。JPEG不支持α 通道也不支持透明图象但支持路径。它支持RGB 模式也支持CMYK 模式。它适用于色调连续或相片图象。JPEG保存图象时可选择

bmp位图格式

BMP位图文件的存储格式 位图是最常用的windows图形格式,通过windows API函数可以直接读取并绘制,不过,有时我们还是需要自己控制,那么,就让我们看看他的格式吧! 位图文件结构表 位图文件 位图文件头 14 字节 位图信息头 40 字节 彩色表(调色板) 4N 字节 位图数据 x 字节 构件详解: ?位图文件头 位图文件头包含文件类型、文件大小、存放位置等信息。结构定义如下: typedefstructtagBITMAPFILEHEADER { UNIT bfType; DWORD bfSize; UINT bfReserved1; UINT bfReserved2; DWORD bfOffBits; }BITMAPFILEHEADER; 其中: bfType 说明文件类型,在windows系统中为BM。 bfSize 说明文件大小。 bfReserved1 bfReserved2 保留,设置为0。 bfOffBits说明实际图形数据的偏移量。 ?位图信息头 位图信息头包含位图的大小、压缩类型、和颜色格式,结构定义如下: typedefstructtagBITMAPINFOHEADER { DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount;

DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMerer; LONG biYPelsPerMerer; DWORD biClrUsed; DWORD biClrImportant; }BITMAPINFOHEADER; 其中: biSize 说明BITMAPINFOHEADER结构所需字节数,在windows系统中为28h biWidth 说明图像宽度 biHeight 说明图像高度 biPlanes 为目标设备说明位面数,其值设为1 biBitCount每个像素的位数,单色位图为1,256色为8,24bit为24。 biCompression压缩说明,BI_RGB:无压缩,BI_RLE8:8位RLE压缩,BI_RLE4:4位RLE压缩biSizeImage说明图像大小,如无压缩,可设为0 biXPelsPerMeter水平分辨率 biYPelsPerMeter垂直分辨率 biClrUsed位图使用的颜色数 biImportant重要颜色数目 ?彩色表 彩色表包含的元素与位图所具有的颜色数目相同,像素颜色用结构RGBQUAD来表示:typedefstructtagRGBQUAD { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; }RGBQUAD; 其中: rgbBlue 指定蓝色强度 rgbGreen 指定绿色强度 rgbRed 指定红色强度 rgbReserved保留,设为0 ?位图数据 紧跟在彩色表后的是图像数据震裂,图像每一扫描行有连续的字节组成,扫描行由底向上存储,阵列中第一字节为左下角像素,最后一字节为右上角像素。 要想处理图像文件就必须知道这些图像文件的构成方式。在常用的图像格式中,以24位真彩色的BMP位图格式比较常用,而且构成比较简单,所以我们就以它作为讲解的对象。 首先我们找一幅24 位真彩色的位图用16 进制编辑器将其打开,查看方式切换到以HEX 方式查看的话,你们就可以看到类似下面这样的数据了。这其实就是BMP 文件中的图像数据。这些数据就代表着我们平常看到的图像。 00000

相关主题
相关文档
最新文档