如何将多个图片合并到一个文件流,一同输出到网页显示

zxz19 2012-10-09 10:47:23
现在我需要根据某条信息读出它所有的图片信息,然后为了不让别人直接看到真是图片地址是打算通过ashx直接resnponse输出图片,但问题是如何才能将多个图片同时输出显示?我始终只能显示出第一张图片.
下面是我写的部分代码,打算将多个图片写进一个文件流然后在一起输出,但结果还是只有第一张图,其中images是一个List<String>集合,存放的是图片的路径

response.ContentType = "image/jpeg";
var stream = new MemoryStream();
foreach (var img in images)
{
var imgbyte = File.ReadAllBytes(Sph.Common.Variables.ImgUploadRootPath + img.TrimStart('/'));
stream.Write(imgbyte, 0, imgbyte.Length);
}
stream.Close();
response.BinaryWrite(stream.GetBuffer());
response.Flush();


请问该如何修改,能同时将多个图片输出显示?
...全文
679 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
孟子E章 2012-10-09
  • 打赏
  • 举报
回复
页面
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="PersonName" />
<asp:ImageField DataImageUrlField="PersonId" DataImageUrlFormatString="ShowImage.aspx?id={0}"/>
</Columns>
</asp:GridView>


显示

<%@ Page Language="C#" %>

<script runat="server">

protected void Page_Load(object sender, EventArgs e)
{
int id = 0;
if (Int32.TryParse(Request.QueryString["id"], out id))
{
string strCnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|Image2Access.mdb";
System.Data.OleDb.OleDbConnection myConnection = new System.Data.OleDb.OleDbConnection(strCnString);
String strSql = "select PersonImageType,PersonImage from Person Where PersonId=@id";
System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand(strSql, myConnection);
command.Parameters.AddWithValue("@id", id);
//打开连接,执行查询
myConnection.Open();
System.Data.OleDb.OleDbDataReader dr = command.ExecuteReader();
if (dr.Read())
{
byte[] image = (byte[])dr["PersonImage"];
Response.ClearContent();
Response.ContentType = dr["PersonImageType"].ToString();
Response.BinaryWrite(image);
Response.End();
}
else
{
OutPutNonePicture();
}
dr.Close();
myConnection.Close();
myConnection.Dispose();
}
else
{
OutPutNonePicture();
}
}

/// <summary>
/// 对于不存在的图片,输出none.gif
/// </summary>
private void OutPutNonePicture()
{
Response.ClearContent();
Response.ContentType = "image/gif";
Response.WriteFile(Server.MapPath("~/none.gif"));
Response.End();
}
</script>


ashx也是一样
孟子E章 2012-10-09
  • 打赏
  • 举报
回复
<img src="ShowImage.aspx?id=xxx"
宝_爸 2012-10-09
  • 打赏
  • 举报
回复
你的方法没法放回多张图片。
我能想到两个方法
1. 把图片存在服务器端,在多个Image控件指向不同的图片。
用动态创建控件, 或者DataList都可以实现,不难。

2. 服务器端合成一个图片并返回。
用GDI+,下面代码是我的缩小图片尺寸的代码,在asp.net中使用的。你可以参考它自己写合并多张图片的代码。

private void ReduceImageSize(string filePath)
{
using (MemoryStream OrgImageMemory = new MemoryStream(File.ReadAllBytes(filePath)))
{
using (Image orgImage = Image.FromStream(OrgImageMemory))
{
using (Bitmap result = new Bitmap(orgImage.Width / 2, orgImage.Height / 2))
{
result.SetResolution(orgImage.HorizontalResolution / 2, orgImage.VerticalResolution / 2);

using (Graphics graphics = Graphics.FromImage(result))
{
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

graphics.DrawImage(orgImage, 0, 0, result.Width, result.Height);
}

result.Save(filePath);
}
}
}
}
zxz19 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

噢,原来是不管怎么合并文件流,反正就是只能输出一张图


是的,如果非要刷出多张图,可以将图片流合并后(比如按照顺序,将图片从上到小或者从左到右排列)刷出。
[/Quote]
这样是如何实现呢?
全栈极简 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

噢,原来是不管怎么合并文件流,反正就是只能输出一张图
[/Quote]

是的,如果非要刷出多张图,可以将图片流合并后(比如按照顺序,将图片从上到小或者从左到右排列)刷出。
zxz19 2012-10-09
  • 打赏
  • 举报
回复
噢,原来是不管怎么合并文件流,反正就是只能输出一张图
全栈极简 2012-10-09
  • 打赏
  • 举报
回复
后台只能刷一次,你可以在前台页面指定图片id,后台根据id不同刷出不同的图片在同一个页面上,前台指定多个图片的不同链接。
孟子E章 2012-10-09
  • 打赏
  • 举报
回复
response.ContentType = "image/jpeg";

这样只能输出一个图片。,

要是多张图片,必须合成为一张才你输出
zxz19 2012-10-09
  • 打赏
  • 举报
回复
最终还是拼接成一张图输出来搞的了

109,897

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧