解决方案 »

  1.   

    伪代码:double 高宽比 = 3.0 / 4.0;
    if (图片原始的宽 / 高宽比 > 原始图片的高)
    {
        // 图片过扁,那么用图片的高,并且切掉左右多余的部分
        Rect r;
        r.Left = (图片原始的宽 - 图片原始的高 * 高宽比) / 2
        r.Top = 0
        r.Width =  图片原始的高 * 高宽比
        r.Height = 原始图片的高
        将这个区域的图片缩放
    }
    else
    {
        // 图片过瘦,那么用图片的宽,并且切掉上下多于的部分
        ...
    }
      

  2.   

    用Bitmap.Clone(x,y,width,height)就可以
      

  3.   

     Refer:
    http://www.cnblogs.com/insus/p/3627437.html
      

  4.   

     protected virtual  Size CalculateDimensions(Size originalSize, int targetSize)
            {
                var newSize = new Size();
                if (originalSize.Height > originalSize.Width) // portrait 
                {
                    newSize.Width = (int)(originalSize.Width * (float)(targetSize / (float)originalSize.Height));
                    newSize.Height = targetSize;
                }
                else // landscape or square
                {
                    newSize.Height = (int)(originalSize.Height * (float)(targetSize / (float)originalSize.Width));
                    newSize.Width = targetSize;
                }
                return newSize;
            }public void NewPicture(byte[] PictureBinary, int offsetX = 0, int offsetY = 0, int targetSize = 0, double matrix = 1)
            {
                var picStream = new MemoryStream(PictureBinary);
                var picBit = new Bitmap(picStream);
                var newSize = CalculateDimensions(picBit.Size, targetSize);
                if (newSize.Width < 1)
                    newSize.Width = 1;
                if (newSize.Height < 1)
                    newSize.Height = 1;
                var newBitMap = new Bitmap(200, 200);//the new picture size
                var g = Graphics.FromImage(newBitMap);
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;            g.DrawImage(picBit, offsetX, offsetY, newSize.Width, newSize.Height);
    string localFilename = string.Format("{0}_{1}.{2}", picture.Id.ToString("10000000"), "combine", lastPart); 
                var ici = GetImageCodecInfoFromExtension(lastPart) ?? GetImageCodecInfoFromMimeType("image/jpeg");
        var ep = new EncoderParameters();
                ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, this.ImageQuality);
                newBitMap.Save(Path.Combine(this.LocalThumbImagePath, localFilename), ici, ep);
                newBitMap.Dispose();
                picBit.Dispose();
    }