c# – 为什么我在图像的开头有不需要的额外字节?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 为什么我在图像的开头有不需要的额外字节?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含14874字,纯文字阅读大概需要22分钟。
内容图文
![c# – 为什么我在图像的开头有不需要的额外字节?](/upload/InfoBanner/zyjiaocheng/722/b8a6d51d7dc244a79ab9c28155b73fb9.jpg)
题:
我为我的兄弟制作了一个主页,可以在这里访问:
http://www.daniel-steiger.ch
它在Linux上使用Microsoft ASP.NET MVC3,使用单声道3,使用带有nginx的fastcgi(加上我自己的DNS服务器).
现在我知道这是一个不寻常的星座,但到目前为止,一切正常.
但是,我遇到了一个非常微妙的小错误.
在图库中单击缩略图图像时,我想通过新选项卡中图库控制器的FullImage方法显示完整尺寸的图像.
例如,这个直接网址:
http://www.daniel-steiger.ch/gallery/FullImage/001.jpg
在Internet Explorer中,我将图像改为文本.
在所有其他浏览器中显示“无效图像”消息.
我通过它的直接文件URL调用图像解决了这个问题,工作正常:
http://www.daniel-steiger.ch/Content/images/gallery/001.jpg?LastWriteTimeUTC=1358694795000
随后,我向单声道邮件列表报告了该错误
http://mono.1490590.n4.nabble.com/Bug-in-mono-3-0-1-MVC3-File-FileResult-td4658382.html
现在我作为回应,这是我的全部错,因为我设置了错误的图像mime类型,这是/是真的.
但是,我发现奇怪的是,如果是这种情况,相同的代码在Windows上工作正常,而Chrome之类的智能浏览器通常会检测到错误的mime设置并使用正确的mime设置.
所以我将mime-type从“image / jpg”更改为“image / jpeg”,并将项目重新部署到服务器.
我还检查了文件实用程序,如果图像实际上是一个jpeg图像,它是.
奇怪的是它仍然没有显示图像.
在Internet Explorer上,我现在变得“不可用”.
在所有其他浏览器上,我得到:图像无法显示,因为它包含错误.
我现在做了wget图像包含错误的URL中的图像.
wget http://www.daniel-steiger.ch/gallery/fullimage/001.jpg
然后我在无效文件和原始文件之间运行二进制比较:
cmp -l 001.jpg 001a.jpg | awk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}' >> comparison.txt
这是比较结果:
我眼中的一点是,互联网资源管理器说他找不到的图像实际上是1.7 MB大小,并包含额外的字节:
31 39 36 62 36 38 0D 0A
一开始……
任何人都知道这里出现了什么问题/这些字节可能来自何处(除了它最有可能来自mono / fastcgi中的错误)?
这是新的控制器代码btw:
namespace Homepage.Controllers
{
public class GalleryController : Controller
{
protected static string GetImageDirectory()
{
string bd = AppDomain.CurrentDomain.BaseDirectory;
string strImageDirectory = System.IO.Path.Combine(bd,
"Content");
strImageDirectory =
System.IO.Path.Combine(strImageDirectory, "images");
strImageDirectory =
System.IO.Path.Combine(strImageDirectory, "gallery");
return strImageDirectory;
} // End Function GetImageDirectory
protected static string strImageDirectory = GetImageDirectory();
public FileResult FullImage(string id)
{
string strFileName =
System.IO.Path.Combine(strImageDirectory, id);
//return new FilePathResult("CorrectFullPathAndFileName", "CorrectMime");
//return File(strFileName, "image/jpg"); // Old
return File(strFileName, "image/jpeg"); // New
} // End Action FullImage
public FileResult Thumb(string id)
{
//return Redirect(id);
string strFileName =
System.IO.Path.Combine(strImageDirectory, id);
System.IO.Stream ms =
Tools.Imaging.GetThumbnailStream(strFileName,
System.Drawing.Imaging.ImageFormat.Png);
return File(ms, "image/png");
/*
using (System.IO.Stream ms =
Tools.Imaging.GetThumbnailStream(strFileName,
System.Drawing.Imaging.ImageFormat.Png))
{
return File(ms, "image/png");
}*/
} // End Action Thumb
} // End Class GalleryController : Controller
} // End Namespace Homepage.Controllers
编辑:
它变得陌生:
还有一个额外的序列
0d 0a 0d 0a 30 0d 0a 0d 0a
在末尾…
我刚做了hexdump,发现原始文件有文件大小(屏住呼吸):
00196b68
这里的hexdumps(每个8 MB):
规范格式(hexdump -C 001.jpg> 001.txt):
原始档案:http://www.daniel-steiger.ch/001.txt
Botched file:http://www.daniel-steiger.ch/001a.txt
纯转储(hexdump 001.jpg> 001_1.txt):
原始档案:http://www.daniel-steiger.ch/001_1.txt
Botched file:http://www.daniel-steiger.ch/001a_1.txt
嗯,拙劣的文件的十六进制转储是5 MB,原来的一个是8.2 MB …
我使用最新的稳定nginx:
sudo -s
nginx=stable # use nginx=development for latest development version
add-apt-repository ppa:nginx/$nginx
apt-get update
apt-get install nginx
Tools.Imaging的完整代码(在此期间将工具重命名为MvcTools,以匹配程序集名称空间)
using System;
using System.Text;
namespace MvcTools
{
public class Imaging
{
//public static System.Drawing.Size m_sMaxThumbNailDimensions = new System.Drawing.Size(200, 200);
public static System.Drawing.Size m_sMaxThumbNailDimensions = new System.Drawing.Size(300, 300);
public static System.IO.Stream GetImageAsStream(
string strOrgFileName
, System.Drawing.Imaging.ImageFormat ifOutputFormat
)
{
return GetImageAsStream(strOrgFileName, ifOutputFormat, 1024);
} // End Function GetImage
public static System.IO.Stream GetImageAsStream(
string strOrgFileName
,System.Drawing.Imaging.ImageFormat ifOutputFormat
,int rez
)
{
System.IO.MemoryStream ms = null;
if (!System.IO.File.Exists(strOrgFileName))
throw new System.IO.FileNotFoundException(strOrgFileName);
try
{
using (System.Drawing.Image imgSourceImage = System.Drawing.Image.FromFile(strOrgFileName))
{
ms = new System.IO.MemoryStream();
imgSourceImage.Save(ms, ifOutputFormat);
ms.Position = 0;
} // End Using imgSourceImage
} // End Try
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.GetType().ToString());
System.Windows.Forms.MessageBox.Show(ex.Message);
//Response.Write(ex.Message);
} // End Catch
return ms;
} // End Function GetImageAsStream
public static System.Drawing.Size GetThumbnailSize(string strOrgFileName)
{
System.Drawing.Size sThumbNailSizeToUse = new System.Drawing.Size();
try
{
using (System.Drawing.Image imgSourceImage = System.Drawing.Image.FromFile(strOrgFileName))
{
decimal decPixToSubstract = 0;
decimal decPercentage;
if (m_sMaxThumbNailDimensions.Width < imgSourceImage.Size.Width || m_sMaxThumbNailDimensions.Height < imgSourceImage.Size.Height)
{
if (imgSourceImage.Size.Width > imgSourceImage.Size.Height)
{
decPercentage = (((decimal)imgSourceImage.Size.Width - (decimal)m_sMaxThumbNailDimensions.Width) / (decimal)imgSourceImage.Size.Width);
decPixToSubstract = decPercentage * imgSourceImage.Size.Height;
sThumbNailSizeToUse.Width = m_sMaxThumbNailDimensions.Width;
sThumbNailSizeToUse.Height = imgSourceImage.Size.Height - (int)decPixToSubstract;
} // End if (imgSourceImage.Size.Width > imgSourceImage.Size.Height)
else
{
decPercentage = (((decimal)imgSourceImage.Size.Height - (decimal)m_sMaxThumbNailDimensions.Height) / (decimal)imgSourceImage.Size.Height);
decPixToSubstract = decPercentage * (decimal)imgSourceImage.Size.Width;
sThumbNailSizeToUse.Height = m_sMaxThumbNailDimensions.Height;
sThumbNailSizeToUse.Width = imgSourceImage.Size.Width - (int)decPixToSubstract;
} // End else of if (imgSourceImage.Size.Width > imgSourceImage.Size.Height)
} // End if (m_sMaxThumbNailDimensions.Width < imgSourceImage.Size.Width || m_sMaxThumbNailDimensions.Height < imgSourceImage.Size.Height)
else
{
sThumbNailSizeToUse.Width = imgSourceImage.Size.Width;
sThumbNailSizeToUse.Height = imgSourceImage.Size.Height;
} // End else of if (m_sMaxThumbNailDimensions.Width < imgSourceImage.Size.Width || m_sMaxThumbNailDimensions.Height < imgSourceImage.Size.Height)
} // End Using imgSourceImage
} // End Try
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
//Response.Write(ex.Message);
} // End Catch
return sThumbNailSizeToUse;
} // End Sub GetThumbnailSize(string strOrgFileName)
// https://stackoverflow.com/questions/7319842/mvc3-razor-thumbnail-resize-image-ideas
// https://stackoverflow.com/questions/1528525/alternatives-to-system-drawing-for-use-with-asp-net/1528908#1528908
public static void GenerateThumbnailFile(
string strPhysicalPath,
string strOrgFileName, string strThumbnailFileName,
System.Drawing.Imaging.ImageFormat ifOutputFormat, int rez
)
{
try
{
using (System.Drawing.Image imgSourceImage = System.Drawing.Image.FromFile(strOrgFileName))
{
//System.Drawing.Image oImg = System.Drawing.Image.FromStream(fil.InputStream);
decimal decPixToSubstract = 0;
decimal decPercentage;
//default
System.Drawing.Size sThumbNailSizeToUse = new System.Drawing.Size();
if (m_sMaxThumbNailDimensions.Width < imgSourceImage.Size.Width || m_sMaxThumbNailDimensions.Height < imgSourceImage.Size.Height)
{
if (imgSourceImage.Size.Width > imgSourceImage.Size.Height)
{
decPercentage = (((decimal)imgSourceImage.Size.Width - (decimal)m_sMaxThumbNailDimensions.Width) / (decimal)imgSourceImage.Size.Width);
decPixToSubstract = decPercentage * imgSourceImage.Size.Height;
sThumbNailSizeToUse.Width = m_sMaxThumbNailDimensions.Width;
sThumbNailSizeToUse.Height = imgSourceImage.Size.Height - (int)decPixToSubstract;
} // End if (imgSourceImage.Size.Width > imgSourceImage.Size.Height)
else
{
decPercentage = (((decimal)imgSourceImage.Size.Height - (decimal)m_sMaxThumbNailDimensions.Height) / (decimal)imgSourceImage.Size.Height);
decPixToSubstract = decPercentage * (decimal)imgSourceImage.Size.Width;
sThumbNailSizeToUse.Height = m_sMaxThumbNailDimensions.Height;
sThumbNailSizeToUse.Width = imgSourceImage.Size.Width - (int)decPixToSubstract;
} // End else of if (imgSourceImage.Size.Width > imgSourceImage.Size.Height)
} // End if (m_sMaxThumbNailDimensions.Width < imgSourceImage.Size.Width || m_sMaxThumbNailDimensions.Height < imgSourceImage.Size.Height)
else
{
sThumbNailSizeToUse.Width = imgSourceImage.Size.Width;
sThumbNailSizeToUse.Height = imgSourceImage.Size.Height;
} // End else of if (m_sMaxThumbNailDimensions.Width < imgSourceImage.Size.Width || m_sMaxThumbNailDimensions.Height < imgSourceImage.Size.Height)
using (System.Drawing.Bitmap bmpThumbnail = new System.Drawing.Bitmap(sThumbNailSizeToUse.Width, sThumbNailSizeToUse.Height))
{
bmpThumbnail.SetResolution(rez, rez);
using (System.Drawing.Image imgThumbNail = bmpThumbnail)
{
using (System.Drawing.Graphics gGraphicsContext = System.Drawing.Graphics.FromImage(imgThumbNail))
{
gGraphicsContext.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
gGraphicsContext.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gGraphicsContext.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
System.Drawing.Rectangle rThumbnailDimension = new System.Drawing.Rectangle(0, 0, sThumbNailSizeToUse.Width, sThumbNailSizeToUse.Height);
gGraphicsContext.DrawImage(imgSourceImage, rThumbnailDimension);
} // End Using gGraphicsContext
imgThumbNail.Save(System.IO.Path.Combine(strPhysicalPath, strThumbnailFileName), ifOutputFormat);
} // End Using imgThumbNail
} // End Using bmpThumbnail
} // End Using imgSourceImage
} // End Try
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
//Response.Write(ex.Message);
} // End Catch
} // End Function GenerateThumbNail
public static System.IO.Stream GetThumbnailStream(
string strOrgFileName
, System.Drawing.Imaging.ImageFormat ifOutputFormat
)
{
return GetThumbnailStream(strOrgFileName, ifOutputFormat, 1024);
} // End Function GetThumbnailStream
public static System.IO.Stream GetThumbnailStream(
string strOrgFileName
,System.Drawing.Imaging.ImageFormat ifOutputFormat
,int rez
)
{
System.IO.MemoryStream ms = null;
try
{
using (System.Drawing.Image imgSourceImage = System.Drawing.Image.FromFile(strOrgFileName))
{
decimal decPixToSubstract = 0;
decimal decPercentage;
System.Drawing.Size sThumbNailSizeToUse = new System.Drawing.Size();
if (m_sMaxThumbNailDimensions.Width < imgSourceImage.Size.Width || m_sMaxThumbNailDimensions.Height < imgSourceImage.Size.Height)
{
if (imgSourceImage.Size.Width > imgSourceImage.Size.Height)
{
decPercentage = (((decimal)imgSourceImage.Size.Width - (decimal)m_sMaxThumbNailDimensions.Width) / (decimal)imgSourceImage.Size.Width);
decPixToSubstract = decPercentage * imgSourceImage.Size.Height;
sThumbNailSizeToUse.Width = m_sMaxThumbNailDimensions.Width;
sThumbNailSizeToUse.Height = imgSourceImage.Size.Height - (int)decPixToSubstract;
} // End if (imgSourceImage.Size.Width > imgSourceImage.Size.Height)
else
{
decPercentage = (((decimal)imgSourceImage.Size.Height - (decimal)m_sMaxThumbNailDimensions.Height) / (decimal)imgSourceImage.Size.Height);
decPixToSubstract = decPercentage * (decimal)imgSourceImage.Size.Width;
sThumbNailSizeToUse.Height = m_sMaxThumbNailDimensions.Height;
sThumbNailSizeToUse.Width = imgSourceImage.Size.Width - (int)decPixToSubstract;
} // End else of if (imgSourceImage.Size.Width > imgSourceImage.Size.Height)
} // End if (m_sMaxThumbNailDimensions.Width < imgSourceImage.Size.Width || m_sMaxThumbNailDimensions.Height < imgSourceImage.Size.Height)
else
{
sThumbNailSizeToUse.Width = imgSourceImage.Size.Width;
sThumbNailSizeToUse.Height = imgSourceImage.Size.Height;
} // End else of if (m_sMaxThumbNailDimensions.Width < imgSourceImage.Size.Width || m_sMaxThumbNailDimensions.Height < imgSourceImage.Size.Height)
using (System.Drawing.Bitmap bmpThumbnail = new System.Drawing.Bitmap(sThumbNailSizeToUse.Width, sThumbNailSizeToUse.Height))
{
bmpThumbnail.SetResolution(rez, rez);
using (System.Drawing.Image imgThumbNail = bmpThumbnail)
{
using (System.Drawing.Graphics gGraphicsContext = System.Drawing.Graphics.FromImage(imgThumbNail))
{
gGraphicsContext.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
gGraphicsContext.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gGraphicsContext.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
System.Drawing.Rectangle rThumbnailDimension = new System.Drawing.Rectangle(0, 0, sThumbNailSizeToUse.Width, sThumbNailSizeToUse.Height);
gGraphicsContext.DrawImage(imgSourceImage, rThumbnailDimension);
ms = new System.IO.MemoryStream();
imgThumbNail.Save(ms, ifOutputFormat);
ms.Position = 0;
} // End Using gGraphicsContext
} // End Using imgThumbNail
} // End Using bmpThumbnail
/*
byte[] buffer = null;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
imgThumbNail.Save(ms, ifOutputFormat);
buffer = ms.ToArray();
}
*/
// Exerts from Page_Load method
//Response.ContentType = "image/" + extension;
//Response.OutputStream.Write(pBuffer, 0, pBuffer.Length);
//Response.End();
//imgThumbNail.Save(System.IO.Path.Combine(strPhysicalPath, strThumbnailFileName), ifOutputFormat);
} // End Using imgSourceImage
} // End Try
catch (Exception ex)
{
//Console.WriteLine(ex.Message);
System.Windows.Forms.MessageBox.Show(ex.Message);
//Response.Write(ex.Message);
} // End Catch
//System.Windows.Forms.MessageBox.Show("image/" + ifOutputFormat.ToString().ToLower());
return ms;
} // End Function GenerateThumbNail
} // End Class Imaging
} // End Namespace Tools
解决方法:
这似乎是涉及Chuncked transfer encoding的错误
Class: System.Web.HttpResponse (or one of its dependencies)
Method: TransmitFile(string filename)
编辑:
构造函数中有以下代码:
if (worker_request != null)
use_chunked = (worker_request.GetHttpVersion () == "HTTP/1.1");
修补它以检查CGI(如果CGI,服务器处理文件传输,因此根据RFC 3875可能没有从FastCGI服务器返回的chuncked编码.
internal HttpResponse (HttpWorkerRequest worker_request, HttpContext context) : this ()
{
WorkerRequest = worker_request;
this.context = context;
#if !TARGET_J2EE
if (worker_request != null)
{
if(worker_request.GetHttpVersion () == "HTTP/1.1")
{
string GatewayIface = context.Request.ServerVariables["GATEWAY_INTERFACE"];
use_chunked = (GatewayIface == null || !GatewayIface.StartsWith("CGI"));
}
else
use_chunked = false;
}
#endif
writer = new HttpWriter (this);
}
添加了补丁
https://bugzilla.xamarin.com/show_bug.cgi?id=10001
固定在单声道3.2.3
内容总结
以上是互联网集市为您收集整理的c# – 为什么我在图像的开头有不需要的额外字节?全部内容,希望文章能够帮你解决c# – 为什么我在图像的开头有不需要的额外字节?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。