• 图片等比例不丢真缩放

    1.参考文献:http://blog.itpub.net/631872/viewspace-1049782/

    2.实现方法:

    //使用方法调用GenerateHighThumbnail()方法即可
    //参数oldImagePath表示要被缩放的图片路径
    //参数newImagePath表示缩放后保存的图片路径
    //参数width和height分别是缩放范围宽和高
    public static void GenerateHighThumbnail(string oldImagePath, string newImagePath, int width, int height)
    {
    	System.Drawing.Image oldImage = System.Drawing.Image.FromFile(oldImagePath);
    	int newWidth = AdjustSize(width, height, oldImage.Width, oldImage.Height).Width;
    	int newHeight =AdjustSize(width, height, oldImage.Width, oldImage.Height).Height;
    	//。。。。。。。。。。。
    	System.Drawing.Image thumbnailImage = oldImage.GetThumbnailImage(newWidth, newHeight,new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero);
    	System.Drawing.Bitmap bm = new System.Drawing.Bitmap(thumbnailImage);
    	//处理JPG质量的函数
    	System.Drawing.Imaging.ImageCodecInfo ici = GetEncoderInfo("image/jpeg");
    	if (ici != null)
    	{
    		System.Drawing.Imaging.EncoderParameters ep = new System.Drawing.Imaging.EncoderParameters(1);
    		ep.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)100);
    		bm.Save(newImagePath, ici, ep);
    		//释放所有资源,不释放,可能会出错误。
    		ep.Dispose();
    		ep = null;
    	}
    	ici = null;
    	bm.Dispose();
    	bm = null;
    	thumbnailImage.Dispose();
    	thumbnailImage = null;
    	oldImage.Dispose();
    	oldImage = null;
    }
    
    
    private static bool ThumbnailCallback()
    {
    	return false;
    }
    
    
    private static ImageCodecInfo GetEncoderInfo(String mimeType)
    {
    	int j;
    	ImageCodecInfo[] encoders;
    	encoders = ImageCodecInfo.GetImageEncoders();
    	for (j = 0; j < encoders.Length; ++j)
    	{
    		if (encoders[j].MimeType == mimeType)
    		return encoders[j];
    	}
    	return null;
    }
    
    
    public struct PicSize
    {
    	public int Width;
    	public int Height;
    }
    
    
    public static PicSize AdjustSize(int spcWidth, int spcHeight, int orgWidth, int orgHeight)
    {
    	PicSize size = new PicSize();
    	// 原始宽高在指定宽高范围内,不作任何处理 
    	if (orgWidth <= spcWidth && orgHeight <= spcHeight)
    	{
    		size.Width = orgWidth;
    		size.Height = orgHeight;
    	}
    	else
    	{
    		// 取得比例系数 
    		float w = orgWidth / (float)spcWidth;
    		float h = orgHeight / (float)spcHeight;
    		// 宽度比大于高度比 
    		if (w > h)
    		{
    			size.Width = spcWidth;
    			size.Height = (int)(w >= 1 ? Math.Round(orgHeight / w) : Math.Round(orgHeight * w));
    		}
    		// 宽度比小于高度比 
    		else if (w < h)
    		{
    			size.Height = spcHeight;
    			size.Width = (int)(h >= 1 ? Math.Round(orgWidth / h) : Math.Round(orgWidth * h));
    		}
    		// 宽度比等于高度比 
    		else
    		{
    			size.Width = spcWidth;
    			size.Height = spcHeight;
    		}
    	}
    	return size;
    }

    展开全文
  • 有以下三个API:将矩形图片截取成正方形,然后缩放成你要的比例 将矩形图缩放成你要的比例
  • c# 图片按比例缩放

    2017-06-22 14:21:18
    public static Bitmap GetThumbnail(Bitmap b, int destHeight,int destWidth)   {   System.Drawing.Image imgSource = b;   System.Drawing.Imaging.Im
    public static Bitmap GetThumbnail(Bitmap b, int destHeight,int destWidth)  
            {          
                System.Drawing.Image imgSource = b;     
                System.Drawing.Imaging.ImageFormat thisFormat = imgSource.RawFormat; 
                int sW = 0, sH = 0;         
                // 按比例缩放          
                int sWidth = imgSource.Width;
                int sHeight = imgSource.Height;
                if (sHeight > destHeight || sWidth > destWidth)
                {              
                    if ((sWidth * destHeight) > (sHeight * destWidth))   
                    {                
                        sW = destWidth;   
                        sH = (destWidth * sHeight) / sWidth; 
                    }              
                    else           
                    {          
                        sH = destHeight;   
                        sW = (sWidth * destHeight) / sHeight;   
                    }          
                }          
                else        
                {         
                    sW = sWidth; 
                    sH = sHeight; 
                }   
                Bitmap outBmp = new Bitmap(destWidth, destHeight); 
                Graphics g = Graphics.FromImage(outBmp);     
                g.Clear(Color.Transparent);        
                // 设置画布的描绘质量        
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.SmoothingMode = SmoothingMode.HighQuality;      
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;   
                g.DrawImage(imgSource,new Rectangle((destWidth - sW) / 2, (destHeight - sH) / 2, sW, sH), 0, 0, imgSource.Width, imgSource.Height, GraphicsUnit.Pixel);    
                g.Dispose();     
                // 以下代码为保存图片时,设置压缩质量    
                EncoderParameters encoderParams = new EncoderParameters(); 
                long[] quality = new long[1];     
                quality[0] = 100;     
                EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);  
                encoderParams.Param[0] = encoderParam;  
                imgSource.Dispose();        
                return outBmp;     
            }
    展开全文
  • C#图片按比例缩放

    2014-11-18 16:38:33
    1 // 按比例缩放图片  2 public Image ZoomPicture(Image SourceImage, int TargetWidth, int TargetHeight)  3 {  4 int IntWidth; //新的图片宽  5 int IntHeight; //新的图片高  6 try  7 {  8 ...

      1 // 按比例缩放图片

      2 public Image ZoomPicture(Image SourceImage, int TargetWidth, int TargetHeight)

      3 {

      4 int IntWidth; //新的图片宽

      5 int IntHeight; //新的图片高

      6 try

      7 {

      8 System.Drawing.Imaging.ImageFormat format = SourceImage.RawFormat;

      9 System.Drawing.Bitmap SaveImage = new System.Drawing.Bitmap(TargetWidth, TargetHeight);

      10 Graphics g = Graphics.FromImage(SaveImage);

      11 g.Clear(Color.White);

      12

      13 //计算缩放图片的大小 http://www.cnblogs.com/roucheng/

      14

      15 if (SourceImage.Width > TargetWidth && SourceImage.Height <= TargetHeight)//宽度比目的图片宽度大,长度比目的图片长度小

      16 {

      17 IntWidth = TargetWidth;

    展开全文
  • 如下图,我要将图片的大小进行等比缩放,此时我要求图片的宽度和高度大于最小尺寸,但是要求宽度和高度都不大于最大尺寸,如果这两个规则冲突,优先满足不大于最大尺寸 按照规则可以看到,如下图,图片的宽度等于...

    本文只是告诉大家如何计算缩放之后的宽度和高度,不包含实际的图片缩放方法

    如下图,我要将图片的大小进行等比缩放,此时我要求图片的宽度和高度大于最小尺寸,但是要求宽度和高度都不大于最大尺寸,如果这两个规则冲突,优先满足不大于最大尺寸

    按照规则可以看到,如下图,图片的宽度等于最大宽度了,此时虽然图片的高度小于最小高度,但是也不应该对图片进行缩放

    为什么需要有最大限制?原因是等比缩放对于长图计算不友好,如果我有一张图片的宽度和高度比例是 1:1000 那么此时如果没有限制最大高度,那么将宽度缩放到最小宽度需要缩放10倍,此时的高度就太大了

    下面就是计算方法

    先定义大小这个类

        public class Size
        {
            public Size(double width, double height)
            {
                Width = width;
                Height = height;
            }
    
            public double Width { set; get; }
            public double Height { set; get; }
    
            /// <inheritdoc />
            public override string ToString()
            {
                return $"Width={Width:0.00} Height={Height:0.00}";
            }
        }

    计算的方法需要传入当前图片的宽度和高度,最小的宽度和高度和最大的宽度和高度,返回的值是计算的宽度和高度

            static Size OptimizationSize(Size currentSize, Size minSize, Size maxSize)

    计算的方法就是先获取宽度和高度的缩放到最小大小的缩放值

                var height = currentSize.Height;
                var width = currentSize.Width;
                var widthScale = minSize.Width / width;
                var heightScale = minSize.Height / height;

    如果此时的图片本来就大于最小宽度和高度,就不能让图片的缩放比原来小,除非大于最大宽度或高度

                var minScale = Math.Max(widthScale, heightScale);
                minScale = Math.Max(minScale, 1.0);

    计算图片和最大宽度和高度的缩放,同时拿到最大缩放里面的最小的一个,这样缩放完成之后就不会大于最大的宽度和高度

                var maxWidthScale = maxSize.Width / width;
                var maxHeightScale = maxSize.Height / height;
    
                var maxScale = Math.Min(maxWidthScale, maxHeightScale);

    现在获取了 minScale 和 maxScale 需要根据这两个缩放计算最小的缩放

                var scale = Math.Min(minScale, maxScale);

    为了让图片显示更锐利,这里让缩放是整数,使用整数可能略大于最大的宽度和高度

                scale = Math.Ceiling(scale);

    所有代码

            /// <summary>
            /// 宽度和高度不小于最小大小,但是不大于最大大小,缩放使用等比缩放
            /// <para/>
            /// 规则:
            /// <para/>
            /// - 如果有一边小于最小大小,那么缩放到这一边大于等于最小大小
            /// <para/>
            /// - 如果一边缩放之后大于最大的大小,那么限制不能超过最大的大小
            /// <para/>
            /// - 尽可能让大小接近最小大小,但是保证宽度和高度都不大于最大大小
            /// </summary>
            /// <param name="currentSize"></param>
            /// <param name="minSize"></param>
            /// <param name="maxSize"></param>
            /// <returns></returns>
            static Size OptimizationSize(Size currentSize, Size minSize, Size maxSize)
            {
                if (currentSize.Width > minSize.Width && currentSize.Height > minSize.Height)
                {
                    if (currentSize.Width <= maxSize.Width && currentSize.Height <= maxSize.Height)
                    {
                        return currentSize;
                    }
                }
    
                var height = currentSize.Height;
                var width = currentSize.Width;
                var widthScale = minSize.Width / width;
                var heightScale = minSize.Height / height;
    
                // 如果超过最大的大小
                var maxWidthScale = maxSize.Width / width;
                var maxHeightScale = maxSize.Height / height;
    
                var maxScale = Math.Min(maxWidthScale, maxHeightScale);
                var minScale = Math.Max(widthScale, heightScale);
                minScale = Math.Max(minScale, 1.0);
                var scale = Math.Min(minScale, maxScale);
                // 尽可能使用整数
                scale = Math.Ceiling(scale);
                return new Size(width * scale, height * scale);
            }

    在 WPF 中可以通过设置 Image 控件的宽度和高度,此时因为尺寸是使用相同的值缩放,所以刚好图片使用 Fill 就能贴上去

    但是无论用什么的算法,只要图片和原始尺寸不相同,那么一定会糊。无论是图片进行放大或缩小,都会模糊,这是基础的知识,想了解原理请自行百度

    我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

    如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

    如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

    展开全文
  • c#图片等比压缩

    2017-05-09 10:46:47
    c#图片等比压缩方法 using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Linq; using System.Text; using ...

    c#图片等比压缩方法

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Drawing.Imaging;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Common
    {
       public class ImageHelper
        {
    
            #region GetPicThumbnail
           /// <summary>
           /// 无损压缩图片
           /// </summary>
           /// <param name="sFile">文件位置</param>
           /// <param name="dFile">压缩后保存位置</param>
           /// <param name="flag">压缩比例,eg:按照百分比算如80,就是原图的高度乘以80%</param>
           /// <returns></returns>
            public static bool GetPicThumbnail(string sFile, string dFile ,int flag)
            {
                System.Drawing.Image iSource = System.Drawing.Image.FromFile(sFile);
                ImageFormat tFormat = iSource.RawFormat;
                int sW = 0, sH = 0;
                //按比例缩放
                Size tem_size = new Size(iSource.Width, iSource.Height);
                int dHeight=iSource.Height*flag/100; //高度压缩百分不
                int dWidth = iSource.Width * flag / 100;//宽度压缩百分比
                if (tem_size.Width > dHeight || tem_size.Width > dWidth) //将**改成c#中的或者操作符号
                {
                    if ((tem_size.Width * dHeight) > (tem_size.Height * dWidth))
                    {
                        sW = dWidth;
                        sH = (dWidth * tem_size.Height) / tem_size.Width;
                    }
                    else
                    {
                        sH = dHeight;
                        sW = (tem_size.Width * dHeight) / tem_size.Height;
                    }
                }
                else
                {
                    sW = tem_size.Width;
                    sH = tem_size.Height;
                }
    
                Bitmap ob = new Bitmap(dWidth, dHeight);
                Graphics g = Graphics.FromImage(ob);
                g.Clear(Color.WhiteSmoke);
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
                g.Dispose();
                //以下代码为保存图片时,设置压缩质量
                EncoderParameters ep = new EncoderParameters();
                long[] qy = new long[1];
                qy[0] = flag;//设置压缩的比例1-100
                EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
                ep.Param[0] = eParam;
                try
                {
                    ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
    
                    ImageCodecInfo jpegICIinfo = null;
    
                    for (int x = 0; x < arrayICI.Length; x++)
                    {
                        if (arrayICI[x].FormatDescription.Equals("JPEG"))
                        {
                            jpegICIinfo = arrayICI[x];
                            break;
                        }
                    }
                    if (jpegICIinfo != null)
                    {
                        ob.Save(dFile, jpegICIinfo, ep);//dFile是压缩后的新路径
                    }
                    else
                    {
                        ob.Save(dFile, tFormat);
                    }
                    return true;
                }
                catch
                {
                    return false;
                }
                finally
                {
                    iSource.Dispose();
                    ob.Dispose();
    
                }
            }
            #endregion
        }
    }
    


    展开全文
  • 在使用图片的过程中,我们有时候需要将图片缩放到特定的宽度和高度,但是又不希望图片被直接拉伸而变形,而是实现图片的等比例缩放。类似于Winform的PictureBox的SizeMode属性的Zoom,而不是StretchImage。 //等...
  • C# 按比例缩放图片

    2019-01-24 09:38:38
    //按比例缩放图片(运行图背景图片) private Bitmap ZoomImage(Bitmap bitmap, int destHeight, int destWidth) { try { System.Drawing.Image sourImage = bitmap; ...
  • 继承WebBrowoser控件,新增页面内容缩放功能。。。
  • C#控件窗体保持等比例缩放 一般用户使用程序都喜欢最大化窗口,这样可以显示的更全面,但程序员在编辑程序界面时一般都是较小的窗口,这样最大化窗口时不能使各个控件均匀放大显示,所以需要一定技巧来实现控件的等...
  • 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_20749503/article/details/84787408 ...
  • 居中,且等比缩放,才是图片在单元格上的完美展示。 /// <summary> /// 图片在单元格等比缩放居中显示 /// </summary> /// <param name="cell">单元格</param> /// <param name.....
  • using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows....namesp
  • public Bitmap ChangeImgSize(Image bit, double Multiple) { Bitmap newBitmap = new Bitmap(Convert.ToInt32(bit.Width * Multiple), Convert.ToInt32(bit.Height * Multiple)); ...
  • // 底边为准等比缩放 // 以width为准对齐,先算出缩放比例,然后再看hight,等比例缩放后,有两种情况: // 1,不够显示,原图片中上下裁剪相同尺寸 // 2,足够显示,原图片Y轴居中放置 srcWidthRange = ...
  • /*让文字和标签的大小随着屏幕的尺寸做变话 等比缩放*/ var html = document.getElementsByTagName('html')[0]; /*取到屏幕的宽度*/ var width = window.innerWidth; /* 640 100 320 50 */ var fontSize = ...
  • //原图路径 string imgPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\0.gif"; //原图 Image img = Image.FromFile(imgPath); //不够100*100的
  • c#实现图像的缩放 可设置放大倍数和缩小倍数
1 2 3 4 5 ... 20
收藏数 390
精华内容 156