Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нужна функция сжатия изображения, но не TCanvas.StretchDraw [D6, Win2k]


Курдль ©   (2004-07-09 10:45:00) 

Требуется уменьшить исходное изображение в N раз. Но без потери информации о цвете каждого пикселя в исходном изображении.

Естественно, я не искал легких путей и сделал свою процедурину, где все пиксели, входящие в квадрат исходного изображения N*N суммируются по RGB и делятся на площадь, а потом заносятся в конечное изображения. Но делается это не быстро.
Существуют ли стандартные аналоги, или функции доп. библиотек?


Курдль   (2004-07-13 15:44:00) [1]


> Dimaxx   (09.07.04 23:16) [9]
> Попробуй еще COLORONCOLOR

Спасибо, попробовал. Не подошло. На всякий случай попробовал все варианты этого параметра - подходит только HALFTONE :)

Но существует одна проблема - самопроизвольная окантовочка справа и снизу.  Как бы ее побороть?..


Dimaxx   (2004-07-09 23:16:00) [2]

Попробуй еще COLORONCOLOR


Курдль   (2004-07-09 22:55:00) [3]


> TUser ©   (09.07.04 14:09) [5]
> Восстановить-то ты исходное изображение уже не сможешь.


Ок, коллега! Ценб твоё стремление к фундаментальным исследованиям! Однако здеся, в большинстве своем, собираются программеры, которые догадываются, что если сжать изображение (звук или даже сплющить автомобиль), то увидеть/услышать/поехать, как прежде не удастся!  :)
Еще раз извиняюсь за неточность формулировки - я имел в виду "...без потери на глаз"


> MBo ©   (09.07.04 12:41) [4]
> SetStretchBltMode используй с HALFTONE

Огромное спасибо! Все заработало! Но считаю своим долгом доложить, что SetStretchBltMode(DstCanvas.Handle, HALFTONE);не отрабатывает с DstCanvas.StretchDraw(FrealRect, SrcGraphics); а лишь с StretchBlt(DstCanvas.Handle, 0, 0, x, y, SrcCanvas.Handle, 0, 0, X, Y, SRCCOPY);
Кроме того, на заднем плане возникает еле различимый "мусор" (видимо из-за погрешностей округлания) и режим HALFTONE сбрасывается после выполнения.


TUser   (2004-07-09 18:12:00) [4]


> А где остальные 9999 px ?
> Потерялись:)

Потерялись все. Но появился один новый.


Jeer   (2004-07-09 15:54:00) [5]

Курдль ©   (09.07.04 10:45)  
>Требуется уменьшить исходное изображение в N раз. Но без потери >информации о цвете каждого пикселя в исходном изображении.

Есть файл 100*100.
Уменьшаем его в 10000 и получаем 1 px.
А где остальные 9999 px ?
Потерялись:)


TUser   (2004-07-09 14:09:00) [6]

Восстановить-то ты исходное изображение уже не сможешь. Значит информация потеряна (на самом деле при небольших изменения до некоторого предела картинка подлежит восстановлению - если фурье спектры в маленьком изображении не стали пересекаться). А чтобы побыстрее - ScanLine или [4].


MBo   (2004-07-09 12:41:00) [7]

SetStretchBltMode используй с HALFTONE


Курдль   (2004-07-09 11:02:00) [8]


> TUser ©   (09.07.04 10:56) [2]
> На сомом деле не очень понятно, что же собственно тебе надо.
> Судя по приведенному описанию инфа о цвете каждого пикселя
> как раз теряется.

Не теряется. Поясню на примере одной строки.
Пусть надо уменьшить изображение втрое.
Стандартная TCanvas.StretchDraw пробежится по каждому 3-му пикселю в исходной строке и если в нем было черное - запишет в конечное изображение черное, а если белое - то белое. Информация о 2-х пропущеных пикселях потеряется. В моем же случае в конечном изображении получится оттенок серого, в соотв. со средним арифметическим всех 3-х пикселей.


TUser   (2004-07-09 10:56:00) [9]


> Требуется уменьшить исходное изображение в N раз. Но без
> потери информации о цвете каждого пикселя в исходном изображении.

На сомом деле не очень понятно, что же собственно тебе надо. Судя по приведенному описанию инфа о цвете каждого пикселя как раз теряется.
Для ускорения - см ScanLine. Есть еще статья на этом сайте про бытрую работу с BitMap.


Amoeba   (2004-07-09 10:52:00) [10]

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

В свое время на сайте INTEL была бесплатная отлично оптимизированная библиотека (DLL в несколько Mb, к ней даже .pas файл был, а также Help) для различной трансформации изображений. Но сейчас, увы, она более недоступна на халяву. Я ее в свое время скачал, но она ушла в небытие вместе накрывшимся жестким диском.


Наверх

Титульная страница Поиск, карта сайта Написать письмо