这是我的情况: 我有一个控制台应用程序,它以位图格式创建网页截图,然后将其作为字节数组保存到数据库中。
然后我有一个Generic Handler,基本上获取字节数组,然后返回图像(它被设置为html图像源)。这是代码:
public void ProcessRequest(HttpContext context)
{
int id = Convert.ToInt32(context.Request.QueryString["Id"]);
context.Response.ContentType = "image/jpeg";
MemoryStream strm = new MemoryStream(getByteArray(id));
byte[] buffer = new byte[4096];
int byteSeq = strm.Read(buffer, 0, 4096);
while (byteSeq > 0)
{
context.Response.OutputStream.Write(buffer, 0, byteSeq);
byteSeq = strm.Read(buffer, 0, 4096);
}
}
public Byte[] getByteArray(int id)
{
EmailEntities e = new EmailEntities();
return e.Email.Find(id).Thumbnail;
}
(我自己没有编写代码)
图像虽然当然仍以位图形式返回,但尺寸太大。 这就是为什么我想把它作为压缩的jpg或png返回,只要它很小。
所以我的问题是:如果不将图像直接保存到文件系统,有什么可能做到这一点?
提前感谢您的回复。
答案 0 :(得分:1)
以下代码段可让您更接近目标。
这假定从数据库检索的字节数组可以被.net解释为有效图像(例如简单的位图图像)。
public class ImageHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
int id = Convert.ToInt32(context.Request.QueryString["Id"]);
var imageBytes = getByteArray(id);
using (var stream = new MemoryStream(imageBytes))
using (var image = Image.FromStream(stream))
{
var data = GetEncodedImageBytes(image, ImageFormat.Jpeg);
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(data);
context.Response.Flush();
}
}
public Byte[] getByteArray(int id)
{
EmailEntities e = new EmailEntities();
return e.Email.Find(id).Thumbnail;
}
public byte[] GetEncodedImageBytes(Image image, ImageFormat format)
{
using (var stream = new MemoryStream())
{
image.Save(stream, format);
return stream.ToArray();
}
}
public bool IsReusable
{
get { return false; }
}
}
在web.config中:
<system.webServer>
<handlers>
<add name="ImageHandler" path="/ImageHandler" verb="GET" type="ImageHandler" preCondition="integratedMode" />
</handlers>
</system.webServer>
如果您需要控制压缩/质量,则需要开始查看以下内容:https://stackoverflow.com/a/1484769/146999
或者你可以选择无损的PNG - 如果大部分图像是图形/ UI /文本,它可能会更好地压缩。如果是这样,请不要忘记为编码设置ImageFormat,为http响应设置ContentType。
希望这会有所帮助......