2010-08-05 1 views
3

На моем сайте пользователи могут загружать фотографии. В настоящее время я сжимаю и изменяю размер фотографии, чтобы убедиться, что они не являются огромными файлами. Но это создает фотографии разных размеров ... что делает сайт немного «уродливым», на мой взгляд.Как вы можете разместить загруженную фотографию без пробелов с пробелом, на C#?

Я бы хотел, чтобы миниатюры были квадратными изображениями, но не с помощью прокладки. Это нормально, если есть некоторая потеря фотографии в миниатюре. Я бы хотел, чтобы точность верности фотографии была высокой, даже если это означает, что некоторые кадрирования должны произойти.

+2

Один маленький наконечник от этого на сайте один раз: если исходное изображение шире, чем оно высокое, обрезайте равное количество с каждой стороны. Но если исходное изображение выше его ширины, обрезайте больше снизу, чем сверху, и, по моему опыту, вы с меньшей вероятностью потеряете ценную деталь (например, на портретной фотографии, вы обрезаете предметные ноги, а не их лицо!) – Carson63000

+0

@ Carson63000 - вы рок, это отличный момент, чтобы иметь в виду. Спасибо! – Chaddeus

ответ

3

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

public Bitmap CreateThumbnail(Bitmap RawImage) 
    { 
     int width = RawImage.Width; 
     int height = RawImage.Height; 

     Size ThumbnailDimensions = new Size(); 
     ThumbnailDimensions.Width = 100; 
     ThumbnailDimensions.Height = 100; 

     Rectangle cropArea = new Rectangle(); 
     if (width > height) 
     {    
      cropArea.Width = height; 
      cropArea.Height = height; 
      cropArea.X = 0; 
      cropArea.Y = 0;     
     } 
     else if (width < height) 
     { 
      cropArea.Width = width; 
      cropArea.Height = width; 
      cropArea.X = 0; 
      cropArea.Y = 0; 
     } 
     if(width != height) Bitmap thumbnail = CropImage(RawImage, cropArea); 

     thumbnail = ResizeImage(thumbnail, ThumbnailDimensions); 
     return thumbnail; 
    } 

Это просто обрезает из верхнего левого угла затем изменяет его на мои размеры миниатюр.

+0

Это почти то, что я искал, спасибо тонну! – Chaddeus

+0

без проблем получайте удовольствие. – Adrian

+5

Где реализуется «CropImage»? – Andrey

-1

Вместо того, чтобы обрезать, я бы сделал div или что бы вы ни разместили в фиксированном квадратном размере. Масштабируйте изображение, чтобы оно соответствовало этому квадрату.

Как бы вы решили обрезать его? Сверху слева? Внизу справа? Центр?

+0

Я не хочу делать масштабирование на клиенте, так как это проблема производительности. Я планирую обрезать сверху слева, используя самый короткий размер как размер, квадрат. Затем, как упоминал Carson6300, если он шире, чем выше, урожай равен с каждой стороны. Если он выше, чем широкий, урожай в основном снизу. – Chaddeus

+0

Проблема в том, что если вы снимаете большое изображение и просто масштабируете его, браузер все еще загружает большое изображение. Умножьте, что на несколько изображений и ваш сайт загружает бак. – Adrian

+0

@Chad, @antonlavy - Где в моем ответе я говорю о масштабировании на стороне клиента? –

2

Я хотел бы представить вам нужно кратчайший размер (либо ш или ч), а также использовать его в качестве измерения для создания обрезанного изображения, по существу, вы можете обрезать, а затем масштабировать изображение. Посмотрите this article в качестве примера для обрезки изображения. Также проверьте this Stack Overflow question относительно качества изображения.

+0

Это замечательная точка, используйте кратчайший размер для настроек урожая. Благодарю. – Chaddeus

-1

Чтобы сделать прямоугольник в квадрат, вам нужно либо нанести пэд, изменить размер без сохранения соотношения сторон или обрезки (или комбинации).

Вот код для кадрирования

http://snippets.dzone.com/posts/show/1484

(я работаю на Atalasoft - в нашем DotImage Фото SDK), это

AtalaImage img = new AtalaImage("filename.jpg"); 
AtalaImage img2 = new CropCommand(/*point and size of crop */).Apply(img).Image; 
img2.Save("filename", new JpegEncoder(quality), null); 
Смежные вопросы