如何正确显示数据库中的图片

由于手头这个项目需要显示数据库中存放的图片,一般我都是用GetThumbnailImage来获取的,但是通过这个方法来显示有很大的问题,如果一个图片中内嵌了缩微图,那最终显示出来的图片其实是内嵌的缩微图,换句话说有一个图片的大小是1024*768,但是它里面有内嵌的缩微图,尺寸是200*150, 所以你就会发现通过GetThumbnailImage得到的图片质量惨不忍睹,因为是用1024*768的尺寸来显示200*150的图片。

最终在网上找到了解决方案,但是很不幸,这个链接被我弄丢了,所以只好把我修改好的代码贴出来了。

  1.     private void ImageShow(int maxSideSize)
  2.     {
  3.         // Image MimeType
  4.         string ImageMimeType = string.Empty;
  5.         // Get Image Data
  6.         DataSet ds = 数据源;
  7.         if (ds.Tables.Count == 0)
  8.             return;
  9.         if (ds.Tables[0].Rows.Count == 0)
  10.             return;
  11.         DataRow dr = ds.Tables[0].Rows[0];
  12.         Response.Clear();
  13.         byte[] blob = (byte[])dr["GiftPicture"];
  14.         ImageMimeType = dr["GiftPictureMimeType"].ToString().ToLower().Trim();
  15.         MemoryStream stream = new MemoryStream(blob);
  16.         System.Drawing.Image image = System.Drawing.Bitmap.FromStream(stream);
  17.         // Resize to max side size
  18.         int width = 0;
  19.         int height = 0;
  20.         double ratio = 0.0;
  21.         if ((maxSideSize < image.Width) || (maxSideSize < image.Height))
  22.         {
  23.             // Check larger side in image and estimate resize ratio               
  24.             if (image.Width > image.Height)
  25.             {
  26.                 width = maxSideSize;
  27.                 ratio = Convert.ToDouble(width) / Convert.ToDouble(image.Width);
  28.                 height = Convert.ToInt32(image.Height * ratio);
  29.             }
  30.             else
  31.             {
  32.                 height = maxSideSize;
  33.                 ratio = Convert.ToDouble(height) / Convert.ToDouble(image.Height);
  34.                 width = Convert.ToInt32(image.Width * ratio);
  35.             }
  36.         }
  37.         else
  38.         {
  39.             width = image.Width;
  40.             height = image.Height;
  41.         }
  42.         // Create image
  43.         System.Drawing.Image bm = new Bitmap(width, height);
  44.         Graphics gdiobj = Graphics.FromImage(bm);
  45.         gdiobj.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
  46.         gdiobj.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
  47.         gdiobj.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  48.         gdiobj.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  49.         gdiobj.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
  50.         Rectangle destrect = new Rectangle(0, 0, width, height);
  51.         ImageAttributes attr = new ImageAttributes();
  52.         attr.SetWrapMode(System.Drawing.Drawing2D.WrapMode.TileFlipXY);
  53.         gdiobj.DrawImage(image, destrect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attr);
  54.         // Display image for file type is jpeg or jpg.
  55.         if (ImageMimeType.IndexOf("jpeg") > 0 || ImageMimeType.IndexOf("jpg") > 0)
  56.         {
  57.             // Image quality
  58.             int mImageQuality = 100;
  59.             ImageCodecInfo encoder = GetEncoderInfo("image/jpeg");
  60.             // Setup the quality
  61.             EncoderParameters encoderParameters = new EncoderParameters(1);
  62.             encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, (long)mImageQuality);
  63.             bm.Save(Response.OutputStream, encoder, encoderParameters);
  64.         }
  65.         else
  66.         {
  67.             bm.Save(Response.OutputStream, ImageFormat.Jpeg);
  68.         }
  69.         Response.ContentType = ImageMimeType;
  70.         string fileName = System.Web.HttpUtility.UrlEncode(dr[0].ToString(), System.Text.Encoding.UTF8);
  71.         Response.AddHeader("Content-Disposition""inline;filename=" + fileName + ";");
  72.         // Release source
  73.         if (image != null)
  74.             image.Dispose();
  75.         if (bm != null)
  76.             bm.Dispose();
  77.         stream.Close();
  78.         Response.Flush();
  79.         Response.End();
  80.     }


你可以找一张内嵌缩微图的图来进行测试。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值