3
NZN              T   @   s
  d dl Z dZddddd d!d"fddddddddddddddd1d2d3d4d5fddddddddddddddd dddddddddMdNdOdPdQdRdSdTdUdVdW	fd	d
ddd\d]d^ fdddadbdcdddedfdgdhdifddddddddqdNdrdsdtdudvfdwdxdydzd{d|d}d~ddddddfd|ddddddddddddddfddddd^ fdddddd^ fdddddd d!d"d#d$d%d&dddifdddifdRZd'd(d)d*d+dZd,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdϜZdGdHdIdJdKdLdMdNdOdPdQdRdddddddfddSddTddUdd dddd	difdVdWdZddddddddfddddfdddddddvfddddd dfddddyddzdddifdZd	d
 ZdXdefddddd5fddddfdYdZd[ddd^ fd\d	ZdddddddfdҐd dd!d5fd"dd#d$d%d&fd'dd(dd)d*fd+d,dd-d.fd]ddd{dydzd0dOd1fd2dd3d4d5fd6dd7d8d5fddd7d8d5fdddd8d9d:d;d<fd=Z	d>d?d^ fd^d2d3d3dd4d4dfdddydd@dAdBddCdDfddd8d7dEfdFdd8d7dEfd'dd(dd)dGfd_ddd(dfdՐddOdfdIdd(dfdJddddKdLdMdNdOdPdQ	fdRdd(dfdSdd(dfdTdd(dfdUdd(dfdVZ
d`dadbdcd[Zd\dddfddddd!d^d_fd'd`dd(dadbdcdddedffdgdhdidfdՐdjdkdldmdndidmdifdodpdqdrd5fdsdtdOddudvdLddwddKdxdydzfdd{d|d}d5fd6d7dd8d~fdd7dd8d~fd2d7dd8d~fddddddddfdqddddfddOddddfdddddddfddddddOddfdedfdgddddfdddddddfdՐdndidfdZddddd{dzd|dCdifdhdidddddddddddddddddddfdjdZdd Zdd Zdd ZG dd dZG dĐdń dŃZG dƐdǄ dǃZdkdȐdɄZedk
rd dlZeejd	k 	redejd    ejd  xejdd D ]Zyeed̃ZW n"   eed̓ e  	wY nX eed  eeZe
sedσ 	qeej  Z!e!j"  xre!D ]jZ#e#dlk
r6
q"y,ede#eee# j$ d	 ee# j%f  W n&   ede#dee# dӃ Y nX 
q"W dek
redԃ e  	qW dS (m      NXProprietary   BByteAASCII   SShort   LLong   RRatioSBSigned ByteU	UndefinedSSSigned ShortSLSigned LongSRSigned Ratio
ImageWidthImageLengthBitsPerSampleZCompressionzUncompressed TIFFzJPEG Compressed)r      PhotometricInterpretation	FillOrderDocumentNameImageDescriptionMakeModelStripOffsetsOrientationSamplesPerPixelRowsPerStripStripByteCountsXResolutionYResolutionPlanarConfigurationZResolutionUnitzNot AbsolutezPixels/InchzPixels/Centimeter)r   r	      TransferFunctionSoftwareDateTimeArtist
WhitePointPrimaryChromaticitiesTransferRangeJPEGProcJPEGInterchangeFormatJPEGInterchangeFormatLengthYCbCrCoefficientsYCbCrSubSamplingYCbCrPositioningReferenceBlackWhiteCFARepeatPatternDim
CFAPatternBatteryLevel	CopyrightExposureTimeFNumberIPTC/NAA
ExifOffsetInterColorProfileZExposureProgramZUnidentifiedZManualzProgram NormalzAperture PriorityzShutter PriorityzProgram CreativezProgram ActionzPortrait ModezLandscape Mode)	r   r   r	   r.   r      r      r   SpectralSensitivityGPSInfoISOSpeedRatingsOECFZExifVersionc             C   s   dj tt| S )N )joinmapchr)x rQ   /usr/share/hplip/base/exif.py<lambda>   s    rS   DateTimeOriginalDateTimeDigitizedZComponentsConfigurationrL   YZCbZCrZRedZGreenZBlue)r   r   r	   r.   r   rF   r   CompressedBitsPerPixelShutterSpeedValueApertureValueBrightnessValueExposureBiasValueMaxApertureValueSubjectDistanceZMeteringModeZAverageZCenterWeightedAverageZSpotZ	MultiSpot)r   r   r	   r.   r   ZLightSourceUnknownZDaylightZFluorescentZTungstenZFlashzStandard Light AzStandard Light BzStandard Light CZD55ZD65ZD75ZOther)r   r   r	   r.   
                        ZNoZFiredz	Fired (?)z	Fired (!)z
Fill FiredzFill Fired (?)zFill Fired (!)ZOffzAuto Offz
Auto FiredzAuto Fired (?)zAuto Fired (!)zNot Available)r   r   rF   rG   	                            FocalLength	MakerNoteZUserCommentc             C   s   dj tt| S )NrL   )rM   rN   rO   )rP   rQ   rQ   rR   rS      s    
SubSecTimeSubSecTimeOriginalSubSecTimeDigitizedZFlashPixVersionc             C   s   dj tt| S )NrL   )rM   rN   rO   )rP   rQ   rQ   rR   rS      s    
ColorSpaceExifImageWidthExifImageLengthInteroperabilityOffsetFlashEnergySpatialFrequencyResponseFocalPlaneXResolutionFocalPlaneYResolutionFocalPlaneResolutionUnitSubjectLocationExposureIndexSensingMethodZ
FileSourcer.   zDigital CameraZ	SceneTypezDirectly Photographed)R   i  i  i  i  i
  i  i  i  i  i  i  i  i  i  i  i  i  i(  i-  i1  i2  i;  i>  i?  iV  i   i  i  i  i  i  i  i  i  i  i  i  i  i  ii  is  i"  i$  i%  i'  i(  i   i  i  i  i  i  i  i  i  i  i  i  i  i	  i
  i|  i  i  i  i  i   i  i  i  i  i  i  i  i  i  i  i  i  i   i  InteroperabilityIndexInteroperabilityVersionRelatedImageFileFormatRelatedImageWidthRelatedImageLength)r   r	   i   i  i  GPSVersionIDGPSLatitudeRefGPSLatitudeGPSLongitudeRefGPSLongitudeGPSAltitudeRefGPSAltitudeGPSTimeStampGPSSatellites	GPSStatusGPSMeasureModeGPSDOPGPSSpeedRefGPSSpeedGPSTrackRefGPSTrackGPSImgDirectionRefGPSImgDirectionGPSMapDatumGPSDestLatitudeRefGPSDestLatitudeGPSDestLongitudeRefGPSDestLongitudeGPSDestBearingRefGPSDestBearingGPSDestDistanceRefGPSDestDistance)r   r   r	   r.   r   rF   r   rG   r   rg   r_         rh      ri   rj   r`   ra   rb   rc   rd   re      rk   rl      
ISOSetting	ColorModeQualityWhitebalanceImageSharpening	FocusModeFlashSettingISOSelectionImageAdjustmentAuxiliaryLensManualFocusDistanceDigitalZoomFactorZAFFocusPositionZCenterZTopZBottomZLeftZRight)r   r   i   i   i   Z
SaturationzB&Wz-2z-1012NoiseReductionDataDump)r	   r.   r   rF   r   rG   r   ri                        rj   z	VGA Basicz
VGA NormalzVGA Finez
SXGA BasiczSXGA Normalz	SXGA Fine)r   r	   r.   r   rF   r   ZColorZ
Monochrome)r   r	   NormalzBright+zBright-z	Contrast+z	Contrast-ZCCDSpeedzISO 80zISO 160zISO 320zISO 100)r   r	   r   rF   ZWhiteBalanceZAutoZPresetZIncandescentZCloudyzSpeed Light)r.   r   rF   r   rG   c             C   s@   ddddd}dddd	d
d}d|| d  | d || d  f S )Nr   r^   ZFastPanorama)r   r   r	   r.   zNon-panoramiczLeft to rightzRight to leftzBottom to topzTop to bottom)r   r   r	   r.   r   z%s - sequence %d - %sr   r   r	   rQ   )vabrQ   rQ   rR   olympus_special_modeK  s    r   JPEGThumbnailZSpecialModeZJPEGQualZSQZHQZSHQZMacro)r   r   DigitalZoomSoftwareReleasePictureInfoZCameraIDc             C   s   dj tt| S )NrL   )rM   rN   rO   )rP   rQ   rQ   rR   rS   i  s    )	r   i   i  i  i  i  i  i	  i   ZRecordingModezSingle Shutterr   zNight SceneZPortraitZ	Landscape)r   r	   r.   r   rF   ZEconomyZFineZFocusingModez
Auto FocuszManual FocusZInfinity)r	   r.   r   rF   Z	FlashModeZOnzRed Eye Reduction)r   r	   r.   r   ZFlashIntensityZWeakZStrong)r   rh   ri   Object DistanceZShade)r   r	   r.   r   rF      Z	SharpnessZSoftZHard)r   r   r	   ZContrastZLowZHighz+1.0z+3.0z+2.0)@   P   d   }         )r   r	   r.   r   rF   r   rG   r   r   rh   rc   ZNoteVersionc             C   s   dj tt| S )NrL   )rM   rN   rO   )rP   rQ   rQ   rR   rS     s    zDaylightColor-FluorescentzDaywhiteColor-FluorescentzWhite-FluorescentZCustom)r   r   i   i   i  i  i   i   )r   r   i   ZTone)r   r   r	   r.   FlashStrengthZSlowSyncZPictureModeZSportsZNightz
Program AEzAperture Priority AEzShutter Priority AEzManual Exposure)	r   r   r	   r   rF   r   r   i   i   ZMotorOrBracketZBlurWarningZFocusWarningZ	AEWarning)r   i   i  i  i  i  i  i  i   i!  i0  i1  i   i   i  i  	ImageTypeFirmwareVersionImageNumber	OwnerName)r   rG   r   rg   Z	Macromode	SelfTimerZ	Superfine)r	   r.   rF   zFlash Not FiredzRed-Eye ReductionzSlow SynchrozAuto + Red-Eye ReductionzOn + Red-Eye Reductionzexternal flash)r   r   r	   r.   r   rF   r   rj   ZContinuousDriveModezSingle Or TimerZ
ContinuouszOne-ShotzAI ServozAI FocusZMFSingleZ	ImageSizeZLargeZMediumZSmallZEasyShootingModez	Full AutozFast ShutterzSlow ShutterZSepiazMacro/Close-Upz	Pan Focus)r   r   r	   r.   r   rF   r   rG   r   rg   r_   r   NoneZ2xZ4x)i  r   r   ZISOzSee ISOSpeedRatings TagZ50Z100Z200Z400)r   ri   rj   r`   ra   rb   Z
EvaluativeZPartialzCenter-weighted)r.   r   rF   Z	FocusTypezClose-Up (Macro)zLocked (Pan Mode))r   r   r.   r   ZAFPointSelectedz	None (MF)zAuto-Selected)i 0  i0  i0  i0  i0  ZExposureModezEasy ShootingZProgramzTv-priorityzAv-priorityzA-DEP)r   r   r	   r.   r   rF   !LongFocalLengthOfLensInFocalUnits"ShortFocalLengthOfLensInFocalUnitsFocalUnitsPerMMZFlashActivityzDid Not FireZFlashDetailszExternal E-TTLzInternal FlashzFP Sync Usedz2nd("Rear")-Curtain Sync UsedzFP Sync Enabled)r   rh   r   rG   r   )r   r	   r.   r   rF   rG   r_   r   r   rh   r   ri   rj   r`   ra   rb   rc   r   rk   rl      rm   ro   ZSunnySequenceNumberAFPointUsedZ	FlashBiasz-2 EVz-1.67 EVz-1.50 EVz-1.33 EVz-1 EVz-0.67 EVz-0.50 EVz-0.33 EVz0 EVz0.33 EVz0.50 EVz0.67 EVz1 EVz1.33 EVz1.50 EVz1.67 EVz2 EV)i  i  i  i  i  i  i  i  r   r   rj   rc   ro   ,   0   4   r   )rG   rg   r   ri   rb   c             C   s&   d}x| D ]}|d> t |B }q
W |S )Nr   r   )ord)strrP   crQ   rQ   rR   s2n_motorolaz  s    
r   c             C   s6   d}t d}x$| D ]}|t||> B }|d }qW |S )Nr   r   )Zto_longr   )r   rP   yr   rQ   rQ   rR   	s2n_intel  s    
r   c             C   s   |dkr| S t || | S d S )Nr   )gcd)r   r   rQ   rQ   rR   r     s    r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )r   c             C   s   || _ || _d S )N)numden)selfr   r   rQ   rQ   rR   __init__  s    zRatio.__init__c             C   s,   | j   | jdkrt| jS d| j| jf S )Nr   z%d/%d)reducer   r   r   )r   rQ   rQ   rR   __repr__  s    

zRatio.__repr__c             C   s2   t | j| j}|dkr.| j| | _| j| | _d S )Nr   )r   r   r   )r   ZdivrQ   rQ   rR   r     s    zRatio.reduceN)__name__
__module____qualname__r   r   r   rQ   rQ   rQ   rR   r     s   c               @   s$   e Zd Zdd Zdd Zdd ZdS )IFD_Tagc             C   s(   || _ || _|| _|| _|| _|| _d S )N)	printabletag
field_typefield_offsetfield_lengthvalues)r   r   r   r   r   r   r   rQ   rQ   rR   r     s    zIFD_Tag.__init__c             C   s   | j S )N)r   )r   rQ   rQ   rR   __str__  s    zIFD_Tag.__str__c             C   s    d| j t| j d | j| jf S )Nz(0x%04X) %s=%s @ %dr	   )r   FIELD_TYPESr   r   r   )r   rQ   rQ   rR   r     s    zIFD_Tag.__repr__N)r   r   r   r   r   r   rQ   rQ   rQ   rR   r     s   r   c               @   sd   e Zd ZdddZdddZdd Zdd	 Zd
d Zdd Ze	fddZ
dd Zdd Zdd ZdS )EXIF_headerr   c             C   s"   || _ || _|| _|| _i | _d S )N)fileendianoffsetdebugtags)r   r   r   r   r   rQ   rQ   rR   r     s
    zEXIF_header.__init__c             C   sB   | j j| j|  | j j|}| jdkr2t|}nt|}|r>|S )NI)r   seekr   readr   r   r   )r   r   lengthsignedslicevalrQ   rQ   rR   s2n  s    

zEXIF_header.s2nc             C   sN   d}xDt |D ]8}| jdkr.|t|d@  }nt|d@ | }|d? }qW |S )NrL   r  rf   r   )ranger   rO   )r   r   r  sirQ   rQ   rR   n2s  s    
zEXIF_header.n2sc             C   s   | j ddS )Nr   )r  )r   rQ   rQ   rR   	first_IFD  s    zEXIF_header.first_IFDc             C   s$   | j |d}| j |d d|  dS )Nr	   r   r   )r  )r   ifdentriesrQ   rQ   rR   next_IFD  s    zEXIF_header.next_IFDc             C   s.   | j  }g }x|r(|j| | j|}qW |S )N)r  appendr  )r   r  r   rQ   rQ   rR   	list_IFDs  s    
zEXIF_header.list_IFDsc          	   C   s`  | j |d}xLt|D ]>}|d d|  }| j |d}| j |d d}d|  k o`ttk n  svtd||f t| d }	| j |d d}
|d }|
|	 dkr| j |d}|}|dkr|
dkr| jj| j|  | jj|
j	 j
dd}nd}nng }|dk}x`t|
D ]T}|dkr@t| j |d|| j |d d|}n| j ||	|}|j| ||	 }qW |
dkr|dkrt|d }nt|}|j|}|r|d }t|dkrt|d tjr|d |}n,d}x0|D ]}||d j|t|7 }qW nd| }t||||||
|	 | j|d | < | jrtd|t| j|d |  f  qW d S )Nr	   r   r   zunknown type %d in tag 0x%04Xr   r    rL   r   rg   r_   rF   r   z
Tag 0x%04X z
    %s: %s)r   r   rg   r_   )rF   r_   )r  r	  lenr   
ValueErrorr   r  r   r  stripreplacer   r  r   get
isinstancecollectionsCallablereprr   r   r   print)r   r  Zifd_namedictr  r  entryr   r   typelencountr   r   r   r  jZvalue_jr   Z	tag_entryZtag_namerQ   rQ   rR   dump_IFD  s^    



 zEXIF_header.dump_IFDc             C   s  | j |d}| jdkrd}nd}| jj| j|  || jj|d d d 7 }xt|D ]}|d d|  }| j |d}| j |d d}t| d }| j |d d}	| j |d	 d}
|d d
 }|dkr|}|	| }|	| dkrXt|}|d | | j	|d ||d d   }|dkr"|}d}| jj| j|
  || jj|	| 7 }qXW | j
d j}| j
d j}xxtt|D ]h}| j	t||}|d | | ||| d   }||7 }| jj| j||   || jj|| 7 }qrW || j
d< d S )Nr	   MzMM *   zII*    r   z    r   r   r   ra   i  zThumbnail StripOffsetszThumbnail StripByteCountsTIFFThumbnail)r  r   r   r  r   r  r	  r   r  r  r   r   )r   	thumb_ifdr  Ztiffr  r   r   r   r!  r"  ZoldoffZptrZ	strip_offZ	strip_lenZnewoffZold_offsetsZ
old_countsr   rQ   rQ   rR   extract_TIFF_thumbnail6  sD    
(
 z"EXIF_header.extract_TIFF_thumbnailc             C   sd  | j d }| j d j}| j d j}|dkrt|jdd ddd	d
dgkr^| j|jd dtd n| j|jdtd d S |d d dkr| j|jd dtd d S |dkr| j|jdtd d S |dkr| j	}d| _	| j
}|  j
|j7  _
| jddtd || _	|| _
d S |dkr`| j|jdtd x6dtfdtffD ]"}| j| j |d  j|d  q6W d S d S )NzEXIF MakerNotez
Image MakezImage ModelZNIKONr   rF   N   i   k   o   n   r   rq   )r  rG   ZOLYMPUSZCasioZFUJIFILMr  r   ZCanonzMakerNote Tag 0x0001zMakerNote Tag 0x0004r   )r   r   r   r$  r   MAKERNOTE_NIKON_OLDER_TAGSMAKERNOTE_NIKON_NEWER_TAGSMAKERNOTE_OLYMPUS_TAGSMAKERNOTE_CASIO_TAGSr   r   MAKERNOTE_FUJIFILM_TAGSMAKERNOTE_CANON_TAGSMAKERNOTE_CANON_TAG_0x001MAKERNOTE_CANON_TAG_0x004canon_decode_tag)r   ZnoteZmakeZmodelr   r   r  rQ   rQ   rR   decode_maker_notel  sD    






"zEXIF_header.decode_maker_notec             C   s   xt dt|D ]r}|j|d}| jr0t|| |d }t|dkrZ|d j|| d}n|| }tt|d dd d d | jd| < qW d S )Nr   r^   r   z
MakerNote )r^   )r	  r  r  r   r  r   r   r   )r   valuer  r  rP   namer  rQ   rQ   rR   r6    s    
zEXIF_header.canon_decode_tagN)r   )r   )r   r   r   r   r  r  r  r  r  	EXIF_TAGSr$  r(  r7  r6  rQ   rQ   rQ   rR   r     s   

	C69r   c             C   s  | j d}|dd d-kr>| jd | j d}| j d d}n|dd dkrxX|d d	kr|d
d d.krt|d d t|d  }| j |d  d| j d }qPW |d d	kr|d
d dkr| j }| j d}qi S ni S | rtddd| d t| |||}|j }d}x,|D ]"}	|dkr4d}
n|dkrHd}
|	}nd| }
|rhtd||
|	f  |j|	|
 |jj	|
d }|r|rtd|j
d   |j|j
d d |jj	d}|r|rtd |j
d   |j|j
d d!td" |jj	|
d# }|r8|r"td$|j
d   |j|j
d d%td" |d7 }qW |jj	d&}|rn|jd'krn|j| |jj	d(}|r| j||j
d   |jd) j
d }| j ||jd*< d+|jkr|j  d*|jkr|jj	d,}|r| j||j
d   | j |j|jd*< |jS )/Nr   r   r   II* MM *r   r	   u   ÿØ   ÿr   r_   JFIFJFXXOLYMr   rF   r   u   ÿ ZExifZIntelZMotorola)r  r%  formatZImageZ	ThumbnailzIFD %dz IFD %d (%s) at offset %d:z ExifOffsetz EXIF SubIFD at offset %d:ZEXIFz"EXIF SubIFD InteroperabilityOffsetz. EXIF Interoperability SubSubIFD at offset %d:zEXIF Interoperability)r  z GPSInfoz GPS SubIFD at offset %d:ZGPSzThumbnail CompressionzUncompressed TIFFzThumbnail JPEGInterchangeFormatz%Thumbnail JPEGInterchangeFormatLengthr   zEXIF MakerNotezMakerNote JPEGThumbnail)r;  r<  )r>  r?  r@  )r  r  r   tellr  r   r  r$  r   r  r   	INTR_TAGSGPS_TAGSr   r(  r7  r   )r   r   datar   r   r  ZhdrZifd_listZctrr  ZIFD_namer'  Zexif_offZintr_offZgps_offZthumbZ	thumb_offsizerQ   rQ   rR   process_file  s    






rG  __main__zUsage: %s files...
rbZ
unreadable:zNo EXIF information foundr&  z   %s (%s): %serror"zFile has JPEG thumbnailr   r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r   r   r   r   r   r   r   r   )rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  )r   )r   )r   )r    )r!   )r"   )r#   )r$   )r%   )r&   )r'   )r(   )r)   )r*   )r+   )r,   )r-   )r/   )r0   )r1   )r2   )r3   )r4   )r5   )r6   )r7   )r8   )r9   )r:   )r;   )r<   )r=   )r>   )r?   )r@   )rA   )rB   )rC   )rD   )rE   )rH   )rI   )rJ   )rK   )rT   )rU   )rW   )rX   )rY   )rZ   )r[   )r\   )r]   )rp   )rq   )rr   )rs   )rt   )ru   )rv   )rw   )rx   )ry   )rz   )r{   )r|   )r}   )r~   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r]   )r   )r   r&  )&r  r   r:  rC  rD  r/  r.  r   r0  r1  r2  r3  r4  r5  r   r   r   r   r   r   rG  r   sysr  argvr  exitfilenameopenr   rE  listkeysrP   sortr  r   r   rQ   rQ   rQ   rR   <module>   s2  E          














 {^



&&
