изменить размер изображения c # / asp.net до определенного формата (широкоэкранное 16: 9) - PullRequest
1 голос
/ 24 февраля 2011

Я ищу способ изменить размер и обрезать изображения до определенного размера в фиксированном соотношении, например 16: 9.Таким образом, у меня есть любое изображение и любой размер, и оно должно быть изменено и обрезано в соотношении 16: 9.

Просто обрезка не очень хороша.Я хочу, чтобы изображение было изменено больше и при необходимости может быть обрезано.Или лучше: я хочу использовать как можно больше от исходного изображения, но изменить его размер и обрезать по центру, чтобы я мог использовать его в фиксированном HTML-формате с соотношением 16: 9.

Ответы [ 3 ]

3 голосов
/ 24 февраля 2011

Вот решение, которое я использовал несколько раз.Это должно сначала изменить размер, а затем обрезать в зависимости от того, какой размер имеет избыток.Изображение не будет растягиваться.

using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.IO;

protected Image imageCrop(Image image, int width, int height, AnchorPosition anchor)
{
    int sourceWidth = image.Width;
    int sourceHeight = image.Height;
    int sourceX = 0;
    int sourceY = 0;
    int destX = 0;
    int destY = 0;

    float nPercent = 0;
    float nPercentW = 0;
    float nPercentH = 0;

    nPercentW = (Convert.ToSingle(width) / Convert.ToSingle(sourceWidth));
    nPercentH = (Convert.ToSingle(height) / Convert.ToSingle(sourceHeight));

    if (nPercentH < nPercentW)
    {
        nPercent = nPercentW;
        switch (anchor) {
            case AnchorPosition.Top:
                destY = 0;
                break;
            case AnchorPosition.Bottom:
                destY = Convert.ToInt32(height - (sourceHeight * nPercent));
                break;
            default:
                destY = Convert.ToInt32((height - (sourceHeight * nPercent)) / 2);
                break;
        }
    }
    else
    {
        nPercent = nPercentH;
        switch (anchor) {
            case AnchorPosition.Left:
                destX = 0;
                break;
            case AnchorPosition.Right:
                destX = Convert.ToInt32((width - (sourceWidth * nPercent)));
                break;
            default:
                destX = Convert.ToInt32(((width - (sourceWidth * nPercent)) / 2));
                break;
        }
    }

    int destWidth = Convert.ToInt32((sourceWidth * nPercent));
    int destHeight = Convert.ToInt32((sourceHeight * nPercent));

    Bitmap bmPhoto = new Bitmap(width, height, PixelFormat.Format24bppRgb);
    bmPhoto.SetResolution(image.HorizontalResolution, image.VerticalResolution);

    Graphics grPhoto = Graphics.FromImage(bmPhoto);
    grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
    grPhoto.DrawImage(image, new Rectangle(destX, destY, destWidth, destHeight), new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight), GraphicsUnit.Pixel);
    grPhoto.Dispose();

    return bmPhoto;
}

public enum Dimensions
{
    Width,
    Height
}

public enum AnchorPosition
{
    Top,
    Center,
    Bottom,
    Left,
    Right
}

Вот пример вызова функции:

Image image = image.FromFile(imagePath);
Image thumb = imageCrop(image, 100, 100, AnchorPosition.Top);
1 голос
/ 24 февраля 2011

Вы можете использовать этот код:

 Size NewSize = new Size();
                NewSize.Width = 70;
                NewSize.Height = 60;
                System.Drawing.Image small = resizeImage(Image.FromFile(source), NewSize);
                small.Save(your path);

// и это функция для изменения размера

    public System.Drawing.Image resizeImage(Image imgToResize, Size size)
        {
            int sourceWidth = imgToResize.Width;
            int sourceHeight = imgToResize.Height;
            float nPercent = 0;
            float nPercentW = 0;
            float nPercentH = 0;
            nPercentW = ((float)size.Width / (float)sourceWidth);
            nPercentH = ((float)size.Height / (float)sourceHeight);
            if (nPercentH < nPercentW) nPercent = nPercentH;
            else
                nPercent = nPercentW;
            int destWidth = (int)(sourceWidth * nPercent);
            int destHeight = (int)(sourceHeight * nPercent);
            Bitmap b = new Bitmap(destWidth, destHeight);
            Graphics g = Graphics.FromImage((Image)b);
            g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
            g.Dispose();
            return (System.Drawing.Image)b;
        }
1 голос
/ 24 февраля 2011

Я сделал нечто подобное, чтобы создать миниатюру стандартного размера.Вот ссылка на код (в блоге).

http://blog.bobcravens.com/2009/07/mobileme-scrolling-image-viewer/

Концепция та же.Я использовал некоторую логику для автоматического выбора области растрового изображения для обрезки на основе размеров.

Надеюсь, это поможет.

Bob

...