将位图编码为Jpeg格式

3
首先,这个问题不是关于"如何将位图保存为jpeg格式到磁盘上?"的问题。
我找不到(或想不到)一种将带有JPEG压缩的位图转换为位图对象的方法。MSDN清楚地显示了如何将位图保存为JPEG,但我正在寻找的是如何将编码/压缩应用于位图对象,以便我可以在我的代码中继续传递它,而不引用文件。
其中一个原因是一个处理位图的辅助类,但不应该知道所使用的持久化方法。

在.NET中压缩图像相关 - CharlesB
3个回答

5

所有图像在加载到程序内存时都是位图。通常在写入磁盘时使用特定的压缩算法,在从磁盘读取时进行解压缩。

如果您担心图像在内存中的占用,可以对字节进行zip压缩并在内部传递字节数组。对于无损压缩图像,zip压缩非常有效。不要忘记许多图像压缩具有不同程度的丢失(拼写是否正确?),换句话说,压缩会舍弃数据以将图像存储为可能最小的字节数。

压缩/解压缩也是性能折衷,因为您正在交换内存占用和处理时间。而且,在任何情况下,除非您变得非常复杂,否则需要将图像作为位图才能进行任何操作。

这里是一个类似问题的答案, 您可能会感兴趣。


我的关注点实际上是图像处理和持久性之间的关注点分离。我可以将JPEG保存在文件系统(直接或隔离存储)、数据库或云中。我的图像处理不知道这一点,而我的持久层也不应该进行一些图像处理,对吧? - Tipx
没错。图像处理是一个独立的问题。虽然如果您使用任何一种有损压缩类型,您自动通过丢弃压缩算法认为不需要保留图像的数据来进行处理。 - Paul Sasik

3

Bitmap 不支持编码的内存存储。它总是未编码的(参见 PixelFormat 枚举)。可能您需要编写自己的包装类或抽象层,或者放弃这个想法。


1
var stream = new MemoryStream()
Bitmap.Save(Stream, ImageFormat)

这符合您的需求吗?


不要忘记JPEG压缩是有损压缩。如果你将图像压缩为JPEG格式,然后再解压为位图格式,那么你将会失去一些图像信息:http://en.wikipedia.org/wiki/Lossy_compression - Paul Sasik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接