2013-04-22 35 views
3

我在这里做的是我正在使用ftp从终端将图像文件复制到我的服务器。但是当我检查服务器中的图片时,它突然变成质量较差的图像。如何将jpeg转换为字节数组而不损失其质量

我开始想,也许这是因为我从图像转换为字节数组。谁能帮忙?

这里是我的代码..

Stream stream = FileUploadPic.FileContent; 

System.Drawing.Image i = new Bitmap(stream); 

var abort = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback); 

var thumbnail = i.GetThumbnailImage(300, 300, abort, IntPtr.Zero); 

byte[] bytes = imageToByteArray(thumbnail); 

FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(path); 

request.Method = WebRequestMethods.Ftp.UploadFile; 

request.Credentials = new NetworkCredential(username, password); 
request.UsePassive = true; 
request.UseBinary = true; 
request.KeepAlive = false; 
request.ContentLength = bytes.Length; 
Stream req_Stream = request.GetRequestStream(); 
req_Stream.Write(bytes, 0, bytes.Length); 
req_Stream.Close(); 

FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

这是imageToByteArray功能:

public byte[] imageToByteArray(System.Drawing.Image imageIn) { 
    MemoryStream ms = new MemoryStream(); 
    imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); 
    return ms.ToArray(); 
} 
+0

除非你的'imageToByteArray'做了一些奇怪的事情,这不是因为你转换为'byte []'。 – Blorgbeard 2013-04-22 03:35:02

+0

@ Blorgbeard - 这是我在imageToByteArray中的代码 – user2272856 2013-04-22 05:27:48

+0

public byte [] imageToByteArray(System.Drawing.Image imageIn) { MemoryStream ms = new MemoryStream(); imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif); return ms.ToArray(); } – user2272856 2013-04-22 05:28:29

回答

3

System.Drawing.Imaging.ImageFormat.Gif是你的问题。 GIF是一种相当古老的格式,限于256种颜色。

如果您想避免重新压缩Jpeg,建议您尝试ImageFormat.Png,这是一种更现代的格式,并且仍然无损。

+0

我没有注意到......非常感谢你的回答......更多的是更加Godbless!:D – user2272856 2013-04-22 06:19:32

5

质量损失来自使用GetThumbnailImage。它仅用于相当具体的场景,described in the documentation

This answer describes如何对c#中图像输出的质量和特性进行更精细的控制。

+0

谢谢你的答案。我测试了我的部分代码。我试过将缩略图保存到同一个终端,并且图像非常好。但每当我把它上传到服务器。图像变得像素化。 – user2272856 2013-04-22 03:26:28

相关问题