图片的四种格式.jpg、.gif、.png、.bmp各是啥意思?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图片的四种格式.jpg、.gif、.png、.bmp各是啥意思?相关的知识,希望对你有一定的参考价值。
图片的四种格式.jpg、.gif、.png、.bmp各是什么意思?请解释一下
以不同的格式保持文件会有什么不同呢?效果有什么不同吗?
1、文件后辍名为".jpg"或".jpeg",是最常用的图像文件格式,由一个软件开发联合会组织制定,是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。
2、图形交换格式(外语简称:GIF、外语全称:Graphics Interchange Format),是CompuServe公司在 1987年开发的图像文件格式。
GIF文件的数据,是一种基于LZW算法的连续色调的无损压缩格式。其压缩率一般在50%左右,它不属于任何应用程序。几乎所有相关软件都支持它,公共领域有大量的软件在使用GIF图像文件。
3、便携式网络图形(外语简称PNG、外语全称:Portable Network Graphics),是网上接受的最新图像文件格式。PNG能够提供长度比GIF小30%的无损压缩图像文件。它同时提供 24位和48位真彩色图像支持以及其他诸多技术性支持。
由于PNG非常新,所以并不是所有的程序都可以用它来存储图像文件,但Photoshop可以处理PNG图像文件,也可以用PNG图像文件格式存储。
4、BMP 是(Windows 位图) Windows 位图可以用任何颜色深度(从黑白到 24 位颜色)存储单个光栅图像。Windows 位图文件格式与其他 Microsoft Windows 程序兼容。它不支持文件压缩,也不适用于 Web 页。
Windows 位图文件格式的缺点超过了它的优点。为了保证照片图像的质量,请使用 PNG 、JPEG、TIFF 文件。BMP 文件适用于 Windows 中的墙纸。
扩展资料:
jpg格式的图片转换成tif图片格式的方法:
1、首先在格式工厂软件首页的图片下面点击你要转换的最终格式【TIF】。
2、然后在此操作页面点击【添加文件】。
3、接着选择你要改变格式的照片,然后点击下方的【打开】。
4、接着点击上方的【确定】。
5、在任务的启动页面的上方点击【开始】就可以实现jpg格式的图片转换成tif图片格式。
6、图片格式就变成“tif”格式了。
参考技术A JPG格式是最常用的图像文件格式,由一个软件开发联合会组织制定,是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量明显降低,如果追求高品质图像,不宜采用过高压缩比例。
但是JPEG压缩技术十分先进,它用有损压缩方式去除冗余的图像数据,在获得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像品质。
而且JPEG是一种很灵活的格式,具有调节图像质量的功能,允许用不同的压缩比例对文件进行压缩,支持多种压缩级别,压缩比率通常在10:1到40:1之间,压缩比越大,品质就越低;相反地,压缩比越小,品质就越好。比如可以把1.37Mb的BMP位图文件压缩至20.3KB。当然也可以在图像质量和文件尺寸之间找到平衡点。
JPEG格式压缩的主要是高频信息,对色彩的信息保留较好,适合应用于互联网,可减少图像的传输时间,可以支持24bit真彩色,也普遍应用于需要连续色调的图像。
GIF 是用于压缩具有单调颜色和清晰细节的图像(如线状图、徽标或带文字的插图)的标准格式。
GIF分为静态GIF和动画GIF两种,支持透明背景图像,适用于多种操作系统,“体型”很小,网上很多小动画都是GIF格式。其实GIF是将多幅图像保存为一个图像文件,从而形成动画,所以归根到底GIF仍然是图片文件格式。但GIF只能显示256色。
GIF主要分为两个版本,即GIF 89a和GIF 87a:
GIF 87a:是在1987年制定的版本
GIF 89a:是1989年制定的版本。在这个版本中,为GIF文档扩充了图形控制区块、备注、说明、应用程序编程接口等四个区块,并提供了对透明色和多帧动画的支持
GIF格式自1987年由CompuServe公司引入后,因其体积小而成像相对清晰,特别适合于初期慢速的互联网,而从此大受欢迎。它采用无损压缩技术,只要图像不多于256色,则可既减少文件的大小,又保持成像的质量。(当然,现在也存在一些hack技术,在一定的条件下克服256色的限制,具体参见真彩色)然而,256色的限制大大局限了GIF文件的应用范围,如彩色相机等。(当然采用无损压缩技术的彩色相机照片亦不适合通过网络传输。)另一方面,在高彩图片上有着不俗表现的JPG格式却在简单的折线上效果差强人意。因此GIF格式普遍适用于图表,按钮等等只需少量颜色的图像(如黑白照片)。
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程序中是因为它压缩比高,生成文件容量小。
使用彩色查找表或者叫做调色板可支持256种颜色的彩色图像。
流式读/写性能(streamability):图像文件格式允许连续读出和写入图像数据,这个特性很适合于在通信过程中生成和显示图像。
逐次逼近显示(progressive display):这种特性可使在通信链路上传输图像文件的同时就在终端上显示图像,把整个轮廓显示出来之后逐步显示图像的细节,也就是先用低分辨率显示图像,然后逐步提高它的分辨率。
透明性(transparency):这个性能可使图像中某些部分不显示出来,用来创建一些有特色的图像。
辅助信息(ancillary information):这个特性可用来在图像文件中存储一些文本注释信息。
独立于计算机软硬件环境。
使用无损压缩。
PNG文件格式中要增加下列GIF文件格式所没有的特性:
每个像素为48位的真彩色图像。
每个像素为16位的灰度图像。
可为灰度图和真彩色图添加α通道。
添加图像的γ信息。
使用循环冗余码(cyclic redundancy code,CRC)检测损害的文件。
加快图像显示的逐次逼近显示方式。
标准的读/写工具包。
可在一个文件中存储多幅图像。
BMP是一种与硬件设备无关的图像文件格式,使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
典型的BMP图像文件由四部分组成:
1:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;
2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。
位图的类型:
位图一共有两种类型,即:设备相关位图(DDB)和设备无关位图(DIB)。DDB位图在早期的Windows系统(Windows 3.0以前)中是很普遍的,事实上它也是唯一的。然而,随着显示器制造技术的进步,以及显示设备的多样化,DDB位图的一些固有的问题开始浮现出来了。比如,它不能够存储(或者说获取)创建这张图片的原始设备的分辨率,这样,应用程序就不能快速的判断客户机的显示设备是否适合显示这张图片。为了解决这一难题,微软创建了DIB位图格式。
设备无关位图 (Device-Independent Bitmap)
DIB位图包含下列的颜色和尺寸信息:
* 原始设备(即创建图片的设备)的颜色格式。
* 原始设备的分辨率。
* 原始设备的调色板
* 一个位数组,由红、绿、蓝(RGB)三个值代表一个像素。
* 一个数组压缩标志,用于表明数据的压缩方案(如果需要的话)。
以上这些信息保存在BITMAPINFO结构中,该结构由BITMAPINFOHEADER结构和两个或更多个RGBQUAD结构所组成。BITMAPINFOHEADER结构所包含的成员表明了图像的尺寸、原始设备的颜色格式、以及数据压缩方案等信息。RGBQUAD结构标识了像素所用到的颜色数据。
DIB位图也有两种形式,即:底到上型DIB(bottom-up),和顶到下型DIB(top-down)。底到上型DIB的原点(origin)在图像的左下角,而顶到下型DIB的原点在图像的左上角。如果DIB的高度值(由BITMAPINFOHEADER结构中的biHeight成员标识)是一个正值,那么就表明这个DIB是一个底到上型DIB,如果高度值是一个负值,那么它就是一个顶到下型DIB。注意:顶到下型的DIB位图是不能被压缩的。
位图的颜色格式是通过颜色面板值(planes)和颜色位值(bitcount)计算得来的,颜色面板值永远是1,而颜色位值则可以是1、4、8、16、24、32其中的一个。如果它是1,则表示位图是一张单色位图(译者注:通常是黑白位图,只有黑和白两种颜色,当然它也可以是任意两种指定的颜色),如果它是4,则表示这是一张VGA位图,如果它是8、16、24、或是32,则表示该位图是其他设备所产生的位图。如果应用程序想获取当前显示设备(或打印机)的颜色位值(或称位深度),可调用API函数GetDeviceCaps(),并将第二个参数设为BITSPIXEL即可。
显示设备的分辨率是以每米多少个像素来表明的,应用程序可以通过以下三个步骤来获取显示设备或打印机的水平分辨率:
1. 调用GetDeviceCaps()函数,指定第二个参数为HORZRES。
2. 再次调用GetDeviceCaps()函数,指定第二个参数为HORZSIZE。
3. 用第一个返回值除以第二个返回值。即:DetDeviceCaps(hDC,HORZRES)/GetDeviceCaps(hDC,HORZSIZE);
应用程序也可以使用相同的三个步骤来获取设备的垂直分辨率,不同之处只是要将HORZRES替换为VERTRES,把HORZSIZE替换为VERTSIZE,即可。
调色板是被保存在一个RGBQUAD结构的数组中,该结构指出了每一种颜色的红、绿、蓝的分量值。位数组中的每一个索引都对应于一个调色板项(即一个RGBQUAD结构),应用程序将根据这种对应关系,将像素索引值转换为像素RGB值(真实的像素颜色)。应用程序也可以通过调用GetDeviceCaps()函数来获取当前显示设备的调色板尺寸(将该函数的第二个参数设为NUMCOLORS即可)。
Win32 API支持位数据的压缩(只对8位和4位的底到上型DIB位图)。压缩方法是采用运行长度编码方案(RLE),RLE使用两个字节来描述一个句法,第一个字节表示重复像素的个数,第二个字节表示重复像素的索引值。有关压缩位图的详细信息请参见对BITMAPINFOHEADER结构的解释。
应用程序可以从一个DDB位图创建出一个DIB位图,步骤是,先初始化一些必要的结构,然后再调用GetDIBits()函数。不过,有些显示设备有可能不支持这个函数,你可以通过调用GetDeviceCaps()函数来确定一下(GetDeviceCaps()函数在调用时指定RC_DI_BITMAP作为RASTERCAPS的标志)。
应用程序可以用DIB去设置显示设备上的像素(译者注:也就是显示DIB),方法是调用SetDIBitsToDevice()函数或调用StretchDIBits()函数。同样,有些显示设备也有可能不支持以上这两个函数,这时你可以指定RC_DIBTODEV作为RASTERCAPS标志,然后调用GetDeviceCaps()函数来判断该设备是否支持SetDIBitsToDevice()函数。也可以指定RC_STRETCHDIB作为RASTERCAPS标志来调用GetDeviceCaps()函数,来判断该设备是否支持StretchDIBits()函数。
如果应用程序只是要简单的显示一个已经存在的DIB位图,那么它只要调用SetDIBitsToDevice()函数就可以。比如一个电子表格软件,它可以打开一个图表文件,在窗口中简单的调用SetDIBitsToDevice()函数,将图形显示在窗口中。但如果应用程序要重复的绘制位图的话,则应该使用BitBlt()函数,因为BitBlt()函数的执行速度要比SetDIBitsToDevice()函数快很多。
设备相关位图 (Device-Dependent Bitmaps)
设备相关位图(DDB)之所以现在还被系统支持,只是为了兼容旧的Windows 3.0软件,如果程序员现在要开发一个与位图有关的程序,则应该尽量使用或生成DIB格式的位图。
DDB位图是被一个单个结构BITMAP所描述,这个结构的成员标明了该位图的宽度、高度、设备的颜色格式等信息。
DDB位图也有两种类型,即:可废弃的(discardable)DDB和不可废弃的(nondiscardable)DDB。可废弃的DDB位图就是一种当系统内存缺乏,并且该位图也没有被选入设备描述表(DC)的时候,系统就会把该DDB位图从内存中清除(即废弃)。不可废弃的DDB则是无论系统内存多少都不会被系统清除的DDB。API函数CreateDiscardableBitmap()函数可用于创建可废弃位图。而函数CreateBitmap()、CreateCompatibleBitmap()、和CreateBitmapIndirect()可用于创建不可废弃的位图。
应用程序可以通过一个DIB位图而创建一个DDB位图,只要先初始化一些必要的结构,然后再调用CreateDIBitmap()函数就可以。如果在调用该函数时指定了CBM_INIT标志,那么这一次调用就等价于先调用CreateCompatibleBitmap()创建当前设备格式的DDB位图,然后又调用SetDIBits()函数转换DIB格式到DDB格式。(可能有些设备并不支持SetDIBits()函数,你可以指定RC_DI_BITMAP作为RASTERCAPS的标志,然后调用GetDeviceCaps()函数来判断一下)。
对应的数据结构:
1:BMP文件组成
BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。
2:BMP文件头(14字节)
BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。
其结构定义如下:
typedef struct tagBITMAPFILEHEADER
WORDbf Type; // 位图文件的类型,必须为BM(0-1字节)
DWORD bfSize; // 位图文件的大小,以字节为单位(2-5字节)
WORD bfReserved1; // 位图文件保留字,必须为0(6-7字节)
WORD bfReserved2; // 位图文件保留字,必须为0(8-9字节)
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图(10-13字节)
// 文件头的偏移量表示,以字节为单位
BITMAPFILEHEADER;
3:位图信息头(40字节)
BMP位图信息头数据用于说明位图的尺寸等信息。
typedef struct tagBITMAPINFOHEADER
DWORD biSize; // 本结构所占用字节数(14-17字节)
LONG biWidth; // 位图的宽度,以像素为单位(18-21字节)
LONG biHeight; // 位图的高度,以像素为单位(22-25字节)
WORD biPlanes; // 目标设备的级别,必须为1(26-27字节)
WORD biBitCount;// 每个像素所需的位数,必须是1(双色),(28-29字节)
// 4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),(30-33字节)
// 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD biSizeImage; // 位图的大小,以字节为单位(34-37字节)
LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数(38-41字节)
LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数(42-45字节)
DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数(46-49字节)
DWORD biClrImportant;// 位图显示过程中重要的颜色数(50-53字节)
BITMAPINFOHEADER;
4:颜色表
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:
typedef struct tagRGBQUAD
BYTE rgbBlue;// 蓝色的亮度(值范围为0-255)
BYTE rgbGreen; // 绿色的亮度(值范围为0-255)
BYTE rgbRed; // 红色的亮度(值范围为0-255)
BYTE rgbReserved;// 保留,必须为0
RGBQUAD;
颜色表中RGBQUAD结构数据的个数有biBitCount来确定:
当biBitCount=1,4,8时,分别有2,16,256个表项;
当biBitCount=24时,没有颜色表项。
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
typedef struct tagBITMAPINFO
BITMAPINFOHEADER bmiHeader; // 位图信息头
RGBQUAD bmiColors[1]; // 颜色表
BITMAPINFO;
5:位图数据
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:
当biBitCount=1时,8个像素占1个字节;
当biBitCount=4时,2个像素占1个字节;
当biBitCount=8时,1个像素占1个字节;
当biBitCount=24时,1个像素占3个字节;
Windows规定一个扫描行所占的字节数必须是
4的倍数(即以long为单位),不足的以0填充,
biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) * bi.biHeight;
具体数据举例:
如某BMP文件开头:
4D42 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000*00F8 0000 E007 0000 1F00 0000 0000 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 .... ....
BMP文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列,在上图中已用*分隔。
一、图像文件头
1)1:(这里的数字代表的是"字",即两个字节,下同)图像文件头。0x4D42=’BM’,表示是Windows支持的BMP格式。
2)2-3:整个文件大小。4690 0000,为00009046h=36934。
3)4-5:保留,必须设置为0。
4)6-7:从文件开始到位图数据之间的偏移量。4600 0000,为00000046h=70,上面的文件头就是35字=70字节。
二、位图信息头
5)8-9:位图图信息头长度。
6)10-11:位图宽度,以像素为单位。8000 0000,为00000080h=128。
7)12-13:位图高度,以像素为单位。9000 0000,为00000090h=144。
8)14:位图的位面数,该值总是1。0100,为0001h=1。
9)15:每个像素的位数。有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。1000为0010h=16。
10)16-17:压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。RLE简单地说是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。图中0300 0000为00000003h=3。
11)18-19:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于(≥位图宽度的最小的4的倍数)×位图高度×每个像素位数。0090 0000为00009000h=80×90×2h=36864。
12)20-21:用象素/米表示的水平分辨率。A00F 0000为0000 0FA0h=4000。
13)22-23:用象素/米表示的垂直分辨率。A00F 0000为0000 0FA0h=4000。
14)24-25:位图使用的颜色索引数。设为0的话,则说明使用所有调色板项。
15)26-27:对图象显示有重要影响的颜色索引的数目。如果是0,表示都重要。
三、彩色板
16)28-....(不确定):彩色板规范。对于调色板中的每个表项,用下述方法来描述RGB的值:
1字节用于蓝色分量
1字节用于绿色分量
1字节用于红色分量
1字节用于填充符(设置为0)
对于24-位真彩色图像就不使用彩色板,因为位图中的RGB值就代表了每个象素的颜色。
如,彩色板为00F8 0000 E007 0000 1F00 0000 0000 0000,其中:
00FB 0000为FB00h=1111100000000000(二进制),是蓝色分量的掩码。
E007 0000为 07E0h=0000011111100000(二进制),是绿色分量的掩码。
1F00 0000为001Fh=0000000000011111(二进制),是红色分量的掩码。
0000 0000总设置为0。
将掩码跟像素值进行“与”运算再进行移位操作就可以得到各色分量值。看看掩码,就可以明白事实上在每个像素值的两个字节16位中,按从高到低取5、6、5位分别就是r、g、b分量值。取出分量值后把r、g、b值分别乘以8、4、8就可以补齐第个分量为一个字节,再把这三个字节按rgb组合,放入存储器(同样要反序),就可以转换为24位标准BMP格式了。
四、图像数据阵列
17)27(无调色板)-...:每两个字节表示一个像素。阵列中的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。
五、存储算法
BMP文件通常是不压缩的,所以它们通常比同一幅图像的压缩图像文件格式要大很多。例如,一个800×600的24位几乎占据1.4MB空间。因此它们通常不适合在因特网或者其它低速或者有容量限制的媒介上进行传输。 根据颜色深度的不同,图像上的一个像素可以用一个或者多个字节表示,它由n/8所确定(n是位深度,1字节包含8个数据位)。图片浏览器等基于字节的ASCII值计算像素的颜色,然后从调色板中读出相应的值。更为详细的信息请参阅下面关于位图文件的部分。 n位2n种颜色的位图近似字节数可以用下面的公式计算: BMP文件大小约等于 54+4*2的n次方+(w*h*n)/8
,其中高度和宽度都是像素数。 需要注意的是上面公式中的54是位图文件的文件头,是彩色调色板的大小。另外需要注意的是这是一个近似值,对于n位的位图图像来说,尽管可能有最多2n中颜色,一个特定的图像可能并不会使用这些所有的颜色。由于彩色调色板仅仅定义了图像所用的颜色,所以实际的彩色调色板将小于。 如果想知道这些值是如何得到的,请参考下面文件格式的部分。 由于存储算法本身决定的因素,根据几个图像参数的不同计算出的大小与实际的文件大小将会有一些细小的差别。本回答被提问者采纳 参考技术B jpg图片格式
gif动态图片
png打印
bmp位图 放大不失真
将不同的图片格式(jpg、gif、png等)转换为TIFF格式
【中文标题】将不同的图片格式(jpg、gif、png等)转换为TIFF格式【英文标题】:Convert different picture formats (jpg, gif, png, etc.) to TIFF format 【发布时间】:2012-08-07 06:32:41 【问题描述】:我正在通过 OCR 从图像中读取文本。它只支持 TIFF 格式的图像。
所以,我需要将其他格式转换为 TIFF 格式。可以做到吗?请提供一些参考资料以提供帮助。
【问题讨论】:
@l--''''''---------''''''''''''这是一个不同的问题。 l--'''''------'''''''''''' - 正如@Reza所说,通过将pdf添加到列表中您提出了一个完全不同的问题,pdf 是矢量图形格式,而包括目标 tiff 在内的其他格式是位图图形格式。因此,我将回滚该编辑。 @l--''''''------'''''''''''' 你的问题是我们如何将多个文件转换为1蒂夫?所以我知道您需要拍摄一组图像 1,2,3,4 并制作 1 个图像 tiff,将所有图像 1,2,3,4 合并到一个 tiff 文件中,对吗?问题的另一部分是,您还需要涵盖 pdf 转换,对吗?因此我有你的问题的解决方案。 @maytham-ɯɐɥʇʎɐɯ 我需要能够将图像和 pdf 文件合并为 1 个 tiff 文件 @l--''''''------'''''''''''' 你会接受基于亚马逊网络服务(AWS)的吗解决方案? 【参考方案1】:如果您在 .NET 中创建 Image
对象,则可以将其保存为 TIFF。它是您可以使用的众多ImageFormat 选择之一。
例子:
var png = Image.FromFile("some.png");
png.Save("a.tiff", ImageFormat.Tiff);
您需要在项目中包含System.Drawing
程序集。该程序集将为您提供许多图像处理功能。希望对您有所帮助。
【讨论】:
您正在转换的文件或一般错误中的更多详细信息有什么奇怪的地方吗?仅对您正在尝试的内容有一个模糊的概念,很难知道您可能会遇到什么错误。 我已经在 Ms Paint 中将 tiff 图像编辑为 gif 图像。这会导致错误吗? png.Save 是一种 void 方法,因此不能将 Tiff 设置为等于其返回值 这会使图像文件的大小增加太多,从仅 748 KB (image.jpg) 增加到 4.305 KB (image.tif)。是否可以在不增加图像大小或至少不增加那么多的情况下进行这种转换?我有一个要求,即图像不应大于 200 KB,因此我尝试将 TIFF 转换为 JPG 以减小大小,然后再次将其转换回 TIFF。转换后,我计划应用更多尺寸缩减步骤,但首先我需要能够进行此转换。Image::Save
存在移动重载,可让您具体了解编码器参数。我不是 TIFF 格式方面的专家,但您可以在这里找到一些有用的细节:msdn.microsoft.com/en-us/library/…【参考方案2】:
介绍说明:
此答案涵盖赏金问题;即:我们如何 将多个文件转换为 1 个 tiff?例如,假设有 pdf, jpeg、png,我想用它们创建 1 个 tiff? 在这个答案中,我使用 https://imagemagick.org/index.php 的 .net 实现来进行图像处理,并使用 Ghostscript 来帮助读取 AI/EPS/PDF/PS 文件,以便我们可以将其转换为可信且官方来源的图像文件。李> 在我回答了这个问题后,我在电子邮件中收到了一些额外的问题,询问其他合并选项,因此我扩展了我的答案。
IMO 有两个步骤可以实现您的目标:
-
安装 pdf 转换所需的工具
从源中获取所有图像,包括 pdf 格式的文件,并将它们合并在一起
在一个 tiff 文件中。
1。安装有助于 Pdf 到图像转换的工具:
仅当您打算转换 AI/EPS/PDF/PS 文件格式时才需要执行第 1 步。否则直接跳到第2步。
为了使将 pdf 转换为任何图像格式成为可能,我们需要一个可以读取 pdf 文件的库,并且我们需要一个将其转换为图像类型的工具。为此,我们需要安装Ghostscript(GNU Affero 通用公共许可证)。
此后,我们需要在 Visual Studio 中为 .net 安装 ImageMagick.net,nuget link。
到目前为止一切顺利。
2。代码部分
第二步也是最后一步是我们需要从文件夹位置读取文件(png、jpg、bmp、pdf 等)并将每个文件添加到MagickImageCollection
,然后我们有几个选项可以合并使用AppendHorizontally
、AppendVertically
、Montage
或多页 Tiff。 ImageMagick 有很多功能,例如调整大小、分辨率等,这只是演示合并功能的示例:
public static void MergeImage(string src, string dest, MergeType type = MergeType.MultiplePage)
var files = new DirectoryInfo(src).GetFiles();
using (var images = new MagickImageCollection())
foreach (var file in files)
var image = new MagickImage(file)
Format = MagickFormat.Tif,
Depth = 8,
;
images.Add(image);
switch (type)
case MergeType.Vertical:
using (var result = images.AppendVertically())
result.AdaptiveResize(new MagickGeometry()Height = 600, Width = 800);
result.Write(dest);
break;
case MergeType.Horizontal:
using (var result = images.AppendHorizontally())
result.AdaptiveResize(new MagickGeometry()Height = 600, Width = 800);
result.Write(dest);
break;
case MergeType.Montage:
var settings = new MontageSettings
BackgroundColor = new MagickColor("#FFF"),
Geometry = new MagickGeometry("1x1<")
;
using (var result = images.Montage(settings))
result.Write(dest);
break;
case MergeType.MultiplePage:
images.Write(dest);
break;
default:
throw new ArgumentOutOfRangeException(nameof(type), type, "Un-support choice");
images.Dispose();
public enum MergeType
MultiplePage,
Vertical,
Horizontal,
Montage
运行代码
public static void Main(string[] args)
var src = @"C:\temp\Images";
var dest1 = @"C:\temp\Output\MultiplePage.tiff";
var dest2 = @"C:\temp\Output\Vertical.tiff";
var dest3 = @"C:\temp\Output\Horizontal.tiff";
var dest4 = @"C:\temp\Output\Montage.tiff";
MergeImage(src, dest1);
MergeImage(src, dest2, MergeType.Vertical);
MergeImage(src, dest3, MergeType.Horizontal);
MergeImage(src, dest4, MergeType.Montage);
这是 C:\temp\Images 中的 4 个输入文件:
运行代码后,我们在 C:\temp\Output 下得到 4 个新文件,如下所示:
4页多页Tiff
4张图片垂直合并
4张图片水平合并
4 图像蒙太奇合并
最后说明:
可以使用 System.Drawing 将多个图像合并到 tiff;并使用 System.Drawing.Imaging;不使用 ImageMagick,但 pdf 确实需要第三方转换库或工具,因此我将 Ghostscript 和 ImageMagick 用于 C#。 ImageMagick 有很多功能,所以您可以更改输出文件的分辨率、大小等。它是公认的库。
免责声明:这个答案的一部分来自我的个人网站https://itbackyard.com/how-to-convert-ai-eps-pdf-ps-to-image-file/,源代码在 github。
【讨论】:
ImageMagick 可以将输出合并到一个多页 tiff 中,而无需先合并输入图像。看我的回答。 我看到了,事情是 OP 要求提供 C# 代码,据我所知 ImageMagick 功能可以用不同的语言实现,这里包括 C#。我的观点是更改代码而不是合并,而是制作多个 tiff 页面。但正如我在 OP 的 cmets 中所理解的那样,他需要将它们合并到一个 tiff 文件中,而不是多页。如果是多页,我会更新我的答案,但我也在等待从 OP 获得一些 cmets。这不会改变 OP 需要使用 imageMagick 将 pdf 转换为图像的事实。【参考方案3】:以 tif 格式隐藏图像。在下面的示例中,将图像转换并设置为文本框。在文本框中查看图像是 (.tif 格式)。此源代码正在运行。
private void btn_Convert(object sender, EventArgs e)
string newName = System.IO.Path.GetFileNameWithoutExtension(CurrentFile);
newName = newName + ".tif";
try
img.Save(newName, ImageFormat.Tiff);
catch (Exception ex)
string error = ee.Message.ToString();
MessageBox.Show(MessageBoxIcon.Error);
textBox2.Text = System.IO.Path.GetFullPath(newName.ToString());
【讨论】:
这如何回答这个问题,它会转换 pdf 吗?它会按照 OP 的要求合并文件吗? 将pdf转tiff。使用PDF转图片转换器SDK 这正是问题所在,OP想要将包括pdf在内的多个文件转换为一个tiff文件。 创建 PQScan.PDFToImage.PDFDocument 对象的实例。加载本地 PDF 文件。获取总页数。将 PDF 文件页面转换为图像。将图像保存为 tiff 图像文件类型。 赏金问题:我们如何将多个文件转换为 1 个 tiff?例如,假设有 pdf、jpeg、png,我想从中创建 1 个 tiff?【参考方案4】:ImageMagick 命令行可以轻松做到这一点。它在大多数 Linux 系统上提供,也可用于 Mac 或 Windows。见https://imagemagick.org/script/download.php
convert image.suffix -compress XXX image.tiff
或者您可以使用
处理整个文件夹的文件mogrify -format tiff -path path/to/output_directory *
ImageMagick 支持将多个图像组合成一个多页 TIFF。并且图像可以是混合类型,甚至包括 PDF。
convert image1.suffix1 image2.suffix2 ... -compress XXX imageN.suffixN output.tiff
您可以选择多种压缩格式或不压缩。
见
https://imagemagick.org/script/command-line-processing.php
https://imagemagick.org/Usage/basics/
https://imagemagick.org/Usage/basics/#mogrify
https://imagemagick.org/script/command-line-options.php#compress
或者您可以将 Magick.Net 用于 C# 接口。见https://github.com/dlemstra/Magick.NET
ImageMagick 主页位于https://imagemagick.org。
支持的格式列在https://imagemagick.org/script/formats.php
您可以在同一命令行中轻松处理图像以调整其大小、转换为灰度、过滤(锐化)、阈值等。
见
https://imagemagick.org/Usage/
https://imagemagick.org/Usage/reference.html
【讨论】:
【参考方案5】:我用 jpg、bmp、png 和 gif 对此进行了测试。适用于 tiff 的单页和多页创建。将其传递给文件的完整路径名。希望它可以帮助某人。 (摘自 MSDN)
public static string[] ConvertJpegToTiff(string[] fileNames, bool isMultipage)
EncoderParameters encoderParams = new EncoderParameters(1);
ImageCodecInfo tiffCodecInfo = ImageCodecInfo.GetImageEncoders()
.First(ie => ie.MimeType == "image/tiff");
string[] tiffPaths = null;
if (isMultipage)
tiffPaths = new string[1];
System.Drawing.Image tiffImg = null;
try
for (int i = 0; i < fileNames.Length; i++)
if (i == 0)
tiffPaths[i] = String.Format("0\\1.tif",
Path.GetDirectoryName(fileNames[i]),
Path.GetFileNameWithoutExtension(fileNames[i]));
// Initialize the first frame of multipage tiff.
tiffImg = System.Drawing.Image.FromFile(fileNames[i]);
encoderParams.Param[0] = new EncoderParameter(
System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
tiffImg.Save(tiffPaths[i], tiffCodecInfo, encoderParams);
else
// Add additional frames.
encoderParams.Param[0] = new EncoderParameter(
System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
using (System.Drawing.Image frame = System.Drawing.Image.FromFile(fileNames[i]))
tiffImg.SaveAdd(frame, encoderParams);
if (i == fileNames.Length - 1)
// When it is the last frame, flush the resources and closing.
encoderParams.Param[0] = new EncoderParameter(
System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.Flush);
tiffImg.SaveAdd(encoderParams);
finally
if (tiffImg != null)
tiffImg.Dispose();
tiffImg = null;
else
tiffPaths = new string[fileNames.Length];
for (int i = 0; i < fileNames.Length; i++)
tiffPaths[i] = String.Format("0\\1.tif",
Path.GetDirectoryName(fileNames[i]),
Path.GetFileNameWithoutExtension(fileNames[i]));
// Save as individual tiff files.
using (System.Drawing.Image tiffImg = System.Drawing.Image.FromFile(fileNames[i]))
tiffImg.Save(tiffPaths[i], ImageFormat.Tiff);
return tiffPaths;
【讨论】:
如果文件是Stream
怎么办?
它会转换 pdf 吗?【参考方案6】:
这就是我转换上传到网站的图像的方式。对其进行了更改,使其输出 Tiff 文件。该方法输入和输出一个字节数组,因此可以很容易地以多种方式使用。但是你可以很容易地修改它。
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
public byte[] ConvertImageToTiff(byte[] SourceImage)
//create a new byte array
byte[] bin = new byte[0];
//check if there is data
if (SourceImage == null || SourceImage.Length == 0)
return bin;
//convert the byte array to a bitmap
Bitmap NewImage;
using (MemoryStream ms = new MemoryStream(SourceImage))
NewImage = new Bitmap(ms);
//set some properties
Bitmap TempImage = new Bitmap(NewImage.Width, NewImage.Height);
using (Graphics g = Graphics.FromImage(TempImage))
g.CompositingMode = CompositingMode.SourceCopy;
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.DrawImage(NewImage, 0, 0, NewImage.Width, NewImage.Height);
NewImage = TempImage;
//save the image to a stream
using (MemoryStream ms = new MemoryStream())
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 80L);
NewImage.Save(ms, GetEncoderInfo("image/tiff"), encoderParameters);
bin = ms.ToArray();
//cleanup
NewImage.Dispose();
TempImage.Dispose();
//return data
return bin;
//get the correct encoder info
public ImageCodecInfo GetEncoderInfo(string MimeType)
ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
for (int j = 0; j < encoders.Length; ++j)
if (encoders[j].MimeType.ToLower() == MimeType.ToLower())
return encoders[j];
return null;
测试
var oldImage = File.ReadAllBytes(Server.MapPath("OldImage.jpg"));
var newImage = ConvertImageToTiff(oldImage);
File.WriteAllBytes(Server.MapPath("NewImage.tiff"), newImage);
【讨论】:
它是否按照 OP 的要求将 pdf 转换为图像 @maytham-ɯɐɥʇʎɐɯ 否,因为 OP 要求转换为 TIFF。他已经有了 OCR 软件。 我的理解是这是一个老问题,所以赏金问题确实提出了以下问题:寻找来自可靠和/或官方来源的答案。我们如何将多个文件转换为 1 个 tiff?例如,假设有 pdf、jpeg、png,我想从中创建 1 个 tiff? @maytham-ɯɐɥʇʎɐɯ 我认为你是对的。 OP 正在询问 TIFF,但赏金者希望将多个图像和 pdf 合并到一个文件中。没有阅读 cmets... 如果可以的话,我会尝试创建一个解决方案。以上是关于图片的四种格式.jpg、.gif、.png、.bmp各是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
将不同的图片格式(jpg、gif、png等)转换为TIFF格式