Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2003.11.17;
Скачать: [xml.tar.bz2];

Вниз

Почему StretchBlt при использовании портит рисунок?   Найти похожие ветки 

 
Hatawa   (2003-07-20 18:17) [0]

Когда с помощью него копирую из очень большого рисунка в маленький - изображение очень сильно портится.

Заранее спасибо,
Наталья


 
Palladin   (2003-07-20 18:29) [1]

потому что при уменьшении просто отбрасываются лишние пикселы, без всякой дополнительной обработки, что и приводит к порче изображения...


 
Hatawa   (2003-07-20 18:29) [2]

2Paladin
А как-нибудь можно этого избежать?


 
Hatawa   (2003-07-20 18:31) [3]

Да и к тому же - у меня рисунок почти весь светло-серый (там черных пикселей почти нет)
А после работы StretchBlt появляются линии черных точек...


 
Palladin   (2003-07-20 18:44) [4]


> А как-нибудь можно этого избежать?

Не использовать StretchBlt


 
iXuSs   (2003-07-20 18:45) [5]

StretchBlt использует очень простой и быстрый алгоритм растягивания и сжимания. Это называется resize. Есть же алгоритм resample. Его качество зависити от фильтров, которыми можно и воспрользоваться. Я не знаю, что конкретно посоветовтаь тебе, так как не знаю твоей задачи. Опише подробнее, в каких целях тебе это требуется и тогда можно будет без проблем подобрать решение.


 
Hatawa   (2003-07-20 18:49) [6]

2Paladin
Ну и шутник же вы, батенька.

А тогда скажите мне, хотя бы примерно - как решить такую проблему:

Есть большие рисунки (приблизит. 2048*2048)

Нужно их масштабировать и (т.к.) на экране виден только кусок перетягивать (как в ACDSee), но понять, как там у них всё это сделано не получается.

Если масштабировать вручную полностью а потом при перетягивании делать bitblt - всё нормально... но! при увеличении результирующего рисунка до 6000*6000 говорят "Out of resources".

Пыталась StretchBlt делать - всё хорошо, даже почти не мигает при перетаскивании - но ... увы... портит рисунок.

Вот и мучаюсь тут....


 
Palladin   (2003-07-20 18:55) [7]


> Hatawa (20.07.03 18:49)

Я не шутил и говорил на полном серьезе.
Ищи алгоритмы обработки изображений.
Вот iXuSs высказал свое верное мнение... прислушайся к нему..
resample бывают многих видов... MBo может и посоветовал бы что конкретное, вот только нет его что то давно...


 
Rouse_   (2003-07-20 18:59) [8]

А кто Вам сказал что ACDSee полностью масштабирует рисунок? Он масштабирует только видимую часть.

> 6000*6000 - "Out of resources".
А вы как думали? Переведите в объем памяти, требуемой для операции (или хотя бы для хранения). Заметьте, все рисунки в конечном итоге представляют собой растр, а то что рисунок является Jpeg - это только способ его хранения.

Желаю успехов


 
Hatawa   (2003-07-20 19:02) [9]

Так если маштабировать только видимую часть - то получаются дикие тормоза при перетаскивании.

А что объём памяти? 108 Мб... это немного, учитывая размер адресного пространства процесса в 4Гб. Массивы же он создаёт в 2Гб размером.

Да... и ещё вопрос - узнала тут что есть такое свойство - DOubleBuffered у TWinControl. А его для рисунков никак нельзя приспособить?


 
iXuSs   (2003-07-20 19:11) [10]

Есть для Resample фильтр Nearest - очень быстрый. Вообще, если ты создаёшь смотрелку графических файлов или что-то в этом роде, то могу посоветовать Graphic32, в частности, идеально подойдёт для такой задачи.


 
Rouse_   (2003-07-20 19:14) [11]

> то получаются дикие тормоза при перетаскивании.
Значит алгоритм не оптимален...

> это немного, учитывая размер адресного пространства процесса в 4Гб. Массивы же он создаёт в 2Гб размером.
Срочно читаем Рихтера и не делаем преждевременных выводов.

DoubleBuffered - для предка. Да и действие его заключается в том что перерисовка производится в памяти (в два слоя) на выходе уже результат. (Для уменьшения мерцания)

Желаю успехов


 
Hatawa   (2003-07-20 19:14) [12]

А где б найти тот самый Graphic32?


 
Hatawa   (2003-07-20 19:16) [13]

2Rouse_: Что значит для предка? Его для моей задачи можно как-нибудь приспособить?

А по поводу Рихтера - сорри, видимо вру. Я его (Рихтера) к сожалению до конца не дочитала...


 
iXuSs   (2003-07-20 19:21) [14]

Graphic32 можно скачать по адресу:

http://www.g32.org

Пакет содержит набор компонентов для работы с графикой, в частности, продвинутый TImgView32 с полосами прокрутки. В составе есть подробный help, что выгодно отличает его от других пакетов. Внутри реализован двойной буфферинг, так что в данном случае DoubleBuffered даже и не требуется.


 
Rouse_   (2003-07-20 19:25) [15]

Если рисунок не отрисовывается на канве формы, значит у компонента (более всего подходит TGraphicControl) на канве которого происходит отрисовка, должен быть предок. Ему и делаем DoubleBuffered := True;

Желаю успехов


 
Palladin   (2003-07-20 19:40) [16]


> Rouse_ © (20.07.03 19:25)

прикол :) я этой тете натаwе
уже говорил про DoubleBuffered
к сожалению она както не так это восприняла и начала говорить про всякие глупости с динамическим созданием компонентов...
бедняга...


 
Hatawa   (2003-07-20 19:52) [17]

Господа!

Огромное спасибо... две недели потратила.. ((
А ларчик просто открывался )

Теперь вопрос по Graphics32 - как можно сделать рамку для выделения объектов?


 
Hatawa   (2003-07-20 19:54) [18]

2Palladin - и не стыдно вам человека оскроблять? Сами ведь тоже когда-то плохо в этом всём разбирались... Не хотите помочь начинающему - не надо. Оскорблять-то зачем?


 
iXuSs   (2003-07-20 20:24) [19]

> Теперь вопрос по Graphics32 - как можно сделать рамку для выделения объектов?

Используя метод TBitmap32.FrameRect.


 
Fenik   (2003-07-20 21:15) [20]

http://delphigfx.mastak.ru/libs.htm

Смотри Bitmap Resampler.


 
Думкин   (2003-07-21 06:22) [21]

Какая операционка используется. Если 2000(NT/XP), то используем таки StretchBlt, только перед этим внимательно читаем Помощь(F1).
Если 98, ME - то Graphics32, или пишем свое - гемор хороший.


 
AlexT1000   (2003-07-21 11:45) [22]

А чтобы stretchblt выводилось нормально нужно сделать всего лишь следующее

SetStretchBltMode(Canvas.Handle, COLORONCOLOR);
StretchBlt(Canvas.Handle,.........,SRCCOPY );



 
Думкин   (2003-07-21 12:56) [23]


> AlexT1000 © (21.07.03 11:45)

Но только при условии, что операционная система это поддерживает.
Читаем MSDN:

HALFTONE Maps pixels from the source rectangle into blocks of pixels in the destination rectangle. The average color over the destination block of pixels approximates the color of the source pixels.
After setting the HALFTONE stretching mode, an application must call the SetBrushOrgEx function to set the brush origin. If it fails to do so, brush misalignment occurs.

This option is not supported on Windows 95/98/Me.


 
AlexT1000   (2003-07-21 17:20) [24]

если битмап 24 то все операционки это поддерживают. у нее по всей видимости они такие а если она их не перевела из pfDevice в pf24bit ей же хуже
у меня эта функция прекрасно работает на 95,98, ME а без нее действительно при выводе получаются глюки , типа описанных этой девушкой


 
Думкин   (2003-07-22 05:43) [25]


> AlexT1000 © (21.07.03 17:20)
Извини поспешил. Я про HALFTONE, а ты про COLORONCOLOR.
Просто первое работает лучше на нужных системах. А вот второе - не знаю.
Я когда использовал в программах StretchBlt, то в 98 ни одна мода мне не дала хорошего результата, - иногда происходило сильное ужатие и вылазило описанное. Рисунки были pf24bit.
Использовал Graphics32 - и все пучком.


 
AlexT1000   (2003-07-22 11:53) [26]

G32 неплохая штука, но работает некорректно с маленькими битмапами.(неправильный скале) не знаю исправил ли он эту траблу в 1.5 утверждал что переработал алгоритм отрисовки(там действительно коренные изменения) не проверил правда помогло это или нет.
недостаток g32 что он всегда работает с 32битмапами, а это значит, что размер битмапа который может быть загружен без Can not allocate dib меньше чем у 24бит.
так же у него тормозит загрузка сохранение файла .(когда важна скорость) сначала грузит в битмап потом конверт в G32 . ОПЯТЬ же типа dib ресурс занимает, может не хватить его.
В остальном это просто замечательная библиотека. Денисов молоток



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2003.11.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.012 c
14-56890
VEG
2003-10-23 17:31
2003.11.17
БЕДСТВУЮ!!!


4-56962
Maxim Pshevlotsky
2003-09-02 08:57
2003.11.17
Как заменить значок из ресурсов DLL?


1-56744
Intense
2003-11-07 22:15
2003.11.17
создание MDI-окна в run-time


14-56832
BJValentine
2003-10-17 15:08
2003.11.17
Спорт


3-56476
Vemer
2003-10-28 10:28
2003.11.17
Превращение столбца в строку





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский