2017-08-03 47 views
-1

首先,我将一个大小为7KB的.bmp图像上传到服务器,然后在需要时向服务器发送请求以获取该图像,并且图像将以base64编码格式发送。如果我将该文件保存为.bmp格式,则保存的图像看起来与我上传的图像完全相同,但大小约为4KB。C#:如何解压缩以base64编码格式接收的图像?

我认为,虽然上传图像被压缩。如果是这样,我该如何解压缩它。

我在用下面的代码保存图像:

MemoryStream stream = new MemoryStream(Convert.FromBase64String(strImageInBase64Format)); 
Bitmap bmp = new Bitmap(stream); 
bmp.Save("some.bmp"); 
+0

如果通过像素比较两者的像素,有什么不同?元数据说了什么?一个可以保存为24 bpp,另一个可以保存为32 bpp。你也确定*返回的文件是BMP? Windows和大多数图像浏览器可能会忽略错误的扩展名,并根据其真实的编解码器来显示图像。 另外,你为什么需要*解压*它?如果使用BMP 24位RLE或PNG进行无损压缩,有什么危害?如果使用JPG损失压缩,则信息无论如何都会丢失。 – Martheen

+0

良好的压缩图像不能被我正在使用的某些硬件打印。我会看看bpp的东西 – pasha

+0

然后只需将解码的字节加载为Image,并将其保存为BMP。这种方式即使网络服务器返回JPG或WEBP,你仍然饲料硬件普通BMP – Martheen

回答

1

只是重写什么@Martheen在评论发布到提供答案。

,我一直在使用保存图片功能是:

bmp.Save("some.bmp"); 

从这个函数(https://msdn.microsoft.com/en-us/library/ktx83wah(v=vs.110).aspx)的微软文档:

如果没有编码器存在的文件格式使用便携式网络图形(PNG)编码器。

因此,尽管我一直以.bmp格式保存图像,但图像实际上是以png格式编码的,然后只需使用.bmp扩展名保存。

要的base64字符串保存图像为.bmp格式,我应该使用功能:

Image.Save Method (String, ImageCodecInfo, EncoderParameters) 

Sample code

0

首先, Base64编码格式是一个字符串,你应该,如果你想看到有意义的画面,这个字符串进行解码。

其次,我与一个变量,它是代表你的图像数据“serverImage”所以,serverImage显示,在服务器的base64字符串。

我希望这个代码帮助您了解此解码

var bytes = Convert.FromBase64String(resizeImage.Content); 
using (var serverImage = new FileStream(filePath, FileMode.Create)) 
//filePath is a path for localstorage. 
{ 
    serverImage.Write(bytes ,0, bytes.Length); 

} 
+0

对不起,我错过了说,我保存之前解码base64字符串。 – pasha

+0

您应该使用编码版本(base64字符串)保存图像。我不明白你为什么在保存之前解码base64字符串? @pasha –

+0

在发送之前,图像在base64中编码,因为如果原始图像是逐字节传输的,它可能会触发某些通信协议的一些转义序列。我不能以这种格式保存它(我不知道我是否可以这样做),因为我使用的硬件不会期望base64编码的图像。 – pasha