PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Просмотрщик фотографий


Просмотрщик фотографий

Сообщений 1 страница 30 из 56

1

Решил создать просмотрщик фотографий для тренировки навыков и сразу столкнулся с некой проблемой. Не могу открыть фотку и разместить ее в ImageGadget - ничего не происходит. И еще вопрос: для изменения размеров окна используется эта команда

Код:
ResizeWindow(1, #PB_Ignore, #PB_Ignore, ImageWidth(0)+4, ImageHeight(0)+34)

. Можете объяснить каждый ее параметр, особенно

Код:
(0)+4

и

Код:
(0)+34

.  Вот код программы:

Код:
; Создаём окно.
  If OpenWindow(1,0,0,400,350,"PhotoView",#PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
     If CreateGadgetList( WindowID(1) ) ; Создаём пустой список гаджетов.
       If CreateMenu(1,WindowID(1))
       MenuTitle("Файл")
        MenuItem(1,"Открыть")
        MenuItem(2,"Сохранить")
        MenuBar()
        MenuItem(3,"Выход")
       MenuTitle("Просмотр")
        MenuItem(4,"Повернуть вправо")
        MenuItem(5,"Повернуть влево")
        MenuItem(6,"На 180 по часовой")
        MenuItem(7,"На 180 против часовой")
        MenuBar()
        MenuItem(8,"Увеличить")
        MenuItem(9,"Уменьшить")
       MenuTitle("Помощь")
        MenuItem(10,"О программе")  
       EndIf
       
       If CreateToolBar(1,WindowID(1))
        ToolBarStandardButton(1,#PB_ToolBarIcon_Open)
        ToolBarStandardButton(2,#PB_ToolBarIcon_Save)
        ToolBarSeparator()
       EndIf 
       
       ImageGadget(1, 0, 28, WindowWidth(1), WindowHeight(1), 0, #PB_Image_Border)
         
     EndIf
  EndIf    
  
  Repeat ; Начало главного цикла.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Menu=EventMenu()
    If Event=#PB_Event_Menu
      Select Menu
       Case 1
        Filename$ = OpenFileRequester("Укажите изображение", "", "All Images Formats|*.bmp;*.jpg;*.png;*.tif;*.tga", 0)
          If Filename$
            
            If LoadImage(1, Filename$)
              SetGadgetState(0, ImageID(1))  ; change the picture in the gadget
              ResizeWindow(1, #PB_Ignore, #PB_Ignore, ImageWidth(0)+4, ImageHeight(0)+34)
            EndIf
            
          EndIf
       Case 2 
        MessageRequester("Меню","Пункт 'Сохранить'")
       Case 3
        End
       Case 4
        MessageRequester("Меню","Пункт 'Повернуть вправо'")
      EndSelect ; Этот оператор завершает операцию выбора, начатую оператором Select
    EndIf 
  
  
  
  Until Event = #PB_Event_CloseWindow ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.
  End ; Директива, завершающая программу.

0

2

43 строка : SetGadgetState(1, ImageID(1))  ; цифра 1- это индефикатор гаджета в котором будут изменения, почему у тебя 0

Дальше, у тебя совпадает имя окна OpenWindow() и  ImageGadget(), у каждого гаджета должно быть своё имя, или через константу.

Код:
Enumeration 
 #Window_0
 #Strin_1
 #Strin_2
 #poisk
 #web      
 #But      
 #But_1    
 #But_2
 #But_3
 #Imag
 #Imag_1
 #GO_Search  
EndEnumeration

OpenWindow (#Window_0,  .........

ImageGadget(#Imag,..........

Отредактировано mirashic (06.02.2010 17:08:19)

0

3

Код:
; Создаём окно.
  If OpenWindow(111,0,0,400,350,"PhotoView",#PB_Window_MinimizeGadget | #PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget)
     If CreateGadgetList( WindowID(111) ) ; Создаём пустой список гаджетов.
       If CreateMenu(1,WindowID(111))
       MenuTitle("Файл")
        MenuItem(1,"Открыть")
        MenuItem(2,"Сохранить")
        MenuBar()
        MenuItem(3,"Выход")
       MenuTitle("Просмотр")
        MenuItem(4,"Повернуть вправо")
        MenuItem(5,"Повернуть влево")
        MenuItem(6,"На 180 по часовой")
        MenuItem(7,"На 180 против часовой")
        MenuBar()
        MenuItem(8,"Увеличить")
        MenuItem(9,"Уменьшить")
       MenuTitle("Помощь")
        MenuItem(10,"О программе")  
       EndIf
       
       If CreateToolBar(1,WindowID(111))
        ToolBarStandardButton(1,#PB_ToolBarIcon_Open)
        ToolBarStandardButton(2,#PB_ToolBarIcon_Save)
        ToolBarSeparator()
       EndIf 
       
       ImageGadget(1, 0, 28, WindowWidth(111), WindowHeight(111), 0, #PB_Image_Border)
         
     EndIf
  EndIf    
  
  Repeat ; Начало главного цикла.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Menu=EventMenu()
  
  
  
  
  
    If Event=#PB_Event_Menu
      Select Menu
       Case 1
        Filename$ = OpenFileRequester("Укажите изображение", "", "All Images Formats|*.bmp;*.jpg;*.png;*.tif;*.tga", 0)
          If Filename$
            
            If LoadImage(1, Filename$)
              SetGadgetState(1, ImageID(1))  ; change the picture in the gadget
              ResizeWindow(111, #PB_Ignore, #PB_Ignore, ImageWidth(1)+4, ImageHeight(1)+34)
            EndIf
            
          EndIf
       Case 2 
        MessageRequester("Меню","Пункт 'Сохранить'")
       Case 3
        End
       Case 4
        MessageRequester("Меню","Пункт 'Повернуть вправо'")
      EndSelect ; Этот оператор завершает операцию выбора, начатую оператором Select
    EndIf 
  
  
  
  Until Event = #PB_Event_CloseWindow ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.
  End ; Директива, завершающая программу.

Отредактировано mirashic (06.02.2010 17:18:17)

0

4

не открывается

0

5

у меня работает.

0

6

daiomik написал(а):

Можете объяснить каждый ее параметр, особенно

Код:
ResizeWindow(Window, x, y, ширина, высота)
mirashic написал(а):

Дальше, у тебя совпадает имя окна OpenWindow() и  ImageGadget()

Это вполне допустимо.
Идентификаторы окон, гаджетов, рисунков, файлов и т. д. могут совпадать!

Вроде открывается

Код:
; Декодеры форматов рисунков
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()


; Создаём окно.
  If OpenWindow(1,0,0,400,350,"PhotoView",#PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
     If CreateGadgetList( WindowID(1) ) ; Создаём пустой список гаджетов.
       If CreateMenu(1,WindowID(1))
       MenuTitle("Файл")
        MenuItem(1,"Открыть")
        MenuItem(2,"Сохранить")
        MenuBar()
        MenuItem(3,"Выход")
       MenuTitle("Просмотр")
        MenuItem(4,"Повернуть вправо")
        MenuItem(5,"Повернуть влево")
        MenuItem(6,"На 180 по часовой")
        MenuItem(7,"На 180 против часовой")
        MenuBar()
        MenuItem(8,"Увеличить")
        MenuItem(9,"Уменьшить")
       MenuTitle("Помощь")
        MenuItem(10,"О программе") 
         MenuHeight=MenuHeight() 
       EndIf
       
       If CreateToolBar(1,WindowID(1))
        ToolBarStandardButton(1,#PB_ToolBarIcon_Open)
        ToolBarStandardButton(2,#PB_ToolBarIcon_Save)
        ToolBarSeparator()
        ToolBarHeight=ToolBarHeight(1)
       EndIf 
       
       ImageGadget(1, 2, ToolBarHeight+2, WindowWidth(1), WindowHeight(1), 0, #PB_Image_Border)
         
     EndIf
  EndIf    
  
  Repeat ; Начало главного цикла.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Menu=EventMenu()
    If Event=#PB_Event_Menu
      Select Menu
       Case 1
        Filename$ = OpenFileRequester("Укажите изображение", "", "All Images Formats|*.bmp;*.jpg;*.png;*.tif;*.tga*.ico", 0)
          If Filename$
            
            If LoadImage(1, Filename$)
              SetGadgetState(1, ImageID(1))  ; change the picture in the gadget
              ResizeWindow(1, #PB_Ignore, #PB_Ignore, ImageWidth(1)+8, ImageHeight(1)+MenuHeight+ToolBarHeight+8)
            EndIf
            
          EndIf
       Case 2 
        MessageRequester("Меню","Пункт 'Сохранить'")
       Case 3
        End
       Case 4
        MessageRequester("Меню","Пункт 'Повернуть вправо'")
      EndSelect ; Этот оператор завершает операцию выбора, начатую оператором Select
    EndIf 
  
  
  
  Until Event = #PB_Event_CloseWindow ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.
  End ; Директива, завершающая программу.

0

7

теперь да. А зачем вначале декодеры нужны??

0

8

mirashic написал(а):

у меня работает.

Ты наверно BMP рисунок загружал.
А для других, декодеры нужно подключить. Они нужны для работы с рисунками, формата PNG, JPG и др.

0

9

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

0

10

Иногда, чтоб самому не запутаться, лучше каждому гаджету давать своё уникальное имя, и не через числа, а через имя (#имя).
А то, что имена могу совпадать, используется например в обработчике событий , когда при выборе например пункта меню или при нажатии
кнопки  -выполняется одно и тоже действие. (если имена одинаковые)

Отредактировано mirashic (06.02.2010 18:02:38)

0

11

mirashic написал(а):

например пункта меню или при нажатии
кнопки  -выполняется одно и тоже действие. (если имена одинаковые)

Как такое может быть?
Ведь при событии в меню, прога получает сообщение #PB_Event_Menu, а при событии в гаджете #PB_Event_Gadget.
Ну и как может выполнится одно и тоже действие? Разве что если допустить ошибку в обработчике событий, но это уже глюк!

0

12

да, я ошибся, у меня пункты меню и панели инструментов, а не кнопки.
ToolBarButton() и MenuItem()

Отредактировано mirashic (06.02.2010 18:50:13)

0

13

Не подскажите, я хочу повернуть изображение на 90 градусов по часовой стрелки. Как я понял встройных функций у пурика нет, но через API можно. Так вот пишу на действии такой код и ошибка:

Код:
rotate(1,90,output_encoding=images.JPEG)

где 1-это image_data, 90-degrees, output_encoding=images.JPEG- Заданный формат выходного изображения. Может быть либо images.PNG, либо images.JPEG. По умолчанию - images.PNG.

0

14

Помогите еще изменить размеры изображение при расширении окна и при изменении его размеров:

Код:
; Декодеры форматов рисунков
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()


; Создаём окно.
  If OpenWindow(1,0,0,400,350,"PhotoView",#PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_MaximizeGadget)
     If CreateGadgetList( WindowID(1) ) ; Создаём пустой список гаджетов.
       If CreateMenu(1,WindowID(1))
       MenuTitle("Файл")
        MenuItem(1,"Открыть")
        MenuBar()
        MenuItem(3,"Выход")
       MenuTitle("Просмотр")
        MenuItem(4,"На 90 по часовой")
        MenuItem(5,"На 90 против часовой")
        MenuItem(6,"На 180 по часовой")
        MenuItem(7,"На 180 против часовой")
        MenuBar()
        MenuItem(8,"Увеличить")
        MenuItem(9,"Уменьшить")
       MenuTitle("Помощь")
        MenuItem(10,"О программе") 
         MenuHeight=MenuHeight() 
       EndIf
       
       If CreateToolBar(1,WindowID(1))
        ToolBarStandardButton(1,#PB_ToolBarIcon_Open)
        ToolBarSeparator()
        ToolBarHeight=ToolBarHeight(1)
       EndIf 
       
       ImageGadget(1, 2, ToolBarHeight+2, WindowWidth(1), WindowHeight(1), 0, #PB_Image_Border)
         
     EndIf
  EndIf    
  
  Repeat ; Начало главного цикла.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Menu=EventMenu()
    If Event=#PB_Event_Menu
      Select Menu
       Case 1
        Filename$ = OpenFileRequester("Укажите изображение", "", "All Images Formats|*.bmp;*.jpg;*.png;*.tif;*.tga*.ico", 0)
          If Filename$
            
            If LoadImage(1, Filename$)
              SetGadgetState(1, ImageID(1))  ; change the picture in the gadget
              ResizeWindow(1, #PB_Ignore, #PB_Ignore, ImageWidth(1)+8, ImageHeight(1)+MenuHeight+ToolBarHeight+8)
            EndIf
            
          EndIf
       Case 2 
        MessageRequester("Меню","Пункт 'Сохранить'")
       Case 3
        End
       Case 4
        MessageRequester("Меню","Пункт 'Сохранить'")
      EndSelect ; Этот оператор завершает операцию выбора, начатую оператором Select
    EndIf 
    
   If Event=#PB_Event_SizeWindow
      ResizeGadget(1, #PB_Ignore, #PB_Ignore, ImageWidth(1)+8, ImageHeight(1)+MenuHeight+ToolBarHeight+8)
   EndIf
  
  

  
  Until Event = #PB_Event_CloseWindow ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.
  End ; Директива, завершающая программу.

0

15

daiomik написал(а):

Помогите еще изменить размеры изображение при расширении окна и при изменении его размеров

Зачем?
Это будет только искажать сам рисунок!

daiomik написал(а):

rotate(1,90,output_encoding=images.JPEG)

А что это вообще такое?
Если делать это с помощью API, то следует использовать функцию PlgBlt.
Правда, я с ней дела не имел (лишь видел пример) и поэтому что-либо посоветовать не могу.

Вот этот пример вставил в прогу

Код:
; Декодеры форматов рисунков
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()

Structure corners
 x1.l
 y1.l
 x2.l
 y2.l
 x3.l
 y3.l
EndStructure

Procedure ImageFlipH(Image) ; Flip an image on it's Horizontal axis
img_id=ImageID(Image)
    ;msImageFlipH=ElapsedMilliseconds()
    result = #False
    If IsImage(Image)
      ; Get current img details
      hOldImage.l = img_id
      img_w = ImageWidth(Image)
      img_h = ImageHeight(Image)
      
      ;Make a temporary image
      newImg_id = CreateImage(#PB_Any,img_w,img_h)
      hNewImage.l = ImageID(newImg_id)
      
      ;set up corners for H flip
      new.corners
;       new\x1 = img_w-1
;       new\y1 = 0
;       new\x2 = 0
;       new\y2 = 0
;       new\x3 = img_w-1
;       new\y3 = img_h
      new\x1 = 0
      new\y1 = img_h
      new\x2 = 0
      new\y2 = 0
      new\x3 = img_w
      new\y3 = img_h
      
      ; create device contexts (placeholders) and select images into them
      main_dc = GetDC_(WindowID(1))
      source_dc = CreateCompatibleDC_(main_dc)
      SelectObject_(source_dc,hOldImage)
      dest_dc = CreateCompatibleDC_(main_dc)
      SelectObject_(dest_dc,hNewImage)
      
      
      result = PlgBlt_(dest_dc,@new,source_dc,0,0,img_w,img_h,0,0,0)
      If result
        ;copy the new image back to the Source
        result = BitBlt_(source_dc,0,0,img_w,img_h,dest_dc,0,0,#SRCCOPY)
      EndIf
      ;clean up
      DeleteDC_(source_dc)
      DeleteDC_(dest_dc)
      FreeImage(newImg_id)
    EndIf
    ;Debug "ImageFlipH(): "+Str(ElapsedMilliseconds()-msImageFlipH)+"ms"
    ProcedureReturn result 
EndProcedure


Procedure ImageFlipH1(Image) ;Зеркальное отражение
img_id=ImageID(Image)
    ;msImageFlipH=ElapsedMilliseconds()
    result = #False
    If IsImage(Image)
      ; Get current img details
      hOldImage.l = img_id
      img_w = ImageWidth(Image)
      img_h = ImageHeight(Image)
      
      ;Make a temporary image
      newImg_id = CreateImage(#PB_Any,img_w,img_h)
      hNewImage.l = ImageID(newImg_id)
      
      ;set up corners for H flip
      new.corners
      new\x1 = img_w-1
      new\y1 = 0
      new\x2 = 0
      new\y2 = 0
      new\x3 = img_w-1
      new\y3 = img_h
 
      
      ; create device contexts (placeholders) and select images into them
      main_dc = GetDC_(WindowID(1))
      source_dc = CreateCompatibleDC_(main_dc)
      SelectObject_(source_dc,hOldImage)
      dest_dc = CreateCompatibleDC_(main_dc)
      SelectObject_(dest_dc,hNewImage)
      
      
      result = PlgBlt_(dest_dc,@new,source_dc,0,0,img_w,img_h,0,0,0)
      If result
        ;copy the new image back to the Source
        result = BitBlt_(source_dc,0,0,img_w,img_h,dest_dc,0,0,#SRCCOPY)
      EndIf
      ;clean up
      DeleteDC_(source_dc)
      DeleteDC_(dest_dc)
      FreeImage(newImg_id)
    EndIf
    ;Debug "ImageFlipH(): "+Str(ElapsedMilliseconds()-msImageFlipH)+"ms"
    ProcedureReturn result 
EndProcedure



; Создаём окно.
  If OpenWindow(1,0,0,400,350,"PhotoView",#PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
     If CreateGadgetList( WindowID(1) ) ; Создаём пустой список гаджетов.
       If CreateMenu(1,WindowID(1))
       MenuTitle("Файл")
        MenuItem(1,"Открыть")
        MenuItem(2,"Сохранить")
        MenuBar()
        MenuItem(3,"Выход")
       MenuTitle("Просмотр")
        MenuItem(4,"Повернуть вправо")
        MenuItem(5,"Повернуть влево")
        MenuItem(6,"На 180 по часовой")
        MenuItem(7,"На 180 против часовой")
        MenuBar()
        MenuItem(8,"Увеличить")
        MenuItem(9,"Уменьшить")
       MenuTitle("Помощь")
        MenuItem(10,"О программе") 
         MenuHeight=MenuHeight() 
       EndIf
       
       If CreateToolBar(1,WindowID(1))
        ToolBarStandardButton(1,#PB_ToolBarIcon_Open)
        ToolBarStandardButton(2,#PB_ToolBarIcon_Save)
        ToolBarSeparator()
        ToolBarHeight=ToolBarHeight(1)
       EndIf 
       
       ImageGadget(1, 2, ToolBarHeight+2, WindowWidth(1), WindowHeight(1), 0, #PB_Image_Border)
         
     EndIf
  EndIf    
  
  Repeat ; Начало главного цикла.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Menu=EventMenu()
    If Event=#PB_Event_Menu
      Select Menu
       Case 1
        Filename$ = OpenFileRequester("Укажите изображение", "", "All Images Formats|*.bmp;*.jpg;*.png;*.tif;*.tga*.ico", 0)
          If Filename$
            
            If LoadImage(1, Filename$)
              SetGadgetState(1, ImageID(1))  ; change the picture in the gadget
              ResizeWindow(1, #PB_Ignore, #PB_Ignore, ImageWidth(1)+8, ImageHeight(1)+MenuHeight+ToolBarHeight+8)
            EndIf
            
          EndIf
       Case 2 
        MessageRequester("Меню","Пункт 'Сохранить'")
       Case 3
        End
       Case 4
        ;MessageRequester("Меню","Пункт 'Повернуть вправо")
        ImageFlipH(1)
        SetGadgetState(1, ImageID(1))
        ResizeWindow(1, #PB_Ignore, #PB_Ignore, ImageWidth(1)+8, ImageHeight(1)+MenuHeight+ToolBarHeight+8)
      EndSelect ; Этот оператор завершает операцию выбора, начатую оператором Select
    EndIf 
  
  
  
  Until Event = #PB_Event_CloseWindow ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.
  End ; Директива, завершающая программу.

0

16

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

0

17

Просто разреши изменять размеры окна.
Строка, создающая окно, должна выглядеть так

Код:
If OpenWindow(1,0,0,400,350,"PhotoView",#PB_Window_MinimizeGadget | #PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget)

0

18

Добавил еще одну функцию отражение зеркально, процедуру которой Петр привел. Но теперь я заметил, что при зеркальном отражении появляется дефект прямой вертикальной линии по центру изображения. Что это может быть и как это добро исправить? И еще: как добавить полосы прокрутки к ImageGadget если разрешение изображения большое и не влезает на экран? Добавлю: или чего лучше вообще изменять размеры изображения под размер окна, а то полосами пользоваться как то не удобно.

Код:
; Декодеры форматов рисунков
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()

Structure corners
 x1.l
 y1.l
 x2.l
 y2.l
 x3.l
 y3.l
EndStructure

Procedure ImageFlipH(Image) ; Flip an image on it's Horizontal axis
img_id=ImageID(Image)
    ;msImageFlipH=ElapsedMilliseconds()
    result = #False
    If IsImage(Image)
      ; Get current img details
      hOldImage.l = img_id
      img_w = ImageWidth(Image)
      img_h = ImageHeight(Image)
      
      ;Make a temporary image
      newImg_id = CreateImage(#PB_Any,img_w,img_h)
      hNewImage.l = ImageID(newImg_id)
      
      ;set up corners for H flip
      new.corners
;       new\x1 = img_w-1
;       new\y1 = 0
;       new\x2 = 0
;       new\y2 = 0
;       new\x3 = img_w-1
;       new\y3 = img_h
      new\x1 = 0
      new\y1 = img_h
      new\x2 = 0
      new\y2 = 0
      new\x3 = img_w
      new\y3 = img_h
      
      ; create device contexts (placeholders) and select images into them
      main_dc = GetDC_(WindowID(1))
      source_dc = CreateCompatibleDC_(main_dc)
      SelectObject_(source_dc,hOldImage)
      dest_dc = CreateCompatibleDC_(main_dc)
      SelectObject_(dest_dc,hNewImage)
      
      
      result = PlgBlt_(dest_dc,@new,source_dc,0,0,img_w,img_h,0,0,0)
      If result
        ;copy the new image back to the Source
        result = BitBlt_(source_dc,0,0,img_w,img_h,dest_dc,0,0,#SRCCOPY)
      EndIf
      ;clean up
      DeleteDC_(source_dc)
      DeleteDC_(dest_dc)
      FreeImage(newImg_id)
    EndIf
    ;Debug "ImageFlipH(): "+Str(ElapsedMilliseconds()-msImageFlipH)+"ms"
    ProcedureReturn result 
EndProcedure


Procedure ImageFlipH1(Image) ;Зеркальное отражение
img_id=ImageID(Image)
    ;msImageFlipH=ElapsedMilliseconds()
    result = #False
    If IsImage(Image)
      ; Get current img details
      hOldImage.l = img_id
      img_w = ImageWidth(Image)
      img_h = ImageHeight(Image)
      
      ;Make a temporary image
      newImg_id = CreateImage(#PB_Any,img_w,img_h)
      hNewImage.l = ImageID(newImg_id)
      
      ;set up corners for H flip
      new.corners
      new\x1 = img_w-1
      new\y1 = 0
      new\x2 = 0
      new\y2 = 0
      new\x3 = img_w-1
      new\y3 = img_h
 
      
      ; create device contexts (placeholders) and select images into them
      main_dc = GetDC_(WindowID(1))
      source_dc = CreateCompatibleDC_(main_dc)
      SelectObject_(source_dc,hOldImage)
      dest_dc = CreateCompatibleDC_(main_dc)
      SelectObject_(dest_dc,hNewImage)
      
      
      result = PlgBlt_(dest_dc,@new,source_dc,0,0,img_w,img_h,0,0,0)
      If result
        ;copy the new image back to the Source
        result = BitBlt_(source_dc,0,0,img_w,img_h,dest_dc,0,0,#SRCCOPY)
      EndIf
      ;clean up
      DeleteDC_(source_dc)
      DeleteDC_(dest_dc)
      FreeImage(newImg_id)
    EndIf
    ;Debug "ImageFlipH(): "+Str(ElapsedMilliseconds()-msImageFlipH)+"ms"
    ProcedureReturn result 
EndProcedure



; Создаём окно.
  If OpenWindow(1,0,0,400,350,"PhotoView",#PB_Window_MinimizeGadget | #PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget)
     If CreateGadgetList( WindowID(1) ) ; Создаём пустой список гаджетов.
       If CreateMenu(1,WindowID(1))
       MenuTitle("Файл")
        MenuItem(1,"Открыть")
      
        MenuBar()
        MenuItem(3,"Выход")
       MenuTitle("Просмотр")
        MenuItem(4,"Отразить зеркально")
        MenuItem(5,"Повернуть вправо")
        MenuItem(6,"Повернуть влево")
        MenuItem(7,"На 180 по часовой")
        MenuItem(8,"На 180 против часовой")
        MenuBar()
        MenuItem(9,"Увеличить")
        MenuItem(10,"Уменьшить")
       MenuTitle("Помощь")
        MenuItem(11,"О программе") 
         MenuHeight=MenuHeight() 
       EndIf
       
       If CreateToolBar(1,WindowID(1))
        ToolBarStandardButton(1,#PB_ToolBarIcon_Open)
        ToolBarStandardButton(2,#PB_ToolBarIcon_Save)
        ToolBarSeparator()
        ToolBarHeight=ToolBarHeight(1)
       EndIf 
       
       ImageGadget(1, 2, ToolBarHeight+2, WindowWidth(1), WindowHeight(1), 0, #PB_Image_Border)
         
     EndIf
  EndIf    
  
  Repeat ; Начало главного цикла.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Menu=EventMenu()
    If Event=#PB_Event_Menu
      Select Menu
       Case 1
        Filename$ = OpenFileRequester("Укажите изображение", "", "All Images Formats|*.bmp;*.jpg;*.png;*.tif;*.tga*.ico", 0)
          If Filename$
            
            If LoadImage(1, Filename$)
              SetGadgetState(1, ImageID(1))  ; change the picture in the gadget
              ResizeWindow(1, #PB_Ignore, #PB_Ignore, ImageWidth(1)+8, ImageHeight(1)+MenuHeight+ToolBarHeight+8)
            EndIf
            
          EndIf
       
       Case 3
        End
       Case 4
        ImageFlipH1(1)
        SetGadgetState(1, ImageID(1))
        ResizeWindow(1, #PB_Ignore, #PB_Ignore, ImageWidth(1)+8, ImageHeight(1)+MenuHeight+ToolBarHeight+8)
       Case 6
        ImageFlipH(1)
        SetGadgetState(1, ImageID(1))
        ResizeWindow(1, #PB_Ignore, #PB_Ignore, ImageWidth(1)+8, ImageHeight(1)+MenuHeight+ToolBarHeight+8)
      EndSelect ; Этот оператор завершает операцию выбора, начатую оператором Select
    EndIf 
  
  
  
  Until Event = #PB_Event_CloseWindow ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.
  End ; Директива, завершающая программу.

Отредактировано daiomik (06.02.2010 21:20:26)

0

19

Вот еще к дополнению к предыдущему одну фичу добавил - серый цвет. Посмотрите правильно или чего подправить нужно?

Код:
; Декодеры форматов рисунков
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()

Structure corners
 x1.l
 y1.l
 x2.l
 y2.l
 x3.l
 y3.l
EndStructure

Procedure GrayImage(Number) 
  ;> 
  ;> Number     = ImageNumber 
  ;> 
  Structure _GI_BITMAPINFO 
    bmiHeader.BITMAPINFOHEADER 
    bmiColors.RGBQUAD[1] 
  EndStructure 

  Structure _GI_LONG 
   l.l 
  EndStructure 

  Structure _GI_BGR 
   R.b 
   G.b 
   B.b 
   A.b 
  EndStructure 

  hBmp = ImageID(Number) 
  If hBmp 
    hDC  = StartDrawing(ImageOutput(Number)) 
    If hDC 
      ImageWidth  = ImageWidth(Number) : ImageHeight = ImageHeight(Number) 
      mem = GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,ImageWidth*ImageHeight*4) 
      If mem 
        bmi._GI_BITMAPINFO 
        bmi\bmiHeader\biSize   = SizeOf(BITMAPINFOHEADER) 
        bmi\bmiheader\biWidth  = ImageWidth 
        bmi\bmiheader\biHeight = ImageHeight 
        bmi\bmiheader\biPlanes = 1 
        bmi\bmiheader\biBitCount = 32 
        bmi\bmiheader\biCompression = #BI_RGB 
        If GetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0 
          *pixels._GI_LONG = mem 
          *COLORS._GI_BGR   = mem 
          For a = 1 To ImageWidth*ImageHeight 
            ; color.b = Int((0.299* *COLORS\R) + (0.587* *COLORS\G) + (0.114* *COLORS\B)) 
            color.b = ((299 * *COLORS\R) + (587* *COLORS\G) + (114* *COLORS\B)) /1000   ; improved by Rings
            *pixels\l = RGB(color,color,color) 
            *pixels + 4 
            *COLORS + 4 
          Next a 

          If SetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0 
            Result = hBmp 
          EndIf 
        EndIf 
        GlobalFree_(mem) 
      EndIf 
    EndIf 
    StopDrawing() 
  EndIf 
  ProcedureReturn Result 
EndProcedure 

Procedure ImageFlipH(Image) ; Flip an image on it's Horizontal axis
img_id=ImageID(Image)
    ;msImageFlipH=ElapsedMilliseconds()
    result = #False
    If IsImage(Image)
      ; Get current img details
      hOldImage.l = img_id
      img_w = ImageWidth(Image)
      img_h = ImageHeight(Image)
      
      ;Make a temporary image
      newImg_id = CreateImage(#PB_Any,img_w,img_h)
      hNewImage.l = ImageID(newImg_id)
      
      ;set up corners for H flip
      new.corners
;       new\x1 = img_w-1
;       new\y1 = 0
;       new\x2 = 0
;       new\y2 = 0
;       new\x3 = img_w-1
;       new\y3 = img_h
      new\x1 = 0
      new\y1 = img_h
      new\x2 = 0
      new\y2 = 0
      new\x3 = img_w
      new\y3 = img_h
      
      ; create device contexts (placeholders) and select images into them
      main_dc = GetDC_(WindowID(1))
      source_dc = CreateCompatibleDC_(main_dc)
      SelectObject_(source_dc,hOldImage)
      dest_dc = CreateCompatibleDC_(main_dc)
      SelectObject_(dest_dc,hNewImage)
      
      
      result = PlgBlt_(dest_dc,@new,source_dc,0,0,img_w,img_h,0,0,0)
      If result
        ;copy the new image back to the Source
        result = BitBlt_(source_dc,0,0,img_w,img_h,dest_dc,0,0,#SRCCOPY)
      EndIf
      ;clean up
      DeleteDC_(source_dc)
      DeleteDC_(dest_dc)
      FreeImage(newImg_id)
    EndIf
    ;Debug "ImageFlipH(): "+Str(ElapsedMilliseconds()-msImageFlipH)+"ms"
    ProcedureReturn result 
EndProcedure


Procedure ImageFlipH1(Image) ;Зеркальное отражение
img_id=ImageID(Image)
    ;msImageFlipH=ElapsedMilliseconds()
    result = #False
    If IsImage(Image)
      ; Get current img details
      hOldImage.l = img_id
      img_w = ImageWidth(Image)
      img_h = ImageHeight(Image)
      
      ;Make a temporary image
      newImg_id = CreateImage(#PB_Any,img_w,img_h)
      hNewImage.l = ImageID(newImg_id)
      
      ;set up corners for H flip
      new.corners
      new\x1 = img_w-1
      new\y1 = 0
      new\x2 = 0
      new\y2 = 0
      new\x3 = img_w-1
      new\y3 = img_h
 
      
      ; create device contexts (placeholders) and select images into them
      main_dc = GetDC_(WindowID(1))
      source_dc = CreateCompatibleDC_(main_dc)
      SelectObject_(source_dc,hOldImage)
      dest_dc = CreateCompatibleDC_(main_dc)
      SelectObject_(dest_dc,hNewImage)
      
      
      result = PlgBlt_(dest_dc,@new,source_dc,0,0,img_w,img_h,0,0,0)
      If result
        ;copy the new image back to the Source
        result = BitBlt_(source_dc,0,0,img_w,img_h,dest_dc,0,0,#SRCCOPY)
      EndIf
      ;clean up
      DeleteDC_(source_dc)
      DeleteDC_(dest_dc)
      FreeImage(newImg_id)
    EndIf
    ;Debug "ImageFlipH(): "+Str(ElapsedMilliseconds()-msImageFlipH)+"ms"
    ProcedureReturn result 
EndProcedure



; Создаём окно.
  If OpenWindow(1,0,0,400,350,"PhotoView",#PB_Window_MinimizeGadget | #PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget)
     If CreateGadgetList( WindowID(1) ) ; Создаём пустой список гаджетов.
       If CreateMenu(1,WindowID(1))
       MenuTitle("Файл")
        MenuItem(1,"Открыть")
      
        MenuBar()
        MenuItem(3,"Выход")
       MenuTitle("Просмотр")
        MenuItem(4,"Отразить зеркально")
        MenuItem(5,"Повернуть вправо")
        MenuItem(6,"Повернуть влево")
        MenuItem(7,"На 180 по часовой")
        MenuItem(8,"На 180 против часовой")
        MenuBar()
        MenuItem(9,"Увеличить")
        MenuItem(10,"Уменьшить")
       MenuTitle("Плагины") 
        MenuItem(11,"Серый цвет")
       MenuTitle("Помощь")
        MenuItem(12,"О программе") 
         MenuHeight=MenuHeight() 
       EndIf
       
       If CreateToolBar(1,WindowID(1))
        ToolBarStandardButton(1,#PB_ToolBarIcon_Open)
        ToolBarSeparator()
        ToolBarHeight=ToolBarHeight(1)
       EndIf 
       
       
       ImageGadget(1, 2, ToolBarHeight+2, WindowWidth(1), WindowHeight(1), 0, #PB_Image_Border)
         
     EndIf
  EndIf    
  
  Repeat ; Начало главного цикла.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Menu=EventMenu()
    If Event=#PB_Event_Menu
      Select Menu
       Case 1
        Filename$ = OpenFileRequester("Укажите изображение", "", "All Images Formats|*.bmp;*.jpg;*.png;*.tif;*.tga*.ico", 0)
          If Filename$
            
            If LoadImage(1, Filename$)
              SetGadgetState(1, ImageID(1))  ; change the picture in the gadget
              ResizeWindow(1, #PB_Ignore, #PB_Ignore, ImageWidth(1)+8, ImageHeight(1)+MenuHeight+ToolBarHeight+8)
            EndIf
            
          EndIf
       
       Case 3
        End
       Case 4
        ImageFlipH1(1)
        SetGadgetState(1, ImageID(1))
        ResizeWindow(1, #PB_Ignore, #PB_Ignore, ImageWidth(1)+8, ImageHeight(1)+MenuHeight+ToolBarHeight+8)
       Case 6
        ImageFlipH(1)
        SetGadgetState(1, ImageID(1))
        ResizeWindow(1, #PB_Ignore, #PB_Ignore, ImageWidth(1)+8, ImageHeight(1)+MenuHeight+ToolBarHeight+8)
       Case 11
        GrayImage(1) 
        SetGadgetState(1, ImageID(1))
        ResizeWindow(1, #PB_Ignore, #PB_Ignore, ImageWidth(1)+8, ImageHeight(1)+MenuHeight+ToolBarHeight+8)
      EndSelect ; Этот оператор завершает операцию выбора, начатую оператором Select
    EndIf 
  
  
  
  Until Event = #PB_Event_CloseWindow ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.
  End ; Директива, завершающая программу.

Отредактировано daiomik (07.02.2010 10:24:27)

0

20

daiomik написал(а):

Что это может быть и как это добро исправить?

Сложно сказать.
Я вообще эту вертикальную линию не наблюдаю.
Но скорее всего нужно искать проблему при работе с функцией PlgBlt. Я с ней не работал и поэтому ничего конкретного посоветовать не могу.
Наверное проблема в этом участке кода

Код:
new\x1 = img_w-1
      new\y1 = 0
      new\x2 = 0
      new\y2 = 0
      new\x3 = img_w-1
      new\y3 = img_h
daiomik написал(а):

серый цвет. Посмотрите правильно

Всё правильно.

0

21

Как избавиться от мерцания?

Код:
ProgName.s=GetFilePart(ProgramFilename()) 
  gggggg = CreateSemaphore_(#Null,0,1,@ProgName) ; Если прога уже запущена, то завершаем работу этой копии программы. 
  If gggggg<>0 And GetLastError_()=#ERROR_ALREADY_EXISTS 
    CloseHandle_(gggggg) 
    End 
  EndIf

; декодеры и энкодеры

UseJPEGImageEncoder()
UseJPEGImageDecoder()
UsePNGImageDecoder()      
UsePNGImageEncoder()


;глобальные переменные

Global WDesk.f
Global HDesk.f
Global Image_0
Global IGwight.f
Global IGheight.f
Global u
Global rred

; получение размеров дисплея

 ExamineDesktops()
 
WDesk=DesktopWidth(0)
HDesk=DesktopHeight(0)

HDesk=HDesk / 1024-0.02
WDesk=WDesk / 1280
If WDesk=0
 WDesk=1
EndIf
If HDesk=0
 HDesk=1
EndIf 




;Константы

Enumeration
  #Window_0
  #Window_redaktor
  #CHILD
EndEnumeration


Enumeration
  #MENU
  #MENUPOPUP
  #TrackBar_0
  #Text_0
  #Text_1
  #Text_2
  #Spin_0
  #Spin_1
  #Spin_2 
  #Button_1
  #Button_2
  #Text_3
  #Text_4
  #Text_5
  #TrackBar_redaktor
  #Button_redaktor2
  #Button_redaktor3
  #Imagegadget_redaktor0
  #Spin_redaktor0
  #Spin_redaktor1
  #Text_redaktor0
  #Text_redaktor1
  #Button_redaktor4
  #CheckBox_redaktor
  #CheckBox_redaktor1
  #MDI
EndEnumeration




;Шрифты

Global FontID1
FontID1 = LoadFont(1, "Arial", 14, #PB_Font_Bold)
Global FontID2
FontID2 = LoadFont(2, "Arial", 16)
Global FontID3
FontID3 = LoadFont(3, "Arial", 16, #PB_Font_Bold)
Global FontID4
FontID4 = LoadFont(4, "Arial", 18*HDesk, #PB_Font_Bold)
Global FontID5
FontID5 = LoadFont(5, "Arial", 18)
Global FontID6
FontID6 = LoadFont(6, "Arial", 22, #PB_Font_Bold)
Global FontID7
FontID7 = LoadFont(7, "Arial", 20)
Global FontID8
FontID8 = LoadFont(8, "Arial", 10, #PB_Font_Bold)
Global FontID9
FontID9 = LoadFont(9, "Arial", 12*HDesk,#PB_Font_Bold)
Global FontID10
FontID10 = LoadFont(10, "Arial", 12)

;Объявление связанного списка

NewList FOTO.s()

If LoadImage(ima,"RED.png")
EndIf

; Окно редактора и гаджеты

Procedure Open_Window_REDAKTOR()
  If OpenWindow(#Window_redaktor, 10*WDesk, 0, 1245*WDesk, 945*HDesk, "Редактор",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget |#PB_Window_SizeGadget | #PB_Window_TitleBar)
      WindowBounds(#Window_redaktor, 1245*WDesk, 945*HDesk, 1245*WDesk, 945*HDesk)
      
          TrackBarGadget(#TrackBar_redaktor, 435*WDesk, 895*HDesk, 350*WDesk, 35*HDesk, 0, 500)
          CheckBoxGadget(#CheckBox_redaktor, 863*WDesk, 906*HDesk, 15*WDesk, 15*HDesk, "")
          ButtonGadget(#Button_redaktor2, 890*WDesk, 895*HDesk, 120*WDesk, 35*HDesk, "Обрезать")
          SetGadgetFont(#Button_redaktor2, FontID4)
          ButtonGadget(#Button_redaktor3, 1050*WDesk, 895*HDesk, 185*WDesk, 35*HDesk, "Сохранить как")
          SetGadgetFont(#Button_redaktor3, FontID4)
          SpinGadget(#Spin_redaktor0, 15*WDesk, 902*HDesk, 100*WDesk, 30*HDesk, 0, 10)
          SpinGadget(#Spin_redaktor1, 205*WDesk, 902*HDesk, 100*WDesk, 30*HDesk, 0, 10)
          TextGadget(#Text_redaktor0, 20*WDesk, 875*HDesk, 80*WDesk, 25*HDesk, "Ширина", #PB_Text_Center)
          SetGadgetFont(#Text_redaktor0, FontID9)
          TextGadget(#Text_redaktor1, 210*WDesk, 875*HDesk, 80*WDesk, 25*HDesk, "Высота", #PB_Text_Center)
          SetGadgetFont(#Text_redaktor1, FontID9)
          CheckBoxGadget(#CheckBox_redaktor1, 152*WDesk, 908*HDesk, 15*WDesk, 15*HDesk, "")
         If CreatePopupImageMenu(#MENUPOPUP, #PB_Menu_ModernLook)    
          MenuItem(6, "Сохранить в формате JPG")   
          MenuItem(7, "Сохранить в формате PNG") 
          MenuItem(8, "Сохранить в формате BMP") 
          MenuItem(9, "Сохранить в формате ICO")      
         EndIf


  EndIf
EndProcedure

; Окно кодировщика и гаджеты

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 483*WDesk, 334*HDesk, 274, 160, "Меняем размеры и формат",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar  )
      WindowBounds(#Window_0, 274, 160, 274, 160)
      TrackBarGadget(#TrackBar_0, 5, 75, 190, 30, 1, 3, #PB_TrackBar_Ticks)
      TextGadget(#Text_0, 5, 110, 30, 20, "BMP", #PB_Text_Center)
      TextGadget(#Text_1, 80, 110, 40, 20, "JPEG", #PB_Text_Center)
      TextGadget(#Text_2, 160, 110, 35, 15, "PNG", #PB_Text_Center)
      SpinGadget(#Spin_0, 15, 38, 60, 20, 0, 2000,#PB_Spin_Numeric)
      SpinGadget(#Spin_1, 90, 38, 60, 20, 0, 2000,#PB_Spin_Numeric)
      SpinGadget(#Spin_2, 220, 38, 40, 20, 0, 10,#PB_Spin_Numeric)
      SetGadgetState (#Spin_0, 320)
      SetGadgetState (#Spin_1, 240)
      SetGadgetState (#Spin_2, 10)
      ButtonGadget(#Button_1, 215, 113, 45, 20, "ОК")
      ButtonGadget(#Button_2, 200, 80, 60, 20, "Обрезать")
      TextGadget(#Text_3, 10, 10, 60, 20, "Ширина", #PB_Text_Center)
      TextGadget(#Text_4, 85, 10, 60, 20, "Высота", #PB_Text_Center)
      TextGadget(#Text_5, 210, 10, 60, 20, "Качество", #PB_Text_Center)
    If CreateImageMenu(#MENU, WindowID(#Window_0),#PB_Menu_ModernLook)   
      MenuTitle("Файл") 
      MenuItem( 1, "Открыть Файл(ы)") 
      OpenSubMenu("Настройки") 
      MenuItem( 2, "Создать контекстное меню") 
      MenuItem( 3, "Удалить контекстное меню")
      CloseSubMenu()
      MenuBar()
      MenuItem(4, "О программе") 
      MenuItem(5,"Выход") 
    EndIf   
  EndIf
EndProcedure

; Процедура очистки окна
Procedure ClearAll() 
  b.RECT 
  b\right = WindowWidth(#Window_redaktor)
  b\bottom = WindowHeight(#Window_redaktor) 
  InvalidateRect_(WindowID(#Window_redaktor), @b, 1) 
  SendMessage_(WindowID(#Window_redaktor), #WM_PAINT, 0, 0) 
EndProcedure


;Кодирование Большого числа файлов

Procedure ENCOD(File$)

 If LoadImage( Fotka, File$ )
 
   ResizeImage( Fotka, GetGadgetState(#Spin_0), GetGadgetState(#Spin_1))
  
   If ExamineDirectory(#PB_Any, GetPathPart(File$)+"Encoded", "*.*")=0  
     CreateDirectory(GetPathPart(File$)+"Encoded")
   EndIf
  
   Select GetGadgetState(#TrackBar_0)                                         
    Case 1
      ImagePlugin=#PB_ImagePlugin_BMP
      NAME$=ReplaceString(GetFilePart(File$), GetExtensionPart(File$), "bmp") 
    Case 2
      ImagePlugin=#PB_ImagePlugin_JPEG
      NAME$=ReplaceString(GetFilePart(File$), GetExtensionPart(File$), "jpg")
    Case 3
      ImagePlugin=#PB_ImagePlugin_PNG
      NAME$=ReplaceString(GetFilePart(File$), GetExtensionPart(File$), "png")
   EndSelect                                                                  
  
   PUTYA$=GetPathPart(FILE$)+"Encoded\"+NAME$
  
   If SaveImage( Fotka, PUTYA$,ImagePlugin,GetGadgetState(#Spin_2))
   EndIf
  
 EndIf 
  
  
EndProcedure 

;Процедура рисования

Procedure draw99()
   
  If rred=1 
    StartDrawing( WindowOutput(#Window_redaktor))
    DrawImage(ImageID(Image_0), IGwight, IGheight, ImageWidth(Image_0)*u/100, ImageHeight(Image_0)*u/100) 
    StopDrawing()
  
  EndIf 
EndProcedure




;{------------------------------------------КОД----------------------------------------------------------------------------
  

  
; Открытие окна кодировщика

Open_Window_0()



; ГЛАВНЫЙ ЦИКЛ   

Repeat

  ev=WaitWindowEvent()
  
  Select ev
    
    Case #PB_Event_Menu
       
       Select EventMenu()
         
         Case 1            ; Выбрать файлы для кодировки или редактирования
           
           ClearList(FOTO.s()) ; очищаем связанный список
           
           File$ = OpenFileRequester("Выбрать файл(ы)", "", "PNG  JPG  BMP|*.png;*.jpg;*.JPG;*.JEPG;*.jpeg;*.bmp|", 0,#PB_Requester_MultiSelection)
           kontekst=1
           While File$
             AddElement(FOTO()) 
             FOTO() = File$
             File$ = NextSelectedFileName()              
           Wend
           

         Case 2             ; Создаем контекстное меню в реестре
         
          If KONTEXT_MENU_CREATE("ИЗМЕНИТЬ ПАРАМЕТРЫ ФОТО","PhotoDef.exe")
             MessageRequester("Информация", "Контекстное меню создано!") 
          EndIf
          
         Case 3              ; Удаляем меню в реестре
           
          If DELETE_KONTEXT("ИЗМЕНИТЬ ПАРАМЕТРЫ ФОТО")
             MessageRequester("Информация", "Контекстное меню удалено!") 
          EndIf 
          
         Case 4              ;  О программе
         
             MessageRequester("О программе", "Программа создана Станиславом Будиновым. Сайт: www.mneniya.ucoz.ru") 
             
         Case 5               
            If DeleteFile("PHOTODEF99.reg")    ; удаляем РегистрФайл
            EndIf
              End                               ; выходим 

       EndSelect
            
     Case #PB_Event_Gadget
       If EventGadget()= #Button_1          
         
          If kontekst=0                 ; Если вызов был из контекстного меню 
         
           If ReadFile(0, GetTemporaryDirectory()+"FHOTODEF.trtr")  ;Читаем временный файл и кодируем

                While Eof(0) = 0 
                  File$=ReadString(0)
                  ENCOD(File$) 
                  AddElement(FOTO()) 
                  FOTO() = File$    
                Wend
              CloseFile(0)  
                MessageRequester("Информация", "Все готово")  
               DeleteFile(GetTemporaryDirectory()+"FHOTODEF.trtr")            ; Удаляем временный файл           
            EndIf                
          
          Else                    ; если вызов был из программы
        
                
            ResetList(FOTO())                   ; читаем связанный список и кодируем
            While NextElement(FOTO())
              ENCOD(FOTO())
            Wend
            MessageRequester("Информация", "Все готово")
            
          EndIf
         
       EndIf 
       
       If EventGadget()= #Button_2        ; включаем редактор
            rred=1  ; флаг для рисования, что редактор включен                      
           Open_Window_REDAKTOR() ; окно редактора
           
           
         Select kontekst
         
          Case 0   ; вызов из контекстного меню фото для редактора
          
            If ReadFile(0, GetTemporaryDirectory()+"FHOTODEF.trtr")  ;Читаем временный файл 

                While Eof(0) = 0 
                  AddElement(FOTO()) 
                  FOTO() = ReadString(0) 
                Wend
                  LoadImage(Image_0,FOTO()) ; берем последнее фото из связанного списка
               CloseFile(0)  
                
               DeleteFile(GetTemporaryDirectory()+"FHOTODEF.trtr")            ; Удаляем временный файл           
            EndIf
             
          Case 1  ;вызов из программы фото для редактора
          
            ResetList(FOTO()) ;сбрасываем лист
            
            While NextElement(FOTO())     ; читаем связанный список и берем последнее фото
             LoadImage(Image_0,FOTO())
            Wend
            
         EndSelect 
            
            Result_ImageWidth= ImageWidth(Image_0)         ; узнаем ширину фото
            Result_ImageHeight= ImageHeight(Image_0)       ; узнаем высоту фото
            
            
            
            If Result_ImageWidth>1215*WDesk Or Result_ImageHeight>760*HDesk  ; если размер больше гаджета
            
               ;Проверяем по ширине 
              If Result_ImageWidth>1215*WDesk            
                 Result_ImageHeight=1215*WDesk*Result_ImageHeight/Result_ImageWidth 
                 Result_ImageWidth=1215*WDesk     ;Ставим размер если ширина                 
              EndIf 
              
              ; Проверяем по высоте
              If  Result_ImageHeight>760*HDesk
                 Result_ImageWidth=Result_ImageWidth*760*HDesk/Result_ImageHeight  
                 Result_ImageHeight=760*HDesk  ;Ставим размер если высота
              EndIf
              

               
            EndIf  
               
               ;ставим TrackBar по умолчанию в процентах
 
              SetGadgetState(#TrackBar_redaktor,Result_ImageWidth/ImageWidth(Image_0)*100)
              
 

              IGwight=(1245*WDesk-Result_ImageWidth)/2       ;Узнаем размещение ImageGadget по оси Х
              IGheight=(937*HDesk-Result_ImageHeight)/2      ;Узнаем размещение ImageGadget по оси Y
              


       EndIf
       
             ; Клик меню для сохранения фото после редактирования
       
       If EventGadget()= #Button_redaktor3  
           DisplayPopupMenu(#MENUPOPUP, WindowID(#Window_redaktor),WindowX(#Window_redaktor)+1057,WindowY(#Window_redaktor)+835) 
       EndIf
       
         ;событие изменения TrackBar, для ZOOM
       
       If  EventGadget()= #TrackBar_redaktor
            u=GetGadgetState(#TrackBar_redaktor)
            If u=0
              u=1     ;не допускаем нуля
            EndIf
            
            IGwight.f=(1245*WDesk-ImageWidth(Image_0)*u/100)/2    ;Центровка фото по ширине
            IGheight.f=(937*HDesk-ImageHeight(Image_0)*u/100)/2   ;Центровка фото по высоте
            
            ClearAll()  ;запуск очистки после рисования
            
             
            SmartWindowRefresh(#Window_redaktor, 100) ; уменьшение мерцания
            
            
       EndIf
       
       
            ; Удаляем РегФайл и выходим
     
     Case #PB_Event_CloseWindow 
       If DeleteFile("PHOTODEF99.reg")
       EndIf
        End   
       
  EndSelect
  
draw99() ;пускаем рисование
           
ForEver 
       
      
;}-------------------------------------------------------------------------------------------------------------------------------

0

22

А почему рисуешь по окну?
Лучше помещай рисунок в ImageGadget

0

23

Какая нужна библиотека ? Не компилируется ?

0

24

mirashic написал(а):

Какая нужна библиотека ? Не компилируется ?

Вотздесь я выкладывал библиотеку

0

25

Да это библиотека добавления в контекстное меню Контекстное меню проводника
Просто сделай комментариями те строчки и всё.

0

26

Пётр написал(а):

А почему рисуешь по окну?Лучше помещай рисунок в ImageGadget

Я еще не связывался с 2d графикой, поэтому не знаю как нарисовать и положить в imagegadget/ Покажи если не трудно на примере. Кстати это было бы предпочтительнее. Изначально что то я пытался с ним связать, но все плохо кончалось, поэтому решил так.

0

27

haav написал(а):

Я еще не связывался с 2d графикой, поэтому не знаю как нарисовать и положить в imagegadget

А зачем использовать 2D графику?
Просто заргужаем рисунок (LoadImage), при необходимости, изменяем его размер (ResizeImage) и помещаем в ImageGadget (SetGadgetState).

haav написал(а):

Изначально что то я пытался с ним связать, но все плохо кончалось

А что было не так?

0

28

Пётр написал(а):

А что было не так?

Может я что то не так делал, но при увеличении и уменьшении моментально терялось качество рисунка. Как мне показалось команда Resizeimage попросту работает как конвертер.  Но это мое мнение.

0

29

Пётр написал(а):

А что было не так?

Вот что было не так:

Код:
If OpenWindow(1,100,100,800,600,"")
TrackBarGadget(2, 200, 400, 500, 35*1, 0, 200)
EndIf
LoadImage(4,"RED.bmp")  ;фото свое поставте

SetGadgetState(2,100)

Repeat
ev=WaitWindowEvent()
If ev=#PB_Event_Gadget
If EventGadget()=2
   aa=GetGadgetState(2)
   ResizeImage(4,aa*ImageWidth(4)/100,aa*ImageHeight(4)/100)
   ImageGadget(1,10,10,500,500,ImageID(4))
EndIf
EndIf   
Until ev=#PB_Event_CloseWindow

0

30

Попробуй так

Код:
UseJPEGImageDecoder()

If OpenWindow(1,100,100,800,600,"")
TrackBarGadget(2, 200, 500, 500, 35*1, 0, 200)
ImageGadget(1,10,10,500,500,0)
EndIf
LoadImage(4,"D:\PB_3D_perspective.jpg")  ;фото свое поставте
CreateImage(1,ImageWidth(4), ImageHeight(4))
CopyImage(4,1)

SetGadgetState(2,100)

Repeat
ev=WaitWindowEvent()
If ev=#PB_Event_Gadget
If EventGadget()=2
   aa=GetGadgetState(2)*2+1
   CopyImage(1,4)
   ResizeImage(4,aa,aa)
   SetGadgetState(1,ImageID(4))
EndIf
EndIf   
Until ev=#PB_Event_CloseWindow

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Просмотрщик фотографий