公司的大概需求:
由于某些需求,公司需要我们开发一个app和web,移动端的一部分功能是拍照然后上传图片到数据库并且分类 (原图存于服务器共享文件夹,数据库保留url),web端则需要将这些图片全部显示出来并且可以根据条件筛选。为了方便查看,所以gridView中需要有一栏显示缩略图,点开缩略图之后显示原图
这一次是我做web端(C#)另外一个做android端,一开始我觉得很简单,结果写完之后测试才发现诸多问题:
1.共享文件夹图片的url直接循环绑定到asp的Image控件中的ImageUrl中之后始终打不开图片。
2.用window.open(url,"参1","参2")在浏览器显示原图(比较大)不能屏蔽url(这个貌似现在都不可以了,图片是从另外一个服务器上取的,并且不一定是一个文件夹中,所以数据库存的是完整url,没有用当前项目的相对地址)。
最后解决方案:
为了不显示url,最后给每张图片都加了一个imageID,然后再通过imageID来获取url,再读取url获取图片;为了解决共享文件夹图片显示问题,通过”曲线救国“另创一个新的aspx空白页面,再在后台将图片以二进制字节写入
部分代码如下:
protected void grvCases_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Label lable1 = e.Row.FindControl("lblRefImageID") as Label;
string imageID = lable1.Text;
HyperLink hlImage = e.Row.FindControl("hlImage") as HyperLink;
Image tnImage = e.Row.FindControl("thumbnail") as Image;
//thumbnail
tnImage.ImageUrl = @"showPic.aspx?imageID=" + imageID;
hlImage.NavigateUrl = "javascript:linkClick('" + @"showPicNormal.aspx?imageID=" + imageID + "');";
}
}
缩略图处理showPic.aspx后台代码:
ublic partial class showPic : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
String imageID = Request.QueryString["imageID"];
//根据url的imageID取url
DBFunction db=new DBFunction();
ArrayList lst = new ArrayList();
String sql = "select a.FIlePath from Attachment a left join info b on a.CaseID=b.CaseID where b.ImageID=@imageID";
String strconn = System.Configuration.ConfigurationManager.ConnectionStrings["MobileAppsConnectionString"].ToString();
SqlParameter s1 = new SqlParameter("@imageID", SqlDbType.Char, 50);
s1.Value = imageID;
if (!string.IsNullOrEmpty(imageID))
{
lst.Add(s1);
}
String strUrl = db.getStrUrl(sql, lst, strconn);
if (System.IO.File.Exists(strUrl)){
System.Drawing.Image originalImage = System.Drawing.Image.FromFile(strUrl);
if (originalImage == null)
{
return;
}
int width = 50;
int height = 100;
int towidth = 50;
int toheight = 50;
int x = 0;
int y = 0;
int ow = originalImage.Width;
int oh = originalImage.Height;
//预防以后改变
switch ("Cut")
{
case "HW"://指定高宽缩放(可能变形)
break;
case "W"://指定宽,高按比例
toheight = originalImage.Height * width / originalImage.Width;
break;
case "H"://指定高,宽按比例
towidth = originalImage.Width * height / originalImage.Height;
break;
case "Cut"://指定高宽裁减(不变形)
if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
{
oh = originalImage.Height;
ow = originalImage.Height * towidth / toheight;
y = 0;
x = (originalImage.Width - ow) / 2;
}
else
{
ow = originalImage.Width;
oh = originalImage.Width * height / towidth;
x = 0;
y = (originalImage.Height - oh) / 2;
}
break;
default:
break;
}
//新建一个bmp图片
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(towidth, toheight);
//新建一个画板
Graphics g = System.Drawing.Graphics.FromImage(bitmap);
//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//清空画布并以透明背景色填充
g.Clear(Color.Transparent);
//在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
new Rectangle(x, y, ow, oh),
GraphicsUnit.Pixel);
try
{
//以jpg格式保存缩略图
//bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
MemoryStream ms = new MemoryStream();
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
ms.Flush();
byte[] bmpBytes = ms.ToArray();
Response.BinaryWrite(bmpBytes);
}
catch (System.Exception ex)
{
throw ex;
}
finally
{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
// }
}
}
}
显示原图:
showNormalPic.aspx代码
protected void Page_Load(object sender, EventArgs e)
{
//"根据照片路径,将照片转为二进制数组";
String imageID = Request.QueryString["imageID"];
//根据url的imageID取url
DBFunction db = new DBFunction();
ArrayList lst = new ArrayList();
String sql = "select a.FIlePath from Attachment a left join info b on a.CaseID=b.CaseID where b.ImageID=@imageID";
String strconn = System.Configuration.ConfigurationManager.ConnectionStrings["MobileAppsConnectionString"].ToString();
SqlParameter s1 = new SqlParameter("@imageID", SqlDbType.Char, 50);
s1.Value = imageID;
if (!string.IsNullOrEmpty(imageID))
{
lst.Add(s1);
}
String strUrl = db.getStrUrl(sql, lst, strconn);
strUrl=strUrl.Replace(@"\", @"\\");
// string strUrl = Request.QueryString["URL"];
if (System.IO.File.Exists(strUrl))
{
// 以二进制方式读文件
FileStream aFile = new FileStream(strUrl, FileMode.OpenOrCreate, FileAccess.ReadWrite);
// 创建一个二进制数据流读入器,和打开的文件关联
BinaryReader brMyfile = new BinaryReader(aFile);
// 把文件指针重新定位到文件的开始
brMyfile.BaseStream.Seek(0, SeekOrigin.Begin);
//获取照片的字节数组
byte[] photo = brMyfile.ReadBytes(Convert.ToInt32(aFile.Length.ToString()));
// 关闭以上new的各个对象
brMyfile.Close();
Response.ContentType = "image/jpg";//防止chrome打不开图片
Response.BinaryWrite(photo);
}
}
js:
这个时候的url只是为了打开一个浏览器窗口,看不到真实的url,图片是写入到页面的
function linkClick(url) {
win = window.open(url, 'image', 'directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=360,height=500,top=0,left=0');
}