精华内容
下载资源
问答
  • 几种常见的图像格式

    2010-01-22 14:21:00
    jpg和jpeg是有损压缩 bmp是位图 gif是无损压缩,一般用于动画 BMP位图格式(文件扩展名为BMP) 它是用于WINDOWS和OS/2位图(BITMAP)格式,文件几乎不压缩,占用磁盘空间较大,它颜色存储格式有1位、4位、8位及...
    jpg和jpeg是有损压缩 
    bmp是位图
    gif是无损压缩,一般用于动画


    BMP位图格式(文件扩展名为BMP)
    它是用于WINDOWS和OS/2的位图(BITMAP)格式,文件几乎不压缩,占用磁盘空间较大,它的颜色存储格式有1位、4位、8位及24位。开发WINDO-WS环境下的软件时,BMP格式是最不容易出问题的格式,并且DOS与WINDO-WS环境下的图象处理软件都支持该格式,因此,该格式是当今应用比较广泛的一种格式。但缺点是该格式文件比较大,所以只能应用在单机上,不受网络欢迎。
    COMPUSERVE GIF格式(文件扩展名为GIF)
    这种格式是由COMPUSERVER公司设计的,GIF是GRAPHICS INTER CHA-NGE FORMAT的缩写,分为87a及89a两种版本,存储格式由1位到8位。GIF格式是经过压缩的格式,磁盘空间占用较少。由于它是制作2D动画软件Animator早期支持的文件格式,所以该格式曾被广泛使用。但由于8位存储格式的限制,使其不能存储超过256色的图象。虽然如此,但该图形格式却在Internet上被广泛地应用,原因主要有两个:1、256种颜色已经较能满足Internet上的主页图形需要。2、该格式生成的文件比较地小,适合像Internet这样的网络环境传输和使用。
    意思相同,就像htm和html是同一意思一样,
    JPEG=JPG是Joint Photographic Experts Group(联合图像专家组)的缩写,文件后辍名为".jpg"或".jpeg",是最常用的图像文件格式,由一个软件开发联合会组织制定,是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量明显降低,如果追求高品质图像,不宜采用过高压缩比例。但是JPEG压缩技术十分先进,它用有损压缩方式去除冗余的图像数据,在获得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像品质。而且 JPEG是一种很灵活的格式,具有调节图像质量的功能,允许用不同的压缩比例对文件进行压缩,支持多种压缩级别,压缩比率通常在10:1到40:1之间,压缩比越大,品质就越低;相反地,压缩比越小,品质就越好。比如可以把1.37Mb的BMP位图文件压缩至20.3KB。当然也可以在图像质量和文件尺寸之间找到平衡点。JPEG格式压缩的主要是高频信息,对色彩的信息保留较好,适合应用于互联网,可减少图像的传输时间,可以支持24bit真彩色,也普遍应用于需要连续色调的图像。

    JPEG格式是目前网络上最流行的图像格式,是可以把文件压缩到最小的格式,在 Photoshop软件中以JPEG格式储存时,提供11级压缩级别,以0—10级表示。其中0级压缩比最高,图像品质最差。即使采用细节几乎无损的10 级质量保存时,压缩比也可达 5:1。以BMP格式保存时得到4.28MB图像文件,在采用JPG格式保存时,其文件仅为178KB,压缩比达到24:1。经过多次比较,采用第8级压缩为存储空间与图像质量兼得的最佳比例。

    PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是企图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。流式网络图形格式(Portable Network Graphic Format,PNG)名称来源于非官方的“PNG's Not GIF”,是一种位图文件(bitmap file)存储格式,读成“ping”。PNG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,并且还可存储多到16位的α通道数据。PNG使用从LZ77派生的无损数据压缩算法。
    PNG图片文件一般应用于JAVA程序中,或网页或S60程序中是因为它压缩比高,生成文件容量小。

    ----
    DIB位图文件

    dib
















      DIB,全称Device Independent Bitmap,设备无关位图文件,这是一种文件格式,其目的是为了保证用某个应用程序创建的位图图形可以被其它应用程序装载或显示一样。

      DIB(Device-indepentent bitmap)的与设备无关性主要体现在以下两个方面:

      DIB的颜色模式与设备无关。例如,一个256色的DIB即可以在真彩色显示模式下使用,也可以在16色模式下使用。

      256色以下(包括256色)的DIB拥有自己的颜色表,像素的颜色独立于系统调色板。

      由于DIB不依赖于具体设备,因此可以用来永久性地保存图象。DIB一般是以*.BMP文件的形式保存在磁盘中的,有时也会保存在*.DIB文件中。运行在不同输出设备下的应用程序可以通过DIB来交换图象。

      DIB还可以用一种RLE算法来压缩图像数据,但一般来说DIB是不压缩的。

      DIB的结构

      与Borland C++下的框架类库OWL不同,MFC未提供现成的类来封装DIB。尽管Microsoft列出了一些理由,但没有DIB类确实给MFC用户带来很多不便。用户要想使用DIB,首先应该了解DIB的结构。

      在内存中,一个完整的DIB由两部分组成:一个BITMAPINFO结构和一个存储像素阵列的数组。BITMAPINFO描述了位图的大小,颜色模式和调色板等各种属性,其定义为

      typedef struct tagBITMAPINFO {

      BITMAPINFOHEADER bmiHeader;

      RGBQUAD bmiColors[1]; //颜色表

      } BITMAPINFO;

      RGBQUAD结构用来描述颜色,其定义为

      typedef struct tagRGBQUAD {

      BYTE rgbBlue; //蓝色的强度

      BYTE rgbGreen; //绿色的强度

      BYTE rgbRed; //红色的强度

      BYTE rgbReserved; //保留字节,为0

      } RGBQUAD;

      注意,RGBQUAD结构中的颜色顺序是BGR,而不是平常的RGB。

      BITMAPINFOHEADER结构包含了DIB的各种信息,其定义为

      typedef struct tagBITMAPINFOHEADER{

      DWORD biSize; //该结构的大小

      LONG biWidth; //位图的宽度(以像素为单位)

      LONG biHeight; //位图的高度(以像素为单位)

      WORD biPlanes; //必须为1

      WORD biBitCount //每个像素的位数(1、4、8、16、24或32)

      DWORD biCompression; //压缩方式,一般为0或BI_RGB (未压缩)

      DWORD biSizeImage; //以字节为单位的图象大小(仅用于压缩位图)

      LONG biXPelsPerMeter; //以目标设备每米的像素数来说明位图的水平分辨率

      LONG biYPelsPerMeter; //以目标设备每米的像素数来说明位图的垂直分辨率

      DWORD biClrUsed; /*颜色表的颜色数,若为0则位图使用由biBitCount指定的最大颜色数*/

      DWORD biClrImportant; //重要颜色的数目,若该值为0则所有颜色都重要

      } BITMAPINFOHEADER;

      与DDB不同,DIB的字节数组是从图象的最下面一行开始的逐行向上存储的,也即等于把图象倒过来然后在逐行扫描。另外,字节数组中每个扫描行的字节数必需是4的倍数,如果不足要用0补齐

      DIB可以存储在*.BMP或*.DIB文件中。DIB文件是以BITMAPFILEHEADER结构开头的,该结构的定义为

      typedef struct tagBITMAPFILEHEADER {

      WORD bfType; //文件类型,必须为"BM"

      DWORD bfSize; //文件的大小

      WORD bfReserved1; //为0

      WORD bfReserved2; //为0

      DWORD bfOffBits; //存储的像素阵列相对于文件头的偏移量

      } BITMAPFILEHEADER;

      紧随该结构的是一个BITMAPINFOHEADER结构,然后是RGBQUAD结构组成的颜色表(如果有的话),文件最后存储的是DIB的像素阵列。

      DIB的颜色信息储存在自己的颜色表中,程序一般要根据颜色表为DIB创建逻辑调色板。在输出
    一幅DIB之前,程序应该将其逻辑调色板选入到相关的设备上下文中并实现到系统调色板中,然后再调用相关的GDI函数
    (如::SetDIBitsToDevice或::StretchDIBits)输出DIB。在输出过程中,GDI函数会把DIB转换成DDB,这项工作
    主要包括以下两步:

      将DIB的颜色格式转换成与输出设备相同的颜色格式。例如,在真彩色的显示模式下要显示一个256色的DIB,则应该将其转换成24位的颜色格式。

      将DIB像素的逻辑颜色索引转换成系统调色板索引。 

      编写DIB类

      由于MFC未提供DIB类,用户在使用DIB时将面临繁重的Windows
    API编程任务。幸运的是,Visual
    C++提供了一个较高层次的API,简化了DIB的使用。这些API函数实际上是由MFC的DibLook例程提供的,它们位于DibLook目录下的
    dibapi.cpp、myfile.cpp和dibapi.h文件中,主要包括:

      ReadDIBFile //把DIB文件读入内存

      SaveDIB //把DIB保存到文件中

      CreateDIBPalette //从DIB中创建一个逻辑调色板

      PaintDIB //显示DIB

      DIBWidth //返回DIB的宽度

      DIBHeight //返回DIB的高度

      DIB区块

      DIB区块

      DIB能拥有几种色彩组织中的一种,DDB必须是单色的或是与真实输出设备相同的格式。DIB
    是一个档案或记忆体块;DDB是GDI点阵图物件并由点阵图代号表示。DIB能被显示或转换为DDB并转换回DIB,但是这里包含了装置无关位元和设备相
    关位元之间的转换程序。

      现在您将遇到一个函式,它打破了这些规则。该函式在32位元Windows版本中发表,称为CreateDIBSection,语法为:

      hBitmap = CreateDIBSection (

      hdc, // device context handle

      pInfo, // pointer to DIB information

      fClrUse, // color use flag

      ppBits, // pointer to pointer variable

      hSection, // file-mapping object handle

      dwOffset) ; // offset to bits in file-mapping object

      CreateDIBSection是Windows API中最重要的函式之一(至少在使用点阵图时),然而您会发现它很深奥并难以理解。

      让我们从它的名称开始,我们知道DIB是什么,但「DIB
    section」到底是什么呢?当您第一次检查CreateDIBSection时,可能会寻找该函式与DIB区块工作的方式。这是正确
    的,CreateDIBSection所做的就是建立了DIB的一部分(点阵图图素位元的记忆体块)。

      现在我们看一下传回值,它是GDI点阵图物件的代号,这个传回值可能是该函式呼叫最会拐人的部
    分。传回值似乎暗示著CreateDIBSection在功能上与CreateDIBitmap相同。事实上,它只是相似但完全不同。实际上,从
    CreateDIBSection传回的点阵图代号与我们在本章和上一章遇到的所有点阵图建立函式传回的点阵图代号在本质上不同。

      一旦理解了CreateDIBSection的真实特性,您可能觉得奇怪为什么不把传回值定义
    得有所区别。您也可能得出结论:CreateDIBSection应该称之为CreateDIBitmap,并且如同我前面所指出的
    CreateDIBitmap应该称之为CreateDDBitmap。

      首先让我们检查一下如何简化CreateDIBSection,并正确地使用它。首先,把最後
    两个参数hSection和dwOffset,分别设定为NULL和0,我将在本章最後讨论这些参数的用法。第二,仅在fColorUse参数设定为
    DIB_
    PAL_COLORS时,才使用hdc参数,如果fColorUse为DIB_RGB_COLORS(或0),hdc将被忽略(这与
    CreateDIBitmap不同,hdc参数用於取得与DDB相容的设备的色彩格式)。

      因此,CreateDIBSection最简单的形式仅需要第二和第四个参数。第二个参数是指向BITMAPINFO结构的指标,我们以前曾使用过。我希望指向第四个参数的指标定义的指标不会使您困惑,它实际上很简单。

      假设要建立每图素24位元的384×256位元DIB,24位元格式不需要色彩对照表,因此它是最简单的,所以我们可以为BITMAPINFO参数使用BITMAPINFOHEADER结构。

      您需要定义三个变数:BITMAPINFOHEADER结构、BYTE指标和点阵图代号:

      BITMAPINFOHEADER bmih ;

      BYTE * pBits ;

      HBITMAP hBitmap ;

      现在初始化BITMAPINFOHEADER结构的栏位

      bmih->biSize = sizeof (BITMAPINFOHEADER) ;

      bmih->biWidth = 384 ;

      bmih->biHeight = 256 ;

      bmih->biPlanes = 1 ;

      bmih->biBitCount = 24 ;

      bmih->biCompression = BI_RGB ;

      bmih->biSizeImage = 0 ;

      bmih->biXPelsPerMeter = 0 ;

      bmih->biYPelsPerMeter = 0 ;

      bmih->biClrUsed = 0 ;

      bmih->biClrImportant = 0 ;

      在基本准备後,我们呼叫该函式:

      hBitmap = CreateDIBSection (NULL, (BITMAPINFO *) &bmih, 0, &pBits, NULL, 0) ;

      注意,我们为第二个参数赋予BITMAPINFOHEADER结构的位址。这是常见的,但一个BYIE指标pBits的位址,就不常见了。这样,第四个参数是函式需要的指向指标的指标。

      这是函式呼叫所做的:CreateDIBSection检查BITMAPINFOHEADER
    结构并配置足够的记忆体块来载入DIB图素位元。(在这个例子里,记忆体块的大小为384×256×3位元组。)它在您提供的pBits参数中储存了指向
    此记忆体块的指标。函式传回点阵图代号,正如我说的,它与CreateDIBitmap和其他点阵图建立函式传回的代号不一样。

      然而,我们还没有做完,点阵图图素是未初始化的。如果正在读取DIB档案,可以简单地把pBits参数传递给ReadFile函式并读取它们。或者可以使用一些程式码「人工」设定。

    -----

    Tiff图像文件

    标签图像文件格式 文件扩展名: .tiff, .tif
      开发者: Aldus
      格式类型: 图像文件格式
      标签图像文件格式(Tagged Image File Format,简写为TIFF) 是一种主要用来存储包括照片和艺术图在内的图像的文件格式。它最初由 Aldus公司与微软公司一起为PostScript打印开发。TIFF与JPEG和PNG一起成为流行的高位彩色图像格式。 TIFF格式在业界得到了广泛的支持,如Adobe公司的Photoshop、Jasc的GIMP、Ulead PhotoImpact和Paint Shop Pro等图像处理应用、QuarkXPress和Adobe InDesign这样的桌面印刷和页面排版应用,扫描、传真、文字处理、光学字符识别和其它一些应用等都支持这种格式。从 Aldus 获得了 PageMaker 印刷应用程序的 Adobe 公司现在控制着 TIFF 规范。
      术语“Tagged Image File Format”或者“Tag Image File Format”在一些早期的TIFF规范中是作为副标题存在的。目前的TIFF规范TIFF 6.0不再使用这些术语,现在的名字仅仅叫做“TIFF”。
      TIFF最初的设计目的是为了1980年代中期桌面扫描仪厂商达成一个公用的扫描图像文件格式,而不是每个厂商使用自己专有的格式。在刚开始的时候, TIFF只是一个二值图像格式,因为当时的桌面扫描仪只能处理这种格式。随着扫描仪的功能越来越强大,并且桌面计算机的磁盘空间越来越大,TIFF逐渐支持灰阶图像和彩色图像。

    灵活的选项
       TIFF 是一个灵活适应性强的文件格式。通过在文件头中包含“标签”它能够在一个文件中处理多幅图像和数据。标签能够标明图像的如图像大小这样的基本几何尺寸或者 定义图像数据是如何排列的并且是否使用了各种各样的图像压缩选项。例如,TIFF可以包含JPEG和行程长度编码压缩的图像。TIFF文件也可以包含基于 矢量的裁剪区域(剪切或者构成主体图像的轮廓)。使用无损格式存储图像的能力使TIFF文件成为图像存档的有效方法。与JPEG不同,TIFF文件可以编 辑然后重新存储而不会有压缩损失。其它的一些TIFF文件选项包括多层或者多页。
      尽管现今它是一种被广泛接受的标准格式,当TIFF最初出现的时候,它的可扩展性带来了很多兼 容问题。程序员可以随意定义新的标签和选项,但是并不是所有的实现程序都能支持这些所有这些创造出的标签。作为结果,它的一个最小特性集成为了“这 个”TIFF,即使是在今天大量的TIFF文件和读取它们的代码都是基于简单的32位非压缩图像。
      TIFF有一个使用LZW压缩的选项,这是一种减小文件大小的无损技术,但是这项技术在不同的 司法权限内为几个专利所涵盖。到了2005年,除了一个之外这些专利都已经到期,其中包括Unisys所拥有的广为人知又有很多争议的专利。另外一个著名 的专利是IBM拥有的将在2006年8月11日到期的专利,IBM也没有要加强它的意思(who has shown no interest to date in enforcing it)。
      每个TIFF文件都是从指示字节顺序的两个字节开始的。“II”表示小字节在先、“MM”表示 大字节在先字节顺序。后面的两个字节表示数字42。数字42是“为了它的deep philosophical significance"而选择的。 42的读法取决于头两个字节所表示的字节顺序。整个文件根据所指出的字节顺序进行读取。
      字节顺序在Apple Macintosh和微软视窗程序之间可能产生兼容性的问题,它们通常为TIFF文件使用不同的字节顺序。一些程序提供了保存为Mac或者是Windows字节顺序的选项以使文件能在交叉平台使用。

    文档图像中的TIFF

       TIFF格式是文档图像和文档管理系统中的标准格式。在这种环境中它通常使用支持黑白(也称为二值或者单色)图像的CCITT Group IV 2D压缩。在大量生产的环境中,文档通常扫描成黑白图像(而不是彩色或者灰阶图像)以节约存储空间。A4大小200dpi(每英寸点数分辨率)扫描结果平 均大小是30KB,而300dpi的扫描结果是50KB。300dpi比200dpi更加常用。
      由于TIFF格式支持多页,多页文件能够存在一个TIFF文件中而不是让每个扫描页存在一系列的文件中。 

     

    转载于:https://www.cnblogs.com/SingleCat/archive/2010/01/22/1654144.html

    展开全文
  • 几种常见的图像处理的方法

    万次阅读 2012-03-21 17:09:52
    本章所涉及的方法:灰度化...这里我们处理的是bmp格式的图像,bmp格式文件有3个文件头,第一个文件头大小为14个字节,主要是对整个文件的信息的存储。 typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD

    本章所涉及的方法有:灰度化彩色图像,将图像转换为ASNII码文件,直方图均衡化,伽马校正,哈尔小波变换。

    0.知识储备

    这里我们处理的是bmp格式的图像,bmp格式的文件有3个文件头,第一个文件头大小为14个字节,主要是对整个文件的信息的存储。

    typedef struct tagBITMAPFILEHEADER {
            WORD    bfType;
            DWORD   bfSize;
            WORD    bfReserved1;
            WORD    bfReserved2;
            DWORD   bfOffBits;
    } BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

    第二个文件头大小为50个字节,主要存储了图像的信息,比如,图像有多少行,多少列,大小等等。

    typedef struct tagBITMAPINFOHEADER{
            DWORD      biSize;
            LONG       biWidth;
            LONG       biHeight;
            WORD       biPlanes;
            WORD       biBitCount;
            DWORD      biCompression;
            DWORD      biSizeImage;
            LONG       biXPelsPerMeter;
            LONG       biYPelsPerMeter;
            DWORD      biClrUsed;
            DWORD      biClrImportant;
    } BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

    第三个文件头,是图像的调色板,这里我们使用的文件是24位真彩,所以没有调色板,这个文件头不存在,所以我就不列在下面了。

    注意:bmp格式图像数据是倒着存贮的,具体可以参考百度百科http://baike.baidu.com/view/7671.htm#2


    1.将彩色图像转换为灰度图像

    我们都知道,图像是一像素为单位的,一个像素有三个色彩分量组成,即RGB(红绿蓝),每一个分量由8位(一个字节)组成,范围是0-255 。灰度图像可由彩色图像转化,可以使用公式gray = 0.3*red+0.59*green+0.11*blue,并且三个分量的值相等,即red = gray,green=gray,blue=gray。那么,我们的图像就变成了灰度图像。

    /********************************************
     *	   将文件转换成灰度图像		    *
     ********************************************/
    int CBitMapFile::turn2Gray()
    {
    	if (m_imageArray == NULL)
    	{
    		return -2;
    	}
    	
    	for (int i =0,j= 0,k=0;i<m_sizeImage;)
    	{
    		//转换为灰度图像,注意填充的字节
    		BYTE blue,green,red,gray;
    
    		blue = m_imageArray[i];
    		green = m_imageArray[i+1];
    		red = m_imageArray[i+2];
    		
    		m_realColorImageArray[k] = blue;
    		m_realColorImageArray[k+1] = green;
    		m_realColorImageArray[k+2] = red;
    
    		gray = (BYTE)(0.3*red+0.59*green+0.11*blue);
    
    		m_imageArray[i] = gray;
    		m_imageArray[i+1] = gray;
    		m_imageArray[i+2] = gray;
    
    		m_realImageArray[j] = m_imageArray[i];
    
    		i += 3;
    		k += 3;
    		j++;
    
    		跳过填充字节
    		if (j % m_width == 0)
    		{
    			i += m_addByte;
    		}
    		
    	}
    	
    	return 1;
    }


    2.图像转换为ASNII码文件

    三个步骤:(1)提取图像数据(2)建立映射表(3)处理灰度并映射

    映射表我建立的是8个字符'@','$','#','%','!','~','^','`'

    把灰度值除上32将其范围映射到0-7这个范围内。

    将灰度值按照映射表映射。

    /******************************************
     *对图像的每个像素做文本映射,最终写入文件*
     ******************************************/
    int CBitMapFile::turn2Txt(CFile& txtFile)
    {
    	char* _txtBuf = new char[m_width*m_height+2*m_height];
    	memset(_txtBuf,0,m_width*m_height+2*m_height);
    
    	//文本映射
    	char txtMap[8] = {'@','$','#','%','!','~','^','`'};
    
    	char* _buf = new char[m_width+2];
    	memset(_buf,0,m_width+2);
    	//TRACE(_T("\'\\r\'=%x,\'\\n\'=%x"),'\r','\n');
    	for (int i = m_height-1;i>=0;i--)
    	{
    		for (int j = 0;j<m_width;j++)
    		{
    			_buf[j] = txtMap[m_realImageArray[i*m_width+j]>>5];
    			
    		}
    		
    		_buf[m_width] = '\r';
    		_buf[m_width+1] = '\n';
    		
    		for (int k=0;k<m_width+2;k++)
    		{
    			_txtBuf[(m_height-1-i)*m_width+k+(m_height-1-i)*2] = _buf[k];
    		
    		}
    	}
    	
    	txtFile.Write(_txtBuf,sizeof(char)*(m_width*m_height+2*m_height));
    
    	delete _txtBuf;
    	delete _buf;
    	return 1;
    }

    3.直方图均衡化

    每一幅图像都有自己的直方图


    图像取自冈萨雷斯的《数字图像处理》第三版

    这幅图像的灰度大部分集中在较高的灰度,均衡化就使图像在概率率较大的地方稀疏一点,概率较小的地方稠密一点。

    方法是:(1)统计各个灰度的概率(2)归一化(3)画直方图(4)累计概率(5)取整得到映射(6)将原灰度值映射到新灰度值

    /********************************************
     *	对bmp文件的每个像素的灰度值进行统计		*
     ********************************************/
    int CBitMapFile::addupLevel()
    {
    	for (int i = 0;i<m_width*m_height;i++)
    	{
    		m_grayStatistic[m_realImageArray[i]] += 1;
    		
    	}
    	for (int i = 0;i<256;i++)
    	{
    		if (m_grayStatistic[i]>m_max)
    		{
    			m_max = m_grayStatistic[i];
    		}
    	
    	}
    	//TRACE(_T("m_max = %d\n"),m_max);
    	return 1;
    }
    /********************************************
     *	对bmp文件的每个像素的灰度值进行归一化	*
     *		并计算每个像素灰度值的概率			*
     ********************************************/
    int CBitMapFile::turn2One()
    {
    	for (int i =0;i<256;i++)
    	{
    		m_grayTurn2OneData[i] = (double)m_grayStatistic[i]/m_max;
    		m_grayFrequencyPerLevel[i] = (double)m_grayStatistic[i]/(m_width*m_height);
    	
    	}
    	m_maxFrequency = m_max/(m_width*m_height);
    	return 1;
    }
    
    /********************************************
     *	清除统计数组、归一化数组、频率数组		*
     ********************************************/
    void CBitMapFile::clearup()
    {
    	memset(m_grayStatistic,0,sizeof(LONG)*256);
    	memset(m_grayTurn2OneData,0,sizeof(double)*256);
    	memset(m_grayFrequencyPerLevel,0,sizeof(double)*256);
    	m_max = 0;
    	m_maxFrequency = 0.0f;
    }
    /********************************************
     *				灰度均衡化					*
     ********************************************/
    void CBitMapFile::equation(CFile& file)
    {
    	double _temp =0.0f;
    	double* _array = new double[256];
    	memset(_array,0,sizeof(double)*256);
    	int* _intArray = new int[256];
    	memset(_intArray,0,sizeof(int)*256);
    	BYTE* _writeArray = new BYTE[m_sizeImage];
    	memset(_writeArray,0,sizeof(BYTE)*m_sizeImage);
    	for(int i = 0;i<256;i++)
    	{
    		_array[i] = ((m_grayFrequencyPerLevel[i])*255)+_temp;
    		_temp = _array[i];
    		
    	}
    	for (int i = 0;i<256;i++)
    	{
    		_intArray[i] = (int)(_array[i]);
    	}
    	for (int i = 0,j = 0;i<m_sizeImage;)
    	{
    		
    		_writeArray[i] = _intArray[m_realImageArray[j]];
    		_writeArray[i+1] = _intArray[m_realImageArray[j]];
    		_writeArray[i+2] = _intArray[m_realImageArray[j]];
    		j++;
    		i += 3;
    		if (j%m_width == 0)
    		{
    			for (int k = 0;k<m_addByte;k++)
    			{
    				_writeArray[i+k] = 0;
    				
    			}
    			i += m_addByte;
    		}
    	}
    	file.Write(&m_file_header,sizeof(BITMAPFILEHEADER));
    	file.Write(&m_info_header,sizeof(BITMAPINFOHEADER));
    	file.Write(_writeArray,sizeof(BYTE)*m_sizeImage);
    	delete _array;
    	delete _intArray;
    	delete _writeArray;
    }


    4.伽马校正

    伽马校正其实很简单,就是将旧的灰度值通过一个由灰度值为底,伽马次幂的映射得到新的灰度值,它的做用是,对于不同的伽马系数的选取,会使得某些较亮的图片,变得对比度适当。

    /********************************************
     *				伽马校正					*
     ********************************************/
    void CBitMapFile::gammaCorrection(double gamma,CFile& file)
    {
    	//数据准备
    	double* _correctData = new double[m_width*m_height];
    	BYTE* _writeArray = new BYTE[m_sizeImage];
    	memset(_writeArray,0,sizeof(BYTE)*m_sizeImage);
    	memset(_correctData,0,sizeof(double)*m_width*m_height);
    	//算法
    	for (int i = 0;i<m_width*m_height;i++)
    	{
    		_correctData[i] = (double)m_realImageArray[i]/255;
    	
    		_correctData[i] = pow(_correctData[i],gamma)*255;
    
    	}
    	//写入文件准备
    	for (int i = 0,j = 0;i<m_sizeImage;)
    	{
    		_writeArray[i] = (BYTE)_correctData[j];
    		_writeArray[i+1] = (BYTE)_correctData[j];
    		_writeArray[i+2] = (BYTE)_correctData[j];
    		j++;
    		i += 3;
    		if (j%m_width == 0)
    		{
    			for (int k = 0;k<m_addByte;k++)
    			{
    				_writeArray[i+k] = 0;
    				
    			}
    			i += m_addByte;
    		}
    	}
    	//写入文件
    	file.Write(&m_file_header,sizeof(BITMAPFILEHEADER));
    	file.Write(&m_info_header,sizeof(BITMAPINFOHEADER));
    	file.Write(_writeArray,sizeof(BYTE)*m_sizeImage);
    	
    	delete _writeArray;
    	delete _correctData;
    }


    这个是伽马选择7.5的效果

    4.哈尔小波变换(HWT,haar wavelet tansform)

    这个是小波变换里最简单的一个,由于涉及较多的数学,这里就不做赘述了,只是附上程序。(程序使用的矩阵乘法是我自己写的,效率较低,经过测试在128*128的大小的图像效果可以,再大就会出现未响应的现象。)

    注意,哈尔小波变换的矩阵是偶数*偶数的,所以图片的行列也必须是偶数。

    Matrix.h

    #pragma once
    #define ZERO 0	//零阵
    #define IDENTITY 1//单位阵
    #define HAAR 2//HAAR小波矩阵
    #define UNSQUARE -1//非方阵
    #define UNSAME -2//非同型矩阵
    #define UNSAME -2//非同型矩阵
    #define UNEVEN -3//行列非偶数
    
    class CMatrix
    {
    public:
    	CMatrix(int r,int c);
    	CMatrix(CMatrix& m);
    	CMatrix(double* d,int r,int c);
    	CMatrix(BYTE* d,int r,int c);
    	~CMatrix();
    	int inital(int type);//初始化为单位阵,或特殊矩阵(以后扩展)
    #ifdef _DEBUG
    	void display();
    #endif
    	//
    public:
    	CMatrix& transpose();//矩阵的转置
    	void nonZero();
    	//
    public:
    	 CMatrix& operator=(CMatrix& m1);
    	 friend CMatrix operator+(CMatrix& m1,CMatrix& m2);
    	 friend CMatrix operator-(CMatrix& m1,CMatrix& m2);
    	 friend CMatrix operator*(CMatrix& m1,double& a);
    	 friend CMatrix operator*(CMatrix& m1,CMatrix& m2);
    	//
    public:
    	inline int getRow(){return m_row;}
    	inline int getCol(){return m_col;}
    	//inline CString getName(){return m_name;}
    	inline double getElem(int r,int c){return m_data[r*m_row+c];}
    	inline double* getData(){return m_data;}
    	//
    protected:
    	int m_row;
    	int m_col;
    	double* m_data;
    //	CString m_name;
    };
    


    Matrix.cpp

    #include "StdAfx.h"
    
    #include "MatrixBase.h"
    #ifdef _DEBUG
    #include <iostream>
    #endif
    
    CMatrix::CMatrix(int r,int c)
    {
    	m_row = r;
    	m_col = c;
    	m_data = new double[r*c];
    	memset(m_data,0,sizeof(double)*r*c);
    }
    CMatrix::CMatrix(double* d,int r,int c)
    {
    	m_row = r;
    	m_col = c;
    	m_data = new double[r*c];
    	for (int i = 0;i<r*c;i++)
    	{
    		m_data[i] = d[i];
    	}
    }
    CMatrix::CMatrix(BYTE* d,int r,int c)
    {
    	m_row = r;
    	m_col = c;
    	m_data = new double[r*c];
    	for (int i = 0;i<r*c;i++)
    	{
    		m_data[i] = (double)d[i];
    	}
    }
    CMatrix::CMatrix(CMatrix& m)
    {
    	this->m_row = m.m_row;
    	this->m_col = m.m_col;
    	m_data = new double[m_row*m_col];
    	for (int i = 0;i<m_row*m_col;i++)
    	{
    		this->m_data[i] = m.m_data[i];
    		TRACE(_T("data[%d]=%f\n"),i,this->m_data[i]);
    	}
    }
    CMatrix::~CMatrix()
    {
    	delete[] m_data;
    }
    int CMatrix::inital(int type)
    {
    	
    	switch(type)
    	{
    	case IDENTITY:
    		if (m_row != m_col)
    		{
    			return UNSQUARE;
    		}
    		for (int i=0;i<m_col;i++)
    		{
    			m_data[i*m_row+i] = 1;
    		}
    		break;
    	case HAAR:
    		if (m_row != m_col)
    		{
    			return UNSQUARE;
    		}
    		if (m_row%2 != 0)
    		{
    			return UNEVEN;
    		}
    		for(int i = 0;i<m_row/2;i++)
    		{
    			m_data[i*m_row+i*2] = 1;
    			m_data[i*m_row+i*2+1] = 1;
    		}
    		for (int i = m_row/2,j = 0;i<m_row;i++,j++)
    		{
    			m_data[i*m_row+j*2] = -1;
    			m_data[i*m_row+j*2+1] = 1;
    		}
    		break;
    	default:
    		break;
    	}
    	return type;
    }
    CMatrix& CMatrix::operator=(CMatrix& m1)
    {
    	ASSERT(m_row == m1.getRow() && m_col == m1.getCol());
    	for (int i = 0;i<m_row*m_col;i++)
    	{
    		m_data[i] = m1.getElem(i/m_row,i%m_row);
    		TRACE(_T("\'=\'data[%d]=%f\n"),i,m_data[i]);
    	}
    	return *this;
    }
    CMatrix operator+(CMatrix& m1,CMatrix& m2)
    {
    	ASSERT(m1.m_row == m2.m_row && m1.m_col==m2.m_col);
    	CMatrix ret(m1.m_row,m1.m_col);
    	for (int i = 0;i<m1.m_row*m1.m_col;i++)
    	{
    		ret.m_data[i] = m1.m_data[i]+m2.m_data[i];
    		TRACE(_T("ret[%d]=%f\n"),i,ret.m_data[i]);
    	}
    	return ret;
    
    }
    CMatrix operator-(CMatrix& m1,CMatrix& m2)
    {
    	ASSERT(m1.m_row == m2.m_row && m1.m_col==m2.m_col);
    	CMatrix ret(m1.m_row,m1.m_col);
    	for (int i = 0;i<m1.m_row*m1.m_col;i++)
    	{
    		ret.m_data[i] = m1.m_data[i]-m2.m_data[i];
    		TRACE(_T("ret[%d]=%f\n"),i,ret.m_data[i]);
    	}
    	return ret;
    }
    CMatrix operator*(CMatrix& m1,double& a)
    {
    	CMatrix ret(m1);
    	for (int i = 0;i<m1.m_row*m1.m_col;i++)
    	{
    		ret.m_data[i] *=a;
    		TRACE(_T("ret[%d]=%f\n"),i,ret.m_data[i]);
    	}
    	return ret;
    }
    CMatrix operator*(CMatrix& m1,CMatrix& m2)
    {
    	ASSERT(m1.m_col == m2.m_row);
    	CMatrix ret(m1.m_row,m2.m_col);
    	for (int i= 0;i<m1.m_row;i++)
    	{
    		for (int j = 0;j<m2.m_col;j++)
    		{
    			double _temp = 0;
    			for (int k = 0;k<m1.m_col;k++)
    			{
    				_temp += m1.m_data[i*m1.m_row+k]*m2.m_data[k*m2.m_row+j];
    			}
    			ret.m_data[i*m1.m_row+j] = _temp;
    		}
    	}
    	return ret;
    }
    CMatrix& CMatrix::transpose()
    {
    	double* _newData = new double[m_row*m_col];
    	
    	for (int i = 0;i<m_row;i++)
    	{
    		for (int j=0;j<m_col;j++)
    		{
    			_newData[j*m_col+i] = m_data[i*m_row+j];
    		}
    	}
    	delete m_data;
    	m_data = _newData;
    		
    	return *this;
    	
    }
    void CMatrix::nonZero()
    {
    	for (int i = 0;i<m_row;i++)
    	{
    		for (int j = 0;j<m_col;j++)
    		{
    			if(m_data[i*m_row+j]<0)
    			{
    				m_data[i*m_row+j]=0;
    			}
    		}
    	}
    }
    #ifdef _DEBUG
    void CMatrix::display()
    {
    	std::cout<<"[\n";
    	for (int i = 0;i<m_row*m_col;i++)
    	{
    		std::cout<<m_data[i]<<" ,";
    		if ((i+1)%m_row == 0)
    		{
    			std::cout<<std::endl;
    		}
    	}
    	std::cout<<"]"<<std::endl;
    }
    #endif
    


    哈尔小波变换函数

    /********************************************
     *				HAAR小波变换				*
     ********************************************/
    void CBitMapFile::haarTransform(CFile& file)
    {
    	CMatrix imageMatrix(m_realImageArray,m_height,m_width);
    	CMatrix haarMatrix_r(m_height,m_height);
    	CMatrix haarMatrix_c(m_width,m_width);
    #ifdef _DEBUG
    	imageMatrix.display();
    #endif
    	haarMatrix_c.inital(HAAR);
    	haarMatrix_c = haarMatrix_c.transpose();
    	haarMatrix_r.inital(HAAR);
    	imageMatrix = haarMatrix_r*imageMatrix;
    	double _d = 0.25*sqrt(2.0);
    	imageMatrix = imageMatrix*_d;
    	imageMatrix = imageMatrix*haarMatrix_c;
    	imageMatrix = imageMatrix*_d;
    	
    
    	imageMatrix.nonZero();
    #ifdef _DEBUG
    	imageMatrix.display();
    #endif	
    	
    	double* _correctData = imageMatrix.getData();
    	BYTE* _writeArray = new BYTE[m_sizeImage];
    	memset(_writeArray,0,sizeof(BYTE)*m_sizeImage);
    
    	for (int i = 0,j = 0;i<m_sizeImage;)
    	{
    		_writeArray[i] = (BYTE)_correctData[j];
    		_writeArray[i+1] = (BYTE)_correctData[j];
    		_writeArray[i+2] = (BYTE)_correctData[j];
    		j++;
    		i += 3;
    		if (j%m_width == 0)
    		{
    			for (int k = 0;k<m_addByte;k++)
    			{
    				_writeArray[i+k] = 0;
    
    			}
    			i += m_addByte;
    		}
    	}
    	file.Write(&m_file_header,sizeof(BITMAPFILEHEADER));
    	file.Write(&m_info_header,sizeof(BITMAPINFOHEADER));
    	file.Write(_writeArray,sizeof(BYTE)*m_sizeImage);
    
    	delete _writeArray;
    	//delete _correctData;
    }


    处理后图像

    由于bmp格式是倒着存储图像数据的,因为个人时间原因没有将其倒回,所以出现这种现象。

    实验软件可以在这里下载:http://download.csdn.net/detail/smells2/4162515

     

    展开全文
  • 图片的几种格式

    2020-05-23 11:09:34
    图片一般常见的格式有如下: 一、BMP格式 BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发...

    以下内容摘抄博主:https://www.cnblogs.com/exclusive-ada/p/3391109.html的内容

    图片一般常见的格式有如下:

    一、BMP格式

    BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大。所以,目前BMP在单机上比较流行。

    二、GIF格式

    GIF是英文Graphics Interchange Format(图形交换格式)的缩写。顾名思义,这种格式是用来交换图片的。事实上也是如此,上世纪80年代,美国一家著名的在线信息服务机构CompuServe针对当时网络传输带宽的限制,开发出了这种GIF图像格式

    GIF格式的特点是压缩比高,磁盘空间占用较少,所以这种图像格式迅速得到了广泛的应用。 最初的GIF只是简单地用来存储单幅静止图像(称为GIF87a),后来随着技术发展,可以同时存储若干幅静止图象进而形成连续的动画,使之成为当时支持2D动画为数不多的格式之一(称为GIF89a),而在GIF89a图像中可指定透明区域,使图像具有非同一般的显示效果,这更使GIF风光十足。目前Internet上大量采用的彩色动画文件多为这种格式的文件,也称为GIF89a格式文件。

    此外,考虑到网络传输中的实际情况,GIF图像格式还增加了渐显方式,也就是说,在图像传输过程中,用户可以先看到图像的大致轮廓,然后随着传输过程的继续而逐步看清图像中的细节部分,从而适应了用户的"从朦胧到清楚"的观赏心理。目前Internet上大量采用的彩色动画文件多为这种格式的文件。

    但GIF有个小小的缺点,即不能存储超过256色的图像。尽管如此,这种格式仍在网络上大行其道应用,这和GIF图像文件短小、下载速度快、可用许多具有同样大小的图像文件组成动画等优势是分不开的。

    三、JPEG格式

    JPEG也是常见的一种图像格式,它由联合照片专家组(Joint Photographic Experts Group)开发并以命名为"ISO 10918-1",JPEG仅仅是一种俗称而已。JPEG文件的扩展名为.jpg或.jpeg,其压缩技术十分先进,它用有损压缩方式去除冗余的图像和彩色数据,获取得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像质量。

    同时JPEG还是一种很灵活的格式,具有调节图像质量的功能,允许你用不同的压缩比例对这种文件压缩,比如我们最高可以把1.37MB的BMP位图文件压缩至20.3KB。当然我们完全可以在图像质量和文件尺寸之间找到平衡点。

    由于JPEG优异的品质和杰出的表现,它的应用也非常广泛,特别是在网络和光盘读物上,肯定都能找到它的影子。目前各类浏览器均支持JPEG这种图像格式,因为JPEG格式的文件尺寸较小,下载速度快,使得Web页有可能以较短的下载时间提供大量美观的图像,JPEG同时也就顺理成章地成为网络上最受欢迎的图像格式。

    四、JPEG2000格式

    JPEG 2000同样是由JPEG 组织负责制定的,它有一个正式名称叫做"ISO 15444",与JPEG相比,它具备更高压缩率以及更多新功能的新一代静态影像压缩技术

    JPEG2000 作为JPEG的升级版,其压缩率比JPEG高约30%左右。与JPEG不同的是,JPEG2000 同时支持有损和无损压缩,而 JPEG 只能支持有损压缩。无损压缩对保存一些重要图片是十分有用的。JPEG2000的一个极其重要的特征在于它能实现渐进传输,这一点与GIF的"渐显"有异曲同工之妙,即先传输图像的轮廓,然后逐步传输数据,不断提高图像质量,让图象由朦胧到清晰显示,而不必是像现在的 JPEG 一样,由上到下慢慢显示。

    此外,JPEG2000还支持所谓的"感兴趣区域"特性,你可以任意指定影像上你感兴趣区域的压缩质量,还可以选择指定的部份先解压缩。 JPEG 2000和 JPEG 相比优势明显,且向下兼容,因此取代传统的JPEG格式指日可待

    JPEG2000可应用于传统的JPEG市场,如扫描仪、数码相机等,亦可应用于新兴领域,如网路传输、无线通讯等等。

    五、TIFF格式

    TIFF(Tag Image File Format)是Mac中广泛使用的图像格式,它由Aldus和微软联合开发,最初是出于跨平台存储扫描图像的需要而设计的。它的特点是图像格式复杂、存贮信息多。正因为它存储的图像细微层次的信息非常多,图像的质量也得以提高,故而非常有利于原稿的复制。

    该格式有压缩和非压缩二种形式,其中压缩可采用LZW无损压缩方案存储。不过,由于TIFF格式结构较为复杂,兼容性较差,因此有时你的软件可能不能正确识别TIFF文件(现在绝大部分软件都已解决了这个问题)。目前在Mac和PC机上移植TIFF文件也十分便捷,因而TIFF现在也是微机上使用最广泛的图像文件格式之一。

    六、PSD格式

    这是著名的Adobe公司的图像处理软件Photoshop的专用格式Photoshop Document(PSD)。PSD其实是Photoshop进行平面设计的一张"草稿图",它里面包含有各种图层、通道、遮罩等多种设计的样稿,以便于下次打开文件时可以修改上一次的设计。在Photoshop所支持的各种图像格式中,PSD的存取速度比其它格式快很多,功能也很强大。由于Photoshop越来越被广泛地应用,所以我们有理由相信,这种格式也会逐步流行起来。

    七、PNG格式

    PNG(Portable Network Graphics)是一种新兴的网络图像格式。在1994年底,由于Unysis公司宣布GIF拥有专利的压缩方法,要求开发GIF软件的作者须缴交一定费用,由此促使免费的png图像格式的诞生。PNG一开始便结合GIF及JPG两家之长,打算一举取代这两种格式。1996年10月1日由PNG向国际网络联盟提出并得到推荐认可标准,并且大部分绘图软件和浏览器开始支持PNG图像浏览,从此PNG图像格式生机焕发。

    PNG是目前保证最不失真的格式,它汲取了GIF和JPG二者的优点,存贮形式丰富,兼有GIF和JPG的色彩模式;它的另一个特点能把图像文件压缩到极限以利于网络传输,但又能保留所有与图像品质有关的信息,因为PNG是采用无损压缩方式来减少文件的大小,这一点与牺牲图像品质以换取高压缩率的JPG有所不同;它的第三个特点是显示速度很快,只需下载1/64的图像信息就可以显示出低分辨率的预览图像;第四,PNG同样支持透明图像的制作,透明图像在制作网页图像的时候很有用,我们可以把图象背景设为透明,用网页本身的颜色信息来代替设为透明的色彩,这样可让图像和网页背景很和谐地融合在一起。

    PNG的缺点是不支持动画应用效果,如果在这方面能有所加强,简直就可以完全替代GIF和JPEG了。Macromedia公司的Fireworks软件的默认格式就是PNG。现在,越来越多的软件开始支持这一格式,而且在网络上也越来截止流行。

    八、SWF格式

    利用Flash我们可以制作出一种后缀名为SWF(Shockwave Format)的动画,这种格式的动画图像能够用比较小的体积来表现丰富的多媒体形式。在图像的传输方面,不必等到文件全部下载才能观看,而是可以边下载边看,因此特别适合网络传输,特别是在传输速率不佳的情况下,也能取得较好的效果。事实也证明了这一点,SWF如今已被大量应用于WEB网页进行多媒体演示与交互性设计。此外,SWF动画是其于矢量技术制作的,因此不管将画面放大多少倍,画面不会因此而有任何损害。综上,SWF格式作品以其高清晰度的画质和小巧的体积,受到了越来越多网页设计者的青睐,也越来越成为网页动画和网页图片设计制作的主流,目前已成为网上动画的事实标准。

    九、SVG格式

    SVG可以算是目前最最火热的图像文件格式了,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language),由World Wide Web Consortium(W3C)联盟进行开发的。严格来说应该是一种开放标准的矢量图形语言,可让你设计激动人心的、高分辨率的Web图形页面。用户可以直接用代码来描绘图像,可以用任何文字处理工具打开SVG图像,通过改变部分代码来使图像具有互交功能,并可以随时插入到HTML中通过浏览器来观看。

    它提供了目前网络流行格式GIF和JPEG无法具备了优势:可以任意放大图形显示,但绝不会以牺牲图像质量为代价;字在SVG图像中保留可编辑和可搜寻的状态;平均来讲,SVG文件比JPEG和GIF格式的文件要小很多,因而下载也很快。可以相信,SVG的开发将会为Web提供新的图像标准。

    其它非主流图像格式:

    1、PCX格式

    PCX格式是ZSOFT公司在开发图像处理软件Paintbrush时开发的一种格式,这是一种经过压缩的格式,占用磁盘空间较少。由于该格式出现的时间较长,并且具有压缩及全彩色的能力,所以现在仍比较流行。

    2、DXF格式

    DXF(Autodesk Drawing Exchange Format)是AutoCAD中的矢量文件格式,它以ASCII码方式存储文件,在表现图形的大小方面十分精确。许多软件都支持DXF格式的输入与输出。

    3、WMF格式

    WMF(Windows Metafile Format)是Windows中常见的一种图元文件格式,属于矢量文件格式。它具有文件短小、图案造型化的特点,整个图形常由各个独立的组成部分拼接而成,其图形往往较粗糙。

    4、EMF格式

    EMF(Enhanced Metafile)是微软公司为了弥补使用WMF的不足而开发的一种Windows 32位扩展图元文件格式,也属于矢量文件格式,其目的是欲使图元文件更加容易接受

    5、LIC(FLI/FLC)格式

    Flic格式由Autodesk公司研制而成,FLIC是FLC和FLI的统称:FLI是最初的基于320×200分辨率的动画文件格式,而FLC则采用了更高效的数据压缩技术,所以具有比FLI更高的压缩比,其分辨率也有了不少提高。

    6、EPS格式

    EPS(Encapsulated PostScript)是PC机用户较少见的一种格式,而苹果Mac机的用户则用得较多。它是用PostScript语言描述的一种ASCII码文件格式,主要用于排版、打印等输出工作。

    7、TGA格式

    TGA(Tagged Graphics)文件是由美国Truevision公司为其显示卡开发的一种图像文件格式,已被国际上的图形、图像工业所接受。TGA的结构比较简单,属于一种图形、图像数据的通用格式,在多媒体领域有着很大影响,是计算机生成图像向电视转换的一种首选格式。

    展开全文
  • 前言:生活在自媒体时代,我们碰见最多的莫过于图片和视频了,今天时间总结一下几种常见的图片的格式以及它们的优缺点,应用情况。 一:JPG/JPEG格式(有损压缩) jpeg是一种面向连续色调静止图像的压缩标准,它...

    前言:生活在自媒体时代,我们碰见最多的莫过于图片和视频了,今天有时间总结一下几种常见的图片的格式以及它们的优缺点,应用情况。

    一:JPG/JPEG格式(有损压缩)

     jpeg是一种面向连续色调静止图像的压缩标准,它是一种压缩标准,压缩标准决定了图像该以什么样的压缩方式变成文件格式存储于硬盘上。。jpg和jpeg是文件的后缀名,它的应用广泛,优点是压缩率高,同时不会对画质有太大的影响,特别适合在网络媒体上存储、传输图像信息。它的缺点也是压缩率过高,导致图像信息的破坏,在对画质要求大于存储传输的方面,jpeg格式就不适合了。

    二:PNG格式(无损压缩、透明度)

    png是便携式网络图像,相比于jpeg的有损压缩方式,png 采用了无损压缩的方式,这样就不会在多次保存中对图像信息进行损坏。

    png还有一个明显特征,支持透明度信息。可以联想抠图过程,知道透明度信息的用处了吧,选择png格式。

    三:TIFF格式/PSD (图层信息、可编辑、原稿、草稿)

    标签图像文件格式,少见,是Mac中广泛bai使用的du图像格式,主要用于编辑图像的过程。和ps保存出来的psd文件类似,带有图层信息的。TIFF兼容性好,而PSD只能用Adobe下的相关软件打开。正因为它存储的图像细微层次的信息非常多,图像的质量也得以提高,故而非常有利于原稿的复制。PSD其实是Photoshop进行平面设计的一张"草稿图",PSD的存取速度比其它格式快很多,功能也很强大

    四:ICO格式(桌面图标、有透明度)

    这种格式很多,它是windows平台上的图标文件格式,桌面上的各种各样的应用图标都需要ico这种文件格式去记录。它也支持透明度,不然我们看到桌面的所有图标都会是方形的了。

    五:SVG格式(矢量图、代码实现、体积小,质量佳)

    它是基于XML(Extensible Markup Language),由World Wide Web Consortium(W3C)联盟进行开发的。严格来说应该是一种开放标准的矢量图形语言,可让你设计激动人心的、高分辨率的Web图形页面。用户可以用代码描绘图像,可以用任何文字处理工具打开svg图像,通过改变部分代码来使图像具有互交功能,并可以随时插入到HTML中通过浏览器来观看。它提供了目前网络流行格式GIF和JPEG无法具备了优势:可以任意放大图形显示,但绝不会以牺牲图像质量为代价;字在SVG图像中保留可编辑和可搜寻的状态;平均来讲,SVG文件比JPEG和GIF格式的文件要小很多,因而下载也很快。可以相信,SVG的开发将会为Web提供新的图像标准。

    六:GIF格式(图形交换格式、无损压缩、表情包,渐显方式)

     是一种古老的图片的格式,它的特别是支持多帧动画,表情图。考虑到网络传输中的实际情况,GIF图像格式还增加了渐显方式,也就是说,在图像传输过程中,用户可以先看到图像的大致轮廓,然后随着传输过程的继续而逐步看清图像中的细节部分,从而适应了用户观看体验。这和GIF图像文件短小、下载速度快、可用许多具有同样大小的图像文件组成动画等优势是分不开的。GIF最多只能支持256色。

    总结::

    JPEG(.jpg)是最好的文件类型。因为JPEG的图片文件格式通过压缩数据,可以创建高质量图片的小文件,是存储和共享图片的最佳选择。如果需要高质量的视觉效果,应该以TIFF(.tif)格式保存,或以最低的可用压缩等级保存JPEG图片。

    展开全文
  • 常见的图形格式

    2008-03-12 10:19:10
    我们常用到的图形格式有以下几种: ⑴.BMP――(Bimap) 是Microsoft公司图形文件自身的点位图格式, 支持1~24bit色彩,在保存为这种格式时弹出的对话框会询问用于Windows或是0S/2系统。BMP格式保存的图像质量不变,...
  • JPEG是一针对图片广泛运用的有损压缩方法,是数码相机和其他摄影设备上使用最常见的图片格式。因此,JPG和JPEG文件损坏对用户用说是个大麻烦—不能读取和查看照片。下方列出可能导致JPEG文件损毁的原因: JPEG...
  • 它是以GIF,JPG,Flash等格式创建的图像文件,定位在网页中用来展现广告内容。网幅广告具有诸如通栏、旗帜、按钮、对联、浮动等表现形式。常见的横幅尺寸为:950 * 60通栏Banner,468 * 60全尺寸Banner,12...
  • 本文用来介绍目标检测中常见的几种数据格式,以及格式之间的相互转换代码。1、数据格式我之前整理了图像分类和目标检测领域常用的数据集,点此查看:链接下图也给出了常用的数据集,本文主要关注PASCAL VOC、...
  • 前几篇梳理了常见的几种图片格式,想必大家已经稍微摸出了一些门道。图片的组织格式一般都是分为多个数据段,每一个数据段代表着不同的信息,可能是图像宽高等信息,也可能是开始或结束的标识符,亦或是压缩的数据段...
  • 图像有几种不同类型,每种都有用途。您将遇到某些文件后缀是JPEG,TIFF,PSD,BMP,PICT和PNG。以下是使用每种图像文件的一些一般准则: 何时使用JPEG 联合图像专家组(JPEG或JPG)最适合用于照片,当您需要保持...
  • 互联网广告表现形式几种

    千次阅读 2019-06-20 09:50:49
    它是以GIF,JPG,Flash等格式创建的图像文件,定位在网页中用来展现广告内容。网幅广告具有诸如通栏、旗帜、按钮、对联、浮动等表现形式。常见的横幅尺寸为:950 * 60通栏Banner,468 * 60全尺寸Banner,12...
  • 首先来说,最常见的图像文件类型bmp,jpg,png等等。每一种都他们各自文件格式和特点。 但是对于多媒体级别的图像来说(硬件加速连续快速的渲染不同的图像),这几种格式都不能直接渲染。 在windows上,图像...
  • 文件后缀

    2018-01-15 17:41:24
    的确,由于各个公司在开发图形有关的软件时都自制标准,导致今日在图形方面太多的格式,以下就是常见的几种格式: 首先是一种位图文件格式,它是一组点(像素)组成的图像,它们由图像程序生成或在扫描图像时创建...
  • JPEG 图片存储格式与元数据解析

    千次阅读 2019-09-03 16:27:20
    说到图片,我们首先会想到,几种常见图片格式,如:.jpg, .png, .gif 等。 但当我门在说图片的格式时,除了在说图片文件的后缀不同,还有什么不同呢? 事实上,图片的格式,在技术上,是指图片所遵循压缩标准。更...
  • 第一章 Photoshop基础知识 课堂练习 思考并回答以下问题...Photoshop最常用的颜色模式有哪几种 4常见的图形图像文件格式有几种 作业 计算机处理的图像有哪两类 二者的区别 分辨率主要分为哪几类各自的定义 各举一例说
  • 4、以上几种效果在一幅图像综合运用:用PSDTO3D软件伏做图,可以使立体、变画、动画、旋转、缩放等特殊效果同时在一幅画面中体现,具体做法是用上述方法分别做好各种效果,进行分组链接即可。 5、“文件”菜单...
  • 通过单次/组合使用,可实现常见的文件批量更名需要和一些文件批量处理需要。集专一性、普适性、灵活性。界面友好,人性化设计,功能实用,是一款不可多得的实用性强的小工具箱;具体用法和操作,会实时的操作提示...
  • 本书在向个人电脑用户,系统而详细地讲解了电脑的常见故障,同时让读者更直接、更深刻地了解电脑故障产生原因和排除方法,从而达到能够自己解决电脑故障目的。 本书分10章,共有1000多个实例,编写时从产生电脑...
  •  异常表示程序运行过程中可能出现非正常状态,运行时异常表示虚拟机通常操作中可能遇到异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生非运行时异常,但是并不要求必须声明抛出未被捕获...
  • 查看程序插件,用于在内置查看器和快速查看窗口内显示特殊类型文件,如常见文档、网页、图像、数据库、AutoCAD 图形、可执行程序、图标等文件内容。 文件系统插件,用于对注册表、环境变量等无法通过驱动器符直接...
  • 从一个数据库查询中产生一个图形图像在各种环境下有区别,本文将分两部分介绍。...有几种不同的算法可以用来产生treemap.我选择 pivot 算法,该算法能够避免一个常见的问题,即非常小的数据会挤到另外一个小区域内。
  • 11.1.2 MATLAB 支持的图像文件格式 11.1.3 MATLAB 图像类型 11.1.4 MATLAB 图像类型转换 11.1.5 MATLAB 图像数据读/写 11.2 图像显示 11.2.1 标准图像显示技术 11.2.2 特殊图像显示技术 11.3 图像运算...
  • 11.1.2 MATLAB 支持的图像文件格式 11.1.3 MATLAB 图像类型 11.1.4 MATLAB 图像类型转换 11.1.5 MATLAB 图像数据读/写 11.2 图像显示 11.2.1 标准图像显示技术 11.2.2 特殊图像显示技术 11.3 图像运算...
  • 随着博客人数增加, Blog 作为一生活方式、新工作方式、新学习方式已经被越来越多人所接受,并且在改变传统网络和社会结构:网络信息不再是虚假不可验证,交流和沟通更明确选择和方向性,单一...
  • IV:Open Inventor中使用的文件格式 IVD:超过20/20微观数据维数或变量等级文件 IVP:超过20/20用户子集配置文件 IVT:超过20/20表或集合数据文件 IVX:超过20/20微数据目录文件 IW:Idlewild屏幕保护程序 ...
  • LSHBOX:局部敏感算法(LSH)C++工具箱,提供了好几种普遍LSH算法,也可以支持Python和MATLAB。 PGM-index:能够快速查找、前导、范围搜索和更新数以亿计项数组数据结构,其跟传统索引相比,使用梯度顺序而...
  • 数据处理工具BDE(BorlandDatabaseEngine)是一个标准中介软件层,可以用来处理当前流行数据格式,如xBase、Paradox等,也可以通过BDESQLLink直接与Sybase、SQLServer、Informix、Oracle等大型数据库连接。...

空空如也

空空如也

1 2 3 4
收藏数 80
精华内容 32
关键字:

常见的图像文件格式有几种