日期:2014-05-17  浏览次数:20943 次

有代码实现图片缩小不失真吗?
是这样的,我要显示一组图片,从数据库里面提取的,而图片的大小都不一样,我要把他们缩小成一样的大小,但是有的失真了,有没有好的方法实现呢?用asp.net技术

------解决方案--------------------
以行或列为基准,按每个图片的比例缩放。别指定宽、高。这种点阵图,缩放时不可能不失真。矢量图可以不失真。
------解决方案--------------------
个人认为不太可能 ,每个图片都有一定的长和宽,就想是a 是 100X200 b是 100X100 的你都给他们改成50X50的 100X100的不会变。但100X200的是1:2的 50X50是1:1的 什么原理能解释 不失真呢?
------解决方案--------------------
按比例缩放,

如果宽和高都没有超过最小尺寸,不用改变大小。

如果宽或高超过最小尺寸,就以宽或高中超出比例大的作为缩小尺寸的依据
------解决方案--------------------
从理论上讲,只要不是矢量图,缩放都会失真。
------解决方案--------------------
先取图片长和宽两者之间小的那个值,
比如宽比较小,长比较大的情况:
后生成一正方形bitmap,长和宽都等于长
按原样在bitmap上drawimage原始图片,起始坐标((正方形长-图长)/2,0),也就是两边留等宽带黑边
然后把正方形缩放到你想调整的正方形大小,因为现在是长和宽同比例缩放,连黑边跟着缩放,图片就不失真了

------解决方案--------------------
等待高手
------解决方案--------------------
失真是什么意思? 如果希望调整大小,可以按比例缩放.
C# code

public static byte[] ResizeImageFile(byte[] imageFile, int targetSizeW, int targetSizeH)
{
   System.Drawing.Image original = System.Drawing.Image.FromStream(new MemoryStream(imageFile));
   int targetH, targetW;
   targetW = targetSizeW;
   targetH = (int)(original.Height * ((float)targetSizeW / (float)original.Width));
   if (targetH > targetSizeH)
   {
      targetH = targetSizeH;
      targetW = (int)(original.Width * ((float)targetSizeH / (float)original.Height));
   }
   if (targetSizeW < (int)original.Width || targetSizeH < (int)original.Height)
   {
      System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(new MemoryStream(imageFile));
      // Create a new blank canvas.  The resized image will be drawn on this canvas.
      Bitmap bmPhoto = new Bitmap(targetW, targetH, PixelFormat.Format24bppRgb);
      bmPhoto.SetResolution(72, 72);
      Graphics grPhoto = Graphics.FromImage(bmPhoto);
      grPhoto.SmoothingMode = SmoothingMode.AntiAlias;
      grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
      grPhoto.PixelOffsetMode = PixelOffsetMode.HighQuality;
      grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, targetW, targetH), 0, 0, original.Width, original.Height, GraphicsUnit.Pixel);
      // Save out to memory and then to a file.  We dispose of all objects to make sure the files don't stay locked.
      MemoryStream mm = new MemoryStream();
      bmPhoto.Save(mm, System.Drawing.Imaging.ImageFormat.Jpeg);
      original.Dispose();
      imgPhoto.Dispose();
      bmPhoto.Dispose();
      grPhoto.Dispose();
      return mm.GetBuffer();
   }
   else
   {
      return imageFile;
   }
}