读书人

有代码兑现图片缩小不失真吗

发布时间: 2012-10-19 16:53:36 作者: rapoo

有代码实现图片缩小不失真吗?
是这样的,我要显示一组图片,从数据库里面提取的,而图片的大小都不一样,我要把他们缩小成一样的大小,但是有的失真了,有没有好的方法实现呢?用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;   }} 

读书人网 >C#

热点推荐