It is currently Wed Oct 28, 2020 5:46 pm

All times are UTC + 1 hour




Post new topic Reply to topic  [ 1 post ] 
Author Message
 Post subject: LoadImagePlus (EXIF rotation)
PostPosted: Thu Aug 27, 2020 11:35 pm 
Offline
Enthusiast
Enthusiast

Joined: Fri Jun 05, 2020 12:47 am
Posts: 128
I have created a procedure LoadImagePlus to load images with EXIF rotation.

My work has been very little, it was just the work of @infratec and @luis

The RotateImage include file is the one at https://www.purebasic.fr/english/viewtopic.php?f=12&t=38975 by @luis

The procedure has been a modification of source code by @infratec at https://www.purebasic.fr/english/viewtopic.php?f=13&t=75884

Code:
EnableExplicit

#DHT = $C4FF
#DAC = $CCFF

#APP0 = $E0FF
#APP1 = $E1FF

#RST0 = $D0FF
#RST1 = $D1FF
#RST2 = $D2FF
#RST3 = $D3FF
#RST4 = $D4FF
#RST5 = $D5FF
#RST6 = $D6FF
#RST7 = $D7FF
#SOI = $D8FF
#EOI = $D9FF
#SOS = $DAFF
#DQT = $DBFF
#DRI = $DDFF

#Intel = 1
#Motorola = 2

#EXIF_OrientationTag = $0112

IncludeFile "RotateImage.pbi"

Procedure LoadImagePlus(flag,filename$)
   Define.i File, Ptr, Orientation, OrientationPtr, Marker, Img, ImgOk
   Define Filename$
   Define *Buffer
   
   If Filename$
      File = ReadFile(flag, Filename$)
      If File
         *Buffer = AllocateMemory(Lof(File), #PB_Memory_NoClear)
         If *Buffer
            If ReadData(File, *Buffer, MemorySize(*Buffer)) = MemorySize(*Buffer)
               If PeekU(*Buffer + Ptr) = #SOI
                  ;Debug "Ok"
                  Ptr + 2
                  Repeat
                     Marker = PeekU(*Buffer + Ptr)
                     ;Debug Hex(Marker)
                     Ptr + 2
                     Select Marker
                        Case #APP1
                           Break
                        Case #DRI
                           Ptr + 4
                        Case #RST0, #RST1, #RST2, #RST3, #RST4, #RST5, #RST6, #RST7
                        Default
                           ;Debug Hex(PeekA(*Buffer + Ptr) << 8 | PeekA(*Buffer + Ptr + 1))
                           Ptr + (PeekA(*Buffer + Ptr) << 8 | PeekA(*Buffer + Ptr + 1))
                     EndSelect
                     
                  Until Ptr >= MemorySize(*Buffer) Or Marker = #SOS
                  
                  If Marker = #APP1
                     ;Debug PeekS(*Buffer + Ptr + 2, 4, #PB_Ascii)
                     If PeekS(*Buffer + Ptr + 2, 4, #PB_Ascii) = "Exif"
                        ;Debug "Exif found"
                        
                        
                        Ptr + 8
                        
                        ;ShowMemoryViewer(*Buffer + Ptr, 200)
                        
                        If PeekU(*Buffer + Ptr) = $4949
                           
                           Repeat
                              If CompareMemory(?Intel, *Buffer + Ptr + 4 + OrientationPtr, 8)
                                 Orientation = PeekA(*Buffer + Ptr + 4 + OrientationPtr + 8)
                                 Break
                              Else
                                 OrientationPtr + 1
                              EndIf
                           Until Orientation = 1024
                           
                        ElseIf PeekU(*Buffer + Ptr) = $4D4D
                           
                           Repeat
                              If CompareMemory(?Motorola, *Buffer + Ptr + 4 + OrientationPtr, 8)
                                 Orientation = PeekA(*Buffer + Ptr + 4 + OrientationPtr + 8 + 1)
                                 Break
                              Else
                                 OrientationPtr + 1
                              EndIf
                           Until OrientationPtr = 1024
                           
                        EndIf
                        
                     EndIf
                     
                     Debug Orientation
                     
                  EndIf
                  
               Else
                  Debug "No Exif found"
               EndIf
               
            EndIf
         EndIf
         FreeMemory(*Buffer)
         CloseFile(File)
      EndIf   
      
      UseJPEGImageDecoder()
      
      Img = LoadImage(flag, Filename$)
      If Img
         
         Select Orientation
            Case 0, 1
               ImgOk = Img
            Case 2
               ImgOk = MirrorImage(Img)
               FreeImage(Img)
            Case 3
               ImgOk = RotateImage(Img, 180)
               FreeImage(Img)
            Case 4
               ImgOk = FlipImage(Img)
               FreeImage(Img)
            Case 5
               ImgOk = MirrorImage(Img)
               FreeImage(Img)
               Img = ImgOk
               ImgOk = RotateImage(Img, 90)
               FreeImage(Img)
            Case 6
               ImgOk = RotateImage(Img, -90)
               FreeImage(Img)
            Case 7
               ImgOk = MirrorImage(Img)
               FreeImage(Img)
               Img = ImgOk
               ImgOk = RotateImage(Img, -90)
               FreeImage(Img)
            Case 8
               ImgOk = RotateImage(Img, 90)
               FreeImage(Img)
         EndSelect
      EndIf
   EndIf
   
   ProcedureReturn imgok
EndProcedure

DataSection
  Intel:
  Data.a $12, $01, $03, $00, $01, $00, $00, $00
  Motorola:
  Data.a $01, $12, $00, $03, $00, $00, $00, $01
EndDataSection


Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1 post ] 

All times are UTC + 1 hour


Who is online

Users browsing this forum: No registered users and 45 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
Jump to:  

 


Powered by phpBB © 2008 phpBB Group
subSilver+ theme by Canver Software, sponsor Sanal Modifiye