Адаптируйте код asp.net для изменения размера изображения - PullRequest
1 голос
/ 28 июня 2010

После поиска я обнаружил этот код:

Public Sub ResizeImage(ByVal scaleFactor As Double, ByVal fromStream As Stream, ByVal toStream As Stream)
    Dim image__1 = System.Drawing.Image.FromStream(fromStream)
    Dim newWidth = CInt(image__1.Width * scaleFactor)
    Dim newHeight = CInt(image__1.Height * scaleFactor)
    Dim thumbnailBitmap = New System.Drawing.Bitmap(newWidth, newHeight)

    Dim thumbnailGraph = System.Drawing.Graphics.FromImage(thumbnailBitmap)
    thumbnailGraph.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality
    thumbnailGraph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality
    thumbnailGraph.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic

    Dim imageRectangle = New System.Drawing.Rectangle(0, 0, newWidth, newHeight)
    thumbnailGraph.DrawImage(image__1, imageRectangle)
    thumbnailBitmap.Save(toStream, image__1.RawFormat)

    thumbnailGraph.Dispose()
    thumbnailBitmap.Dispose()
    image__1.Dispose()
End Sub

Есть две вещи, которые я не могу «изменить», чтобы решить мою проблему:

  1. Я не хотел бы передавать поток, но я предпочитаю проходить путь как C:\mysite\photo\myphoto.gif. Как я могу "преобразовать" его в файл, а не в поток?
  2. В этой функции я должен передать значение "scale". Но я предпочитаю проверить, является ли изображение слишком большим (например,> 1024x768), чем изменить его размер до максимального значения 1024x768. Как я могу проверить это с помощью System.Drawing.

Как видите, я ничего не знаю о System.Drawing, поэтому мне нужна "тяжелая" помощь для решения этой задачи.

Ответы [ 2 ]

0 голосов
/ 28 июня 2010

Вот код c#, который я сделал около 5 лет назад, чтобы сделать это (он все еще должен работать, я надеюсь, что с тех пор приложение не было затронуто).Я думаю, что он делает все, что вам нужно, но он не увеличивает изображение до 1024x768, если оно меньше.Этот код будет только гарантировать, что если он больше 1024x768, он будет пропорционально изменен в соответствии с этими размерами:

const int maxWidth = 1024;
const int maxHeight = 768;
Image newImage = Image.FromFile("YourPicture.jpg");
double percentToShrink = -1;
if (newImage.Width >= newImage.Height)
{
    // Do we need to resize based on width?
    if (newImage.Width > maxWidth)
    {
        percentToShrink = (double)maxWidth / (double)newImage.Width;
    }
}
else
{
    // Do we need to resize based on width?
    if (newImage.Height > maxHeight )
    {
        percentToShrink = (double)maxHeight  / (double)newImage.Height;
    }
}

int newWidth = newImage.Width;
int newHeight = newImage.Height;

// So do we need to resize?
if (percentToShrink != -1)
{
    newWidth = (int)(newImage.Width * percentToShrink);
    newHeight = (int)(newImage.Height * percentToShrink);
}

// convert the image to a png and get a byte[]
MemoryStream imgStream = new MemoryStream();
Bitmap bmp = new Bitmap(newWidth, newHeight);
using (Graphics g = Graphics.FromImage(bmp))
{
    g.InterpolationMode =   System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    g.FillRectangle(System.Drawing.Brushes.White, 0, 0, newWidth, newHeight);
    g.DrawImage(newImage, 0, 0, newWidth, newHeight);
}

// This can be whatever format you need
bmp.Save(imgStream, System.Drawing.Imaging.ImageFormat.Png);
byte[] imgBinaryData = imgStream.ToArray();
imgStream.Dispose();

Если вам нужно преобразовать это в VB.NET, вы можете использовать C # дляVB.NET конвертер здесь .

0 голосов
/ 28 июня 2010

Первый вопрос:

Dim newImage As Image = Image.FromFile ("SampImag.jpg")

Второй вопрос:

Создайте приватный метод, который будет возвращать вам объект Size на основе исходного объекта Size данного изображения. Вы также можете добавить флаг «сохранить пропорции», если хотите.

...