PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Поворот изображения


Поворот изображения

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

1

Задача.
Имею созданное изображение размером WxH
нужно создать второе размером HxW поворотом влево на 90 гр.

нашел близкий код в теме
Просмотрщик фотографий

стал модифицировать в

Код:
Procedure ImageRotateLeft(ImageSource, ImageTarget) ;
img1_id=ImageID(ImageSource)
img2_id=ImageID(ImageTarget)

    result = #False
    If IsImage(ImageSource) And IsImage(ImageTarget)
      ; Get current img details
      hOldImage.l = img1_id
      img_w = ImageWidth(Image)
      img_h = ImageHeight(Image)
      
      hNewImage.l = img2_id
      
      ;set up corners for H flip
      new.corners

      new\x1 = 0
      new\y1 = img_w
      new\x2 = 0
      new\y2 = 0
      new\x3 = img_h
      new\y3 = img_w
      
      ; 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)
      ;clean up
      DeleteDC_(source_dc)
      DeleteDC_(dest_dc)
    EndIf
    ;Debug "ImageFlipH(): "+Str(ElapsedMilliseconds()-msImageFlipH)+"ms"
    ProcedureReturn result 
EndProcedure

который используется так

Код:
 hImage1 = CreateImage(#PB_Any , Xmax, Ymax)
 hImage2 = CreateImage(#PB_Any , Ymax, Xmax)
 ....
 If StartDrawing(ImageOutput(hImage1)) 
    ....
    StopDrawing()
    SaveImage(hImage1, GraphFileT$ , #PB_ImagePlugin_PNG )
            	
    If ImageRotateLeft(hImage1, hImage2)
        SaveImage(hImage2, GraphFile$ , #PB_ImagePlugin_PNG )
    EndIf
    
    FreeImage(hImage1)
    FreeImage(hImage2)
 EndIf

В результате имею чистый второй граф файл

Предполагаю что дело в  main_dc = GetDC_(WindowID(1))
т.к. у программы нет никакого окна - она работает сервисом.

Какой DC нужно брать в таком случае?

Или пробовать другие способы?
Например - попиксельный перенос Point(x, y) - Plot(x, y [, Color])
Но здесь как-то нужно переключаться и одного изображения на другое.
И это будет требовать гораздо больше времени.

0

2

Я думаю что логичнее использовать что-то типа GdipRotateWorldTransform()
Пример тут http://www.cyberforum.ru/post2378264.html

0

3

я сделал по другому
повернул изображение средствами браузера

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

сделано это так

Код:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<HEAD>
<TITLE>Wind's History at ..., Хабаровский край</TITLE>
<script type='text/javascript'>

  function rotate()
  {

    i = document.getElementById('i');
    iw = i.width;
    ih = i.height;
  
    cnv = document.createElement('canvas');
    cnv.setAttribute('width', ih);
    cnv.setAttribute('height', iw);
    cnv.style.border='thin solid #000000';

    ctx = cnv.getContext('2d');
    ctx.rotate(-90*Math.PI/180);
    ctx.drawImage(i, -iw, 0);

    document.body.insertBefore(cnv, i);
    document.body.removeChild(i);
  }
</script>

</HEAD>
<BODY bgcolor=PaleGoldenrod onload='rotate()'>

Wind's History at ..., Хабаровский край (r) SadStar<BR>
Обновлено 2012/01/20 15:45:22 <BR>
Суточный график скорости ветра<BR><BR>
<img id="i" src="Wind20120120T.png"  border="1"><br>
<br>
<a href="Wind20120120t.htm">Посмотреть  табличные данные</a>

</BODY>
</HTML>

хотя конечно поворот в Пурике надо отработать

0

4

SadStar
Попробуй это, когдато баловался :blush: может поможет :)

0

5

напоролся на мелкомягкий косяк - в IE8 не работает canvas. только в 9

пришлось костыли для восьмерки приделывать. на основе "excanvas.is"

если нужен измененный код - пишите - выложу

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

Попробуй это, когдато баловался :blush: может поможет :)

Спасибо. Взглянул по диагонали. Увидел попиксельную обработку примерно как я думал для альтернативного варианта.
Интересно - какова скорость попиксельной обработки? Поисследую при случае.

0

6

Поворот на 90 градусов в любую сторону - самый простой вариант
можно крутить массив:
(картинка в пределах массива, у меня 600x400)

Код:
Enumeration 
  #Window_0 =333
  #Image
  #Load
  #But1
  #But2
  #img
  #img2
  #But3
EndEnumeration 
UsePNGImageDecoder()

Global Dim Pic(600,600)

CreateImage(#img,600,600)

Procedure start()
StartDrawing(ImageOutput(#img))
Box(0,0,600,600,RGB(255, 255, 255))
 DrawImage(ImageID(#Load), 0, 0 ,600,400)
  
  For x=0 To 599
   For y=0 To  399
    Pic(x,y) =Point(x, y) 
   Next
  Next
StopDrawing()

SetGadgetState(#Image,ImageID(#img)) 
EndProcedure



Procedure rotate1()
StartDrawing(ImageOutput(#img))
Box(0,0,600,600,RGB(255, 255, 255)) 

  For x=0 To 599
   For y=0 To  399 
    Plot(y, x ,Pic(x,y))  
   Next
  Next

StopDrawing()
SetGadgetState(#Image,ImageID(#img)) 
EndProcedure

Procedure rotate2()
StartDrawing(ImageOutput(#img))
Box(0,0,600,600,RGB(255, 255, 255)) 

  For x=0 To 599
   For y=0 To  399 
    Plot(599-x, 399-y ,Pic(x,y))  
   Next
  Next

StopDrawing()
SetGadgetState(#Image,ImageID(#img)) 
EndProcedure


Procedure rotate3()
StartDrawing(ImageOutput(#img))
Box(0,0,600,600,RGB(255, 255, 255)) 

  For x=0 To 599
   For y=0 To  399 
    Plot(y, x ,Pic(599-x,399-y))  
   Next
  Next

StopDrawing()
SetGadgetState(#Image,ImageID(#img)) 
EndProcedure


LoadImage(#Load,"sad.png")

OpenWindow(#Window_0,0,0,800,800,"Окно",#WS_OVERLAPPEDWINDOW|#PB_Window_ScreenCentered) ;#CRLF$
 SetWindowColor(#Window_0,RGB(255, 255, 255))
 ImageGadget(#Image,10, 10,0,0,ImageID(#Load))
 ButtonGadget(#But1,620,30,150,20,"Повернуть пртиво часовой")
 ButtonGadget(#But2,620,60,150,20,"Повернуть на 180")
 ButtonGadget(#But3,620,90,150,20,"Повернуть по часовой ")
 
 start()
 
 
Repeat 
Event =  WaitWindowEvent() 
Window = EventWindow() 
Gadget = EventGadget()
  Select Event
   Case #PB_Event_CloseWindow 
     Break
   Case #PB_Event_Gadget
     Select EventGadget()
         
     Case #But1
       rotate1()
     Case #But2
       rotate2() 
     Case #But3
       rotate3()
  EndSelect  
 EndSelect 
ForEver

0

7

2 mirashic а не подскажешь как теперь сохранить измененную картинку?

0

8

Для сохранения есть функция SaveImage(). http://purebasic.ru/manual.php?id=620&lng=rus

0

9

2 Петр  - Сохраняю используя SaveImage() - сильно меняется размер по сравнению с исходным файлом jpg - как то можно сделать чтобы размер не сильно менялся? Параметр качество есть - но как узнать качество исходного?

0

10

Картинка была повернута и поэтому сжиматься она будет по другому.
Это все равно что если в сжать архиватором два текстовых документа с похожим содержимым - размер будет отличаться.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Поворот изображения