C# 来自System.Drawing.Image的文件扩展名

C# 来自System.Drawing.Image的文件扩展名,c#,.net,image,system.drawing.imaging,C#,.net,Image,System.drawing.imaging,我正在编写一个需要将System.Drawing.Image保存到文件中的方法。在不知道创建图像的原始文件的情况下,是否仍然可以确定图像的文件扩展名 我提出的最佳解决方案是使用一个Switch/Case语句,其值为Image.RawFormat 我是否以原始格式保存图像?从PNG生成的图像与从JPEG生成的图像有什么不同吗?或者存储在图像对象中的数据是否完全通用?是的,这肯定很重要,因为不同的文件格式支持不同的功能,如压缩、多帧等 我总是像您一样使用switch语句,可能会被烘焙到扩展方法或其他

我正在编写一个需要将
System.Drawing.Image
保存到文件中的方法。在不知道创建图像的原始文件的情况下,是否仍然可以确定图像的文件扩展名

我提出的最佳解决方案是使用一个Switch/Case语句,其值为Image.RawFormat


我是否以原始格式保存
图像
?从PNG生成的
图像
与从JPEG生成的图像有什么不同吗?或者存储在
图像
对象中的数据是否完全通用?

是的,这肯定很重要,因为不同的文件格式支持不同的功能,如压缩、多帧等


我总是像您一样使用switch语句,可能会被烘焙到扩展方法或其他东西中。

Image.RawFormat有cooties,请远离它。我已经看到好几篇报道说它没有任何明显的法律价值。尚未确诊


你说得很对,不管你把它保存成什么格式。加载文件后,具有相同像素格式的任何位图(不是矢量)的内部格式都相同。通常避免重新压缩jpeg文件,它们往往会变得更大并获得更多的伪影。Steve提到多帧文件,它们需要以不同的方式保存。

虽然Steve Danner的观点是正确的,从JPG创建的图像在加载到内存后,将与从PNG创建的图像不同,它是一个未压缩的数据流

这意味着您可以将其保存为所需的任何文件格式

但是,如果加载一个JPG图像,然后将其另存为另一个JPG,则由于压缩算法,您会丢弃更多信息。如果您反复这样做,最终会丢失图像

如果可以的话,我建议您始终保存为PNG。

回答您的问题“以原始格式保存图像是否重要?”明确地说:是的,但以否定的方式

加载图像时,图像将在内部解压缩为位图(或者称为未压缩数据流)。因此,如果原始图像使用有损压缩(例如jpeg),以相同格式保存它将再次导致信息丢失(即,更多的伪影、更少的细节、更低的质量)。尤其是如果您重复执行读取-修改-保存操作,这是需要避免的

(请注意,如果不修改图片,这也是要避免的。重复的解压缩-压缩循环会降低图像质量)


因此,如果磁盘空间不是一个问题(通常不是在硬盘大到可以播放高清视频的时代),请始终以无损压缩格式或未压缩格式存储任何中间图片。您可以考虑以压缩格式保存FIALL输出,这取决于您使用它的方式。(如果你想在网上展示那些最终的图片,jpeg或png是不错的选择)。

那么图像类会考虑到这一点吗?如果我将压缩的jpeg加载到图像对象中,该对象将保留jpeg压缩?它不会把图像扩展成普通的位图编码?我相信你的看法是正确的,埃里克。我的理解是,一旦它进入Image类,它就与格式无关,并且可以随后保存为任何其他格式(使用ImageFormat)。虽然这在某种程度上可能是正确的,但您始终需要考虑最初加载的内容。以多帧为例。如果将多页tiff加载到图像对象中并另存为任何其他图像格式,则会丢失除活动帧(页面)之外的所有帧(页面)。啊,好的,谢谢您的提示。这就是我一直想弄明白的。如果可以拍摄来自任何格式的图像,并将其保存为特定格式。所以如果我使用像PNG这样的未压缩格式,这听起来是可以的?@Eric-PNG是压缩的-只是没有损耗。所以,如果你打开图像A.png,将其另存为B.png,然后打开B.png,将其另存为C.png等等。质量不会下降。啊,是的,我的意思是有损。谢谢你的澄清