注册 登录
编程论坛 ASP.NET技术论坛

求助,img显示图像限制问题?

cccool 发布于 2010-10-29 11:18, 1226 次点击
我用img装载显示图像时,为了让图像一目了然,我将尺寸太大图像按页面大小等比缩小,但现在出现一个问题就是当图像大小超过13M时加载的图像就不显示,但图像在,右击可以保存图像,是不是img显示图像有限制?哪位能帮忙解决一下!谢谢!
8 回复
#2
wangnannan2010-10-29 15:55
对楼主的问题 很感兴趣 介意上传下代码研究一下吗?
#3
cccool2010-10-29 17:41
回复 2楼 wangnannan
程序代码:
<img alt="缩略图" id="Img1" src="" style="cursor: move;" onload="showImage()"/>


 <script language="javascript" type="text/javascript">
        function showImage()
        {
            var Wmax=document.body.scrollWidth;
            var ImgD=document.getElementById("Img1");
            ImgD.src="<%=ScaleGrid_Load()%>";
            if(typeof(ImgD)== "object")
            {   //判断ImgD装载过后是否为对象,防止异常操作
                var   widthL=0;
                var   heightL=0;
                var   W=ImgD.width;
                var   H=ImgD.height;
                if(W>Wmax)
                {
                    widthL=Wmax;
                    heightL=(H+20)/((W+20)/Wmax); //+20是因为IE方式的默认边距
                }
                else
                {
                    return ;
                }
                if(widthL!=0&&heightL!=0)
                {
                    ImgD.style.width=widthL+"px";
                    ImgD.style.height=heightL+"px";
                }
                else
                {
                    setTimeout( "showImage()", 100);   //   判断图片是否装载完成,只有在装载完成后才能取到宽高值
                }
            }
            else
            {
                return; //alert( "系统错误 ");
            }
        }
</script>
用上面的方法可以实现图像比较小的图像显示,但超过了13M就不显示了!!
并且显示效果也不理想,比较卡!!
你有什么好点的方法来实现图像的缩略图快速显示吗?还望赐教!!


[ 本帖最后由 cccool 于 2010-10-29 17:47 编辑 ]
#4
cccool2010-10-29 22:16
来人解惑啊!!
#5
wangnannan2010-10-30 08:21
ScaleGrid_Load()代码能否贴出来?
恩 现有其他解决办法如下
程序代码:
现在有几种方法实现
1> Image imge = Image.FromFile(file.FullName);
  this.imageList1.Images.Add(imge.GetThumbnailImage(32,32,null,IntPtr.Zero))
  item.ImageIndex = this.imageList1.Images.Count - 1;
2>public Image MakeThumbnail(string originalImagePath, int width, int height, string mode)
  {
  System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);

  int towidth = width;
  int toheight = height;

  int x = 0;
  int y = 0;
  int ow = originalImage.Width;
  int oh = originalImage.Height;

  switch (mode)
  {
  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.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);

  //新建一个画板
  System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);

  //设置高质量插值法
  g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

  //设置高质量,低速度呈现平滑程度
  g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

  //清空画布并以透明背景色填充
  g.Clear(System.Drawing.Color.Transparent);

  //在指定位置并且按指定大小绘制原图片的指定部分
  g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight),
  new System.Drawing.Rectangle(x, y, ow, oh),
  System.Drawing.GraphicsUnit.Pixel);

  try
  {
  return (Image)bitmap.Clone();
  }
  catch (System.Exception e)
  {
  throw e;
  }
  finally
  {
  originalImage.Dispose();
  bitmap.Dispose();
  g.Dispose();
  }
  }
3> [DllImport("gdi32.dll", EntryPoint = "FindWindow")]
  private static extern GpStatus GdiplusStartup(long token, string lpWindowName, GdiplusStartupInput inputbuf, ref long outputbuf);


  [DllImport("gdi32.dll", EntryPoint = "FindWindow")]
  private static extern GpStatus GdiplusShutdown(long token);

  [DllImport("gdi32.dll", EntryPoint = "FindWindow")]
  private static extern GpStatus GdipDrawImageRect(long graphics, long image, int X, int Y, int Width, int Height);



  [DllImport("gdi32.dll", EntryPoint = "FindWindow")]
  private static extern GpStatus GdipCreateFromHDC(long hDC, long graphics);

  [DllImport("gdi32.dll", EntryPoint = "FindWindow")]
  private static extern GpStatus GdipDeleteGraphics(long graphics);


  [DllImport("gdi32.dll", EntryPoint = "FindWindow")]
  private static extern GpStatus GdipLoadImageFromFile(string filename, long image);

  [DllImport("gdi32.dll", EntryPoint = "FindWindow")]

另外缩略图水印组件wsImage3.5 也不错
例如
程序代码:
1、在aspx文件加上aspcompat=true
<%@ Page language="c#" Codebehind="AddProduct.aspx.cs" AutoEventWireup="false" Inherits="Techsun.XYD.AdminOfXYD.AddProduct" aspcompat=true%>
2、在vs里引用com组件wsImage.dll
3、生成缩略图
wsImage.Resize obj = (wsImage.Resize)Server.CreateObject("wsImage.Resize");

string FilePath = Server.MapPath("25.jpg");
string strOutputPic = Server.MapPath("25_s.jpg");
int w = 125;
int h = 125;
int lngType = 0;

obj.LoadSoucePic(FilePath);
obj.Quality = 100;
obj.OutputSpic(strOutputPic,w,h,lngType);
obj.Free();
#6
jianghong_022010-10-30 09:17
老大你用的是C#写的,人家能懂吗?
#7
cccool2010-10-31 11:24
回复 5楼 wangnannan
谢谢你的解答!
ScaleGrid_Load()只是又后台返回加载图片的路径,没什么代码。
我现在也是用的第二种方法生成缩略图,然后显示时ScaleGrid_Load()返回缩略图的路径,能有达到不错的效果。
但现在又出了个新问题:
       用方法二生成缩略图时,当原始图像很大时会提示内存不足,查询了一下,网上说一般不会出现内存不足的问题,肯定是程序有问题,可能导致了内存泄露。
只有本站会员才能查看附件,请 登录


你再帮忙看看问题出在哪?有什么办法能解决,再次感谢!
#8
wangnannan2010-10-31 11:36
OutOfMemoryException 异常 个人认为有三种情况
1)是不是图像格式不正确?
2)打开了不是图像的文件而引发的异常
3)如果 GDI+ 不支持文件的像素格式,则此方法将引发 OutOfMemoryException 异常
个人理解 会不会是.Net 2.0环境对内存管理造成的,因为当回收内存的时候,就一切正常了,当内存到达一个相对峰值时,应用程序对单个对象占用内存的大小就有限制了呢。会不会这个图片在小一点点就没有问题了。
#9
cccool2010-10-31 11:53
回复 8楼 wangnannan
楼主很厉害!
我查了一下也就这几个原因
但是我的原始图像是以二进制方式存储在SQL数据库中的,存储时记录了图像的格式的。
所以1,2两种情况不会发生。
但3的情况我不是很理解,你能详细介绍下吗?有没有可能是3的情况导致的,
还有就是我在vs下调试刚开始一段时间还行,没出这种错误,当我发布后就出现这种错误了,然后再回到vs下调试也出现这种错误,很是纳闷!
以后要向你学习,多多请教了!

1