purebasic.info

PureBasic forum
Текущее время: Пт фев 21, 2020 6:26 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: Чт ноя 21, 2019 6:00 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1799
Откуда: Алматы
Благодарил (а): 18 раз.
Поблагодарили: 50 раз.
Пункты репутации: 5
использовал код пастеризации, упертый у буржуев и горя не знал. а тут на форуме чот прям обосрали итоговый результат, дескать убогий и все такое. и типа надо было использовать "дизеринг". тут я припомнил, что в коде есть такая галка. включил её и попробывал... и чот мне показалось, что картинка ну ваще блеклая становится. а потом подумал дайка контрастность подкручу, то есть изображение в ворд копирую, уменьшаю как мне надо, а после контрастности добавляю, и только потом вставляю в свою программу. эффект стал прям ну мне нравится (хотя мне и старый без дизеринга нравился, но раз папки сказали, что дизеринг лучше - буду теперь с дизерингом).

однако ворд есть хоть и практически везде - это все-таки другая программа. хотелось бы регулировку контрастности и яркости, как в ворде - но внутри своего приложения. вот собственно и вопрос - а у нас такое в PB вобще предусмотрено? может и код какой есть для примера посмотреть?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 21, 2019 6:40 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6596
Благодарил (а): 32 раз.
Поблагодарили: 227 раз.
Пункты репутации: 59
Контрастность покажу формулу:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
UseJPEGImageDecoder()
Procedure Contrast(Img, Amount)
  Protected rg,gg,bg,r,g,b,x,y
  StartDrawing(ImageOutput(Img))
 For y=0 To ImageHeight(Img)-1  
   For x=0 To ImageWidth(Img)-1  
     Color = Point(x, y)
 
     r=Red(Color);
     g=Green(Color);
     b=Blue(Color) ;
     
     rg=(Abs(127-r) * Amount)/ 255;
     gg=(Abs(127-g) * Amount)/ 255;
     bg=(Abs(127-b) * Amount)/ 255;
     
     If r>127 : r=r+rg: Else : r=r-rg: EndIf ;
     If g>127 : g=g+gg: Else : g=g-gg: EndIf;
     If b>127 : b=b+bg: Else : b=b-bg: EndIf;
                If R>255:R=255:EndIf
                If G>255:G=255:EndIf
                If B>255:B=255:EndIf
                If R<0:R=0:EndIf
                If G<0:G=0:EndIf
                If B<0:B=0:EndIf
     Plot(x,y,RGB(r,g,b))    
   Next
 Next
 StopDrawing()
EndProcedure
 
LoadImage(1, "ВашеФото.jpg" );
 
Contrast(1, 150) ; Тут крутить контраст!!!
 
 
imgw = ImageWidth(1)
If OpenWindow(0,0,0,imgw+20,imgw+20,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ContainerGadget(0,10,10,imgw,imgw)
  ButtonImageGadget(1,0,0,imgw,imgw,ImageID(1))
CloseGadgetList()
DisableGadget(0,1)
Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf


А яркость там вообще просто, эту же процедуру Contrast перепиши, только значения r,g,b увеличивай на одну и туже величину пропорционально, контролируй, чтобы значение не превышало 255, а то всё будет ярко белое.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 21, 2019 7:18 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1799
Откуда: Алматы
Благодарил (а): 18 раз.
Поблагодарили: 50 раз.
Пункты репутации: 5
колбаса! :) насчет яркости пока не совсем понятно, но разберусь. надо только засесть, а так то что надо прям и качество становится как в ворде, следовательно можно от этого самого ворда отказаться нафиг :)

только вот с максимальным значением не ясно. до какого значения можно крутить эту контрастность? думал до 255, но и 500 он кушает нормально. до какого числа можно её крутить? понятно что от изображения зависит, но технически на какое число ориентироваться, чтоб правильно?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт ноя 21, 2019 8:39 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6596
Благодарил (а): 32 раз.
Поблагодарили: 227 раз.
Пункты репутации: 59
Крайнее величина при черном цвете 255. Но в коде есть нормализатор в виде
Код:
1
2
3
4
5
6
 If R>255:R=255:EndIf
                If G>255:G=255:EndIf
                If B>255:B=255:EndIf
                If R<0:R=0:EndIf
                If G<0:G=0:EndIf
                If B<0:B=0:EndIf


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

Яркость совсем просто:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Procedure Brightness(Img, Amount)
  Protected rg,gg,bg,r,g,b,x,y
  StartDrawing(ImageOutput(Img))
 For y=0 To ImageHeight(Img)-1  
   For x=0 To ImageWidth(Img)-1  
     Color = Point(x, y)
 
     r=Red(Color);
     g=Green(Color);
     b=Blue(Color) ;
     r=r+Amount
     g=g+Amount
     b=b+Amount
                If R>255:R=255:EndIf
                If G>255:G=255:EndIf
                If B>255:B=255:EndIf
                If R<0:R=0:EndIf
                If G<0:G=0:EndIf
                If B<0:B=0:EndIf
     Plot(x,y,RGB(r,g,b))    
   Next
 Next
 StopDrawing()
EndProcedure
 



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

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт дек 13, 2019 10:20 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1799
Откуда: Алматы
Благодарил (а): 18 раз.
Поблагодарили: 50 раз.
Пункты репутации: 5
засел наконец за программу... и вылез затык. предполагается что у меня будет три крутилки - увеличение, яркость и контрастность. в результате сдвиг любого из трех ползунков должен вызывать сразу три операции и ресайз, и яркость и контрастность. учитывая что изображение размером с рабочий стол, то это начинается дичайшее слайдшоу.

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

а второе... наверное можно объединить обе эти функции в одну.


весь вопрос в том - как правильней делать просчет? сначала контрастность, а потом яркость или наоборот?


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

четвертое - имеет ли смысл при вставке изображения в программу - перегонять изображение в массив цветов, уже разложенных на синий, красный и зеленый? то есть таким образом можно отказаться от Point и от Green, Red, Blue процедур.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб дек 14, 2019 7:50 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6596
Благодарил (а): 32 раз.
Поблагодарили: 227 раз.
Пункты репутации: 59
Посмотри у буржуев
Direct download :
http://www.purearea.net/pb/download/mod ... ard_BF.zip
там есть функция Image_coloring_BF, тут её нет смысла вставлять, там есть зависимости :
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
; Эта функция изменяет яркость, цвет, контрастность - функция работает с изображениями, PB спрайтами, канвой
; Параметры основаны на процентах - положительные и отрицательные значения
; Источник и пункт назначения должны иметь одинаковый размер
; Режим 0 без создания нового вывода - режим 1 создать изображение - режим 2 создать спрайт PB
; Sprite_mode - тот же самый вызов функции PB для создания спрайта PB
; Три режима серого : mode 1, mode  2, mode  - mode 1 более нейтральный
Image_coloring_BF(source_ID, source_ID,
                  change_red,
                  change_green,
                  change_blue,
                  change_contrast,
                  change_brightness,
                  change_intensity,
                  mode_grey,
                  mode,
                  sprite_mode)


Найдешь ответы на многие свои вопросы.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб дек 14, 2019 1:32 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1799
Откуда: Алматы
Благодарил (а): 18 раз.
Поблагодарили: 50 раз.
Пункты репутации: 5
не смотрел, но судя по объявлению функции там все, что надо.

пока-что по твоему коду сделал. объединил яркость и контраст в одну функцию, а так-же сделал обработку только того фрагмента, что мне нужно - и скорость работы вроде бы ничего :) пойдет. от балансов в какой-то цвет пока отказался. посмотрим как пойдет. получается в момент движения картинки - отображается оригинал. как только мышку отпустил - происходит обработка яркости и контраста. пока доволен :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB