![]() |
Модераторы: Snowy, Alexeis, MetalFan |
![]() ![]() ![]() |
|
Гость_welt |
|
|||
Unregistered |
Здравствуйте, помогите создать программу в Делфи.
Нужно нарисовать гистограмму зависимости количества пикселов от яркости. (что такое яркость я не очень представляю). Это наверное что-то наподобии гистограммы в Фотошоп, где по оси Х располагаются тоновые градации в диапазоне 0..255, а по оси У - количество пикселов каждого уровня. Заранее благодарен. |
|||
|
||||
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 13 Всего: 63 |
А хоть бы и так:
(это рабочий код из моей программы, если что-нибудь будет не работать - может быть я не все типы выложил или функции дополнительные, т.е. чуть что спрашивай)
Это сообщение отредактировал(а) Illusion Dolphin - 22.5.2005, 00:35 -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
Гость_welt |
|
|||
Unregistered |
Спасибо за код, Illusion Dolphin.
У меня правда возникли поблемы Я захотел естественно сделать все на форме, используя Image1. Не знал, как лучше сделать, поэтому сразу после окончания type TForm1=class(TForm) поставил ваши три тайпа. После чего сразу вставил процедуры и функции т.е не загонял их в public или private. подскажите, правильно ли это с точки зрения синтаксиса, и если нет поправте. Дальше создал Для начала две кнопки: одна для загрузки изображения в Image1, другая для вырисовки гистограммы (я захотел для зеленого цвета) в Image2. Ну с первой кнопкой все понятно. А вот со второй начались проблемы Вот что я написал в обработчике.
На этом проблемы не закончились... Запустил я программу, загрузил картинку, нажал на вторую кнопку и .... ничего. Пришлось кое-что исправить в самой процедуре GetGistogrammBitmap. Я заменил все резалты (кстати, почему к ним можно обращаться как к указателям? Им же можно только что-то присваивать.!?) (кроме первых двух) на Form1.Image1.Canvas. .. Я понимаю, что так нельзя делать(Поэтому и прошу чтобы вы научили правильно вызывать вашу процедуру GetGistogrammBitmap )... но тем не менее заработало, гистограмму по зеленому она мне построила.... Но что было когда я построил для красного (впрочем тот же эффект наблюдался и для синего и просто для яркости)! несмотря на высоту 100, линии были почти в самом низу-маленткие, т.е не в удобочитаемом виде. Одновременно я сравнивал с гистограммой в Фотошопе, открыв там ту же картинку. Там все было в порядке. Картина совпала только для зеленого, а для всего остального, как я уже говорил был неудобочитаемый формат.... [b]т.е встает вопрос как сделать нормальное отображение для всех каналов?[b] вот та картинка которую я тестировал. итак, мне нужно правильно разместить все в модуле, правильно вызвать процедуру(а на форме у меня предположим image1, image2)-т.е разобраться с resullt и тем что с ним связано и понять почему каналы так странно отображаются. Очень надеюсь на вашу помощь. |
|||
|
||||
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 13 Всего: 63 |
Объясняю различия гистограмм в фотошопе и тут для этой картинки. Дело в том, что часто ты видешь не реальную гистограмму, а её часть, это происходит, например, если у тебя есть фотка на чёрном фоне, который занимает пусть даже 20% всей площади. При этом количество чёрных пикселов будет превышать все другие во много раз. Если это отображать реально, то ты увидишь только одну палку слева и всё. По этому я максимум интенсивности для нормировки искал в интервале 5-250 (или около этого), а в фотошопе используется другая нормировка, и в тестовой картинке мексимальное число пикселей приходится где-то на интенсивность 7-12, в результате мой алгоритм отображает в реальную величину гистограмму, а фотошоп показывает нормированной по какому-то значению. Попробуй сравни гистограмму для обычной фотографии - они совпадут на 100%.
Теперь даю пример, как можно использовать это:
-------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
Гость_welt |
|
||||
Unregistered |
Спасибо еще раз...
у меня возникла проблема... мне захотелось сделать с ComboBox также как в фотошоп: ведь там нажимаешь Histogram и появляется гистограмма по яркости(отсюда я сделал вывод, что ComboBox.ItemIndex:=0 т.е там три строчки Lumansity, Red, Green, Blue и по умолчанию стоит на Limensity). Дальше я могу спокойно щелкать по пунктам из КомбоБокс. и прекрасно переключается... Мне что-то надо написать в
и дальше строятся гистограммы. А если писать каждый раз
то файл дудет загружаться по-новому.... т.е хочу сделать все также с комбобок как в фотошопе.... И еще у меня один вопрос. мне нужно написать модуль для выравнивания текста по правому краю. Ширина 80 символов. Я знаю алгоритм(но навеное он слишком простой и неуверен, что правильный). Вот он. Считаю количество символов в строке и добавляю слева (в начале строки) нужное количество пробелов до 80 символов. Ну а для большей правильности можно перед подсчетом символов выбросить ненужные пробелы вконце строки... что-то типа этого. Буду рад, если вы подскажите как это в паскале(а можно и в делфи) сделать.... |
||||
|
|||||
s-mike |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Я вот немного не понял о чем идет речь:
Хотя с фотошопом знаком неплохо. Можно скриншот? |
|||
|
||||
Гость_welt |
|
|||
Unregistered |
s-mike , открой Фотошоп. Дальше Image>Histogram, далее щелкай по каналам.....
|
|||
|
||||
Illusion Dolphin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 13 Всего: 63 |
И ёжику ясно
![]() 1) открывает изображение и создаём из него TBitmap (далее я даю по пунктам так, как это наиболее оптимально с точки зрения быстродействия, но для этого нужно модифицировать код немного) 2) делаем массив из PARGB и туда сканируем всё изображение при помощи scanline 3) Вызываем функцию, которая пройдётся по изображению один раз и сделает из него 4 массива типа T255IntArray (т.е. 4 функции нужно будет собрать в одну. этого можно не делать, но смотри коментарий выше) 4) закрываем изображение и выгружаем лишние русерсы (наш TBitmap) 5) в зависимости от значения MyComboBox.ItemIndex мы формируем на основе соответственного массива из п.3 изображение и заносим его в TImage; вот и всё. теперь осталось тока это реализовать. что будет просто если есть понимание моего кода. -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Звук, графика и видео" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |