2012-05-19 3 views
3

У меня есть способ, как показано ниже, чтобы сохранить изображение как jpeg. Я хочу сохранить все изображения с одинаковой высотой и шириной без искажения.Сохранение как jpeg из memystream в C#

Как я могу это сделать? Пожалуйста, помогите

public void SaveFileOnDisk(MemoryStream ms, string FileName) 
{ 
    try 
    { 
     string appPath = HttpContext.Current.Request.ApplicationPath; 
     string physicalPath = HttpContext.Current.Request.MapPath(appPath); 
     string strpath = physicalPath + "\\Images"; 
     string WorkingDirectory = strpath; 


     System.Drawing.Image imgSave = System.Drawing.Image.FromStream(ms); 
     Bitmap bmSave = new Bitmap(imgSave); 
     Bitmap bmTemp = new Bitmap(bmSave); 

     Graphics grSave = Graphics.FromImage(bmTemp); 
     grSave.DrawImage(imgSave, 0, 0, imgSave.Width, imgSave.Height); 

     bmTemp.Save(WorkingDirectory + "\\" + FileName + ".jpg"); 


     imgSave.Dispose(); 
     bmSave.Dispose(); 
     bmTemp.Dispose(); 
     grSave.Dispose(); 
    } 
    catch (Exception ex) 
    { 
     //lblMsg.Text = "Please try again later."; 
    } 

} 
+0

Можете ли вы объяснить, что вы подразумеваете под «одинаковой высотой и шириной, без искажения»? Если исходные фотографии имеют различное соотношение сторон (то есть соотношение ширины и высоты), чем ваши выходные размеры, вы * будете иметь искажение. Вашими единственными опциями, позволяющими избежать искажений, являются (1) почтовый ящик с рамкой с той или иной стороны или (2) размер вашего адресата - это «фиксированное» измерение и одно измерение, которое изменяется в зависимости от соотношения сторон исходной фотографии. – richardtallent

+0

Теперь это невозможно, не так ли? Если вы получаете изображение 400 x 300, а другое - 400 x 100, вы не можете сохранить их с тем же размером, не искажая * что-то *. Вы можете почтовым ящиком те, которые не подходят, используйте Graphics.DrawImage(). –

+0

@acadia Почему ты не принимаешь ответ – techno

ответ

3

Изменение размера изображения и сохранить его

Private void ResizeImage(Image img, double maxWidth, double maxHeight) 
{ 
    double srcWidth = img.Source.Width; 
    double srcHeight = img.Source.Height; 

    double resizeWidth = srcWidth; 
    double resizeHeight = srcHeight; 

    double aspect = resizeWidth/resizeHeight; 

    if (resizeWidth > maxWidth) 
    { 
     resizeWidth = maxWidth; 
     resizeHeight = resizeWidth/aspect; 
    } 
    if (resizeHeight > maxHeight) 
    { 
     aspect = resizeWidth/resizeHeight; 
     resizeHeight = maxHeight; 
     resizeWidth = resizeHeight * aspect; 
    } 

    img.Width = resizeWidth; 
    img.Height = resizeHeight; 
} 

Вы можете использовать этот код, чтобы изменить размер изображения до требуемого Dimention Перед сохранением его

1

Как уже упоминалось выше, если вы хотите, чтобы все изображения были одинакового размера без искажений, вам нужно будет изменять размер, сохраняя соотношение сторон. Смотрите эту функцию ниже:

public Image ResizeWithSameRatio(Image image, float width, float height) 
{ 
    // the colour for letter boxing, can be a parameter 
    var brush = new SolidBrush(Color.Black); 

    // target scaling factor 
    float scale = Math.Min(width/image.Width, height/image.Height); 

    // target image 
    var bmp = new Bitmap((int)width, (int)height); 
    var graph = Graphics.FromImage(bmp); 

    var scaleWidth = (int)(image.Width * scale); 
    var scaleHeight = (int)(image.Height * scale); 

    // fill the background and then draw the image in the 'centre' 
    graph.FillRectangle(brush, new RectangleF(0, 0, width, height)); 
    graph.DrawImage(image, new Rectangle(((int)width - scaleWidth)/2, ((int)height - scaleHeight)/2, scaleWidth, scaleHeight)); 

    return bmp; 
} 

Теперь ваша функция использования может быть значительно упрощена (при условии, 1024x768 целевых изображений здесь):

public void SaveFileOnDisk(MemoryStream ms, string FileName) 
{ 
    try 
    { 
     string appPath = HttpContext.Current.Request.ApplicationPath; 
     string physicalPath = HttpContext.Current.Request.MapPath(appPath); 
     string strpath = physicalPath + "\\Images"; 
     string WorkingDirectory = strpath; 

     using (var original = Image.FromStream(ms)) 
     using (var resized = ResizeWithSameRatio(original, 1024, 768)) 
     { 
      resized.Save(WorkingDirectory + "\\" + FileName + ".jpg"); 
     } 
    } 
    catch (Exception ex) 
    { 
     //lblMsg.Text = "Please try again later."; 
    } 
} 

Примечание дополнительное упрощение с точки зрения числа переменных, и размещения с помощью using вместо Dispose().

Смежные вопросы