Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Как создать маленькое изображение из большого?


Автор: Nicholas 14.5.2009, 04:41
У меня на сайте фотоальбом, каждый раз для добавления фотки приходиться в фотошопе создавать маленькую фотку (привью)... :(

Собственно вопрос в следующем, как сделать из большой фотографии фотку заданного размера и ровно обрезать если она не квадратная. 

Например есть jpg файл размером 1200*720  - широкоформатный, из него надо сделать файлик содержащий фотку размером 110*110, но не просто уменьшить первоначальную и растянуть по размеру, а вырезать кусок точно по середине, в данном случае это получиться 720*720 и уменьшить до 110*110.

Честно говоря, вообще не работал с графикой поэтому, прошу подробно объяснить.

 smile 

Автор: MetalFan 14.5.2009, 08:20
может не изобретать велосипед, а взять какую-нибудь acdsee или irfanview или еще что-нибудь подобное?

Добавлено через 1 минуту и 24 секунды
а программно два самых простых варианта: с пом. функций GDI, либо GDI+. второе посложнее, но качественнее (ресайз) и быстрее.

Автор: Alexeis 14.5.2009, 09:27
  Думаю если фотоальбом, то качество имеет значение. Говорят лучшее качество дает фильтр Lanczos см. http://www.torry.net/quicksearchd.php?String=Lanczos&Title=No
  А вообще, схема такая.
  Конвертирование в BMP(GDI+, Intel Jpeg)->Обрезка(Canvas.CopyRect)->Ресайз(Бикубик GDI+ или Lanczos)->Конвертирование в JPEG(GDI+, Intel Jpeg)

 1)Конвертирование в BMP(GDI+, Intel Jpeg). GDI+ есть у нас в факе, Intel Jpeg есть тут на форуме.
 2) Все ясно, есть в справке
 3) Выбор алгоритма
 4) Аналогично 1 

Автор: Dimonka2 14.5.2009, 13:37
Вполне хватит Graphics32. Там есть и готовые фильтры для изменения размеров, поддержка прозрачности, удобный просмоторщик.
Lanczos не даёт лучшее качество, а даёт лучшую резкость. Фотошоп всё равно использует бикубический фильтр для ресайза, чтобы не привносить искажений. 

Автор: Nicholas 15.5.2009, 03:36
Для малюсенькой картинки 110*110 качество в принципе не нужно. smile

Ниукого нет примерного кода с использованием Graphics32?

Автор: Dimonka2 15.5.2009, 15:57
Код рисования ImageBackground на Bitmap. Рзмеры сам подберёшь.
Код

      ImageBackground.ResamplerClassName := 'TLinearResampler'; // здесь выбираешь ресемплер по вкусу
      Bitmap.Draw(Bitmap.BoundsRect, ImageBackground.BoundsRect, Project.ImageBackground);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)