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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
U
T±d)0ã
@s ddlZddlZddlZddlZddlmZmZmZmZe     d¡Z
e
rRddlm Z dZ dZ dd„Zd    d
„Zd d „Zd d„Zdd„ZGdd„dƒZGdd„dejƒZdd„Zdd„Ze ejee¡e ejd¡e eje¡e ejd¡edkrœeejƒdkredƒe  ¡e!ejddƒpZ"ee"ƒZ#e#j$d D]Z%e%e#_%e# &d!e%¡q:e !ejd¡Z'e' &d"¡W5QRXej(d#kr’e )d"¡W5QRXdS)$éN)ÚImageÚ    ImageFileÚPngImagePluginÚfeaturesZjpg_2000)ÚJpeg2KImagePluginsicnsécCst d| t¡¡S)Nz>4sI)ÚstructÚunpackÚreadÚ
HEADERSIZE)Úfobj©r úJd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\PIL/IcnsImagePlugin.pyÚ
nextheader#srcCsH|\}}| |¡| d¡}|dkr0d}t|ƒ‚t||d|df|ƒS)Nész'Unknown signature, expecting 0x00000000)Úseekr
Ú SyntaxErrorÚread_32)r Ú start_lengthÚsizeÚstartÚlengthÚsigÚmsgr r rÚread_32t's
 
rc
Csp|\}}| |¡|d|d|d|df}|d|d}||dkrp| |¡}t d||dddd¡}nøt d|d¡}tdƒD]à}    g}
|} | dkr| d¡} | s®q| d} | d@rê| d    } | d¡} t| ƒD]}|
 | ¡qØn| d} |
 | | ¡¡| | 8} | dkr’qq’| dkr:d
t| ƒ›d }t|ƒ‚t d |d      |
¡dd dd¡}|j
  |j
|    ¡q†d|iS)zn
    Read a 32bit RGB icon resource.  Seems to be either uncompressed or
    an RLE packbits-like scheme.
    réééÚRGBÚrawNé€é}zError reading channel [z left]ÚLó) rr
rÚ
frombufferÚnewÚrangeÚappendÚreprrÚjoinÚimZputband)r rrrrÚ
pixel_sizeÚsizesqZindatar*Zband_ixÚdataZ    bytesleftÚbyteÚ    blocksizeÚirÚbandr r rr2s@
  
 
 
 
 
rc    Csf|d}| |¡|d|d|d|df}|d|d}t d|| |¡dddd¡}d|iS)Nrrrr"rÚA)rrr$r
)r rrrr+r,r1r r rÚread_mk]s 
 r3c
Csì|\}}| |¡| d¡}|dd…dkrT| |¡t |¡}t |j¡d|iS|dd…dks||dd…dks||dkrÜtsŒd    }t|ƒ‚| |¡| |¡}t     
|¡}    t   |    ¡}t |j¡|j dkrÔ| d¡}d|iSd
}t|ƒ‚dS) Né rs‰PNG
 
ÚRGBArsÿOÿQs
‡
s jP  
‡
zQUnsupported icon subimage format (rebuild PIL with JPEG 2000 support to fix this)z Unsupported icon subimage format)rr
rZ PngImageFilerZ_decompression_bomb_checkrÚ enable_jpeg2kÚ
ValueErrorÚioÚBytesIOrZJpeg2KImageFileÚmodeÚconvert)
r rrrrrr*rZ
jp2kstreamÚfr r rÚread_png_or_jpeg2000gs8
 
 
 
 ÿþýÿ
 
 
 
 
 
r=c@sÆeZdZdefgdefgdefgdefgdefgdefdefdefgd    efgd
efgd efd efgd efdefdefgdefgdefdefdefgdœ Zdd„Zdd„Z    dd„Z
dd„Z d dd„Z dS)!ÚIcnsFileóic10óic09óic14óic08óic13óic07sit32st8mksicp6óic12sih32sh8mksicp5sil32sl8mkóic11sicp4sis32ss8mk) )érGr)rGrGr)érHr)rHrHr)r r r)r r r)é@rIr)é rJr)é0rKr)rJrJr)érLr)rLrLrcCs”i|_}||_t|ƒ\}}t|ƒs0d}t|ƒ‚t}||krt|ƒ\}}|dkr\d}t|ƒ‚|t7}|t8}||f||<| |tj¡||7}q4dS)z@
        fobj is a file-like object as an icns resource
        znot an icns filerzinvalid block headerN)    Údctr rÚ_acceptrr rr8ÚSEEK_CUR)Úselfr rMrÚfilesizerr0r/r r rÚ__init__¥s"
   zIcnsFile.__init__cCsBg}|j ¡D].\}}|D] \}}||jkr| |¡qqq|S©N)ÚSIZESÚitemsrMr')rPÚsizesrZfmtsÚfmtÚreaderr r rÚ    itersizes¼s 
 
zIcnsFile.itersizescCs | ¡}|sd}t|ƒ‚t|ƒS)NzNo 32bit icon resources found)rYrÚmax)rPrVrr r rÚbestsizeÅs
zIcnsFile.bestsizecCsDi}|j|D]0\}}|j |¡}|dk    r| ||j||ƒ¡q|S)zÂ
        Get an icon resource as {channel: array}.  Note that
        the arrays are bottom-up like windows bitmaps and will likely
        need to be flipped or transposed in some way.
        N)rTrMÚgetÚupdater )rPrrMÚcoderXÚdescr r rÚ dataforsizeÌs  zIcnsFile.dataforsizeNcCs†|dkr| ¡}t|ƒdkr.|d|ddf}| |¡}| dd¡}|rL|S| d¡ ¡}z| |d¡Wntk
r€YnX|S)Nrrrr5rr2)r[Úlenr`r\ÚcopyZputalphaÚKeyError)rPrZchannelsr*r r rÚgetimageÙs 
 zIcnsFile.getimage)N) Ú__name__Ú
__module__Ú __qualname__r=rr3rrTrRrYr[r`rdr r r rr>‰s6ýýýì     r>c@sBeZdZdZdZdZdd„Zedd„ƒZej    dd„ƒZd    d
„Z
d S) Ú IcnsImageFilea!
    PIL image support for Mac OS .icns files.
    Chooses the best resolution, but will possibly load
    a different size image if you mutate the size attribute
    before calling 'load'.
 
    The info dictionary has a key 'sizes' that is a list
    of sizes that the icns file has.
    ZICNSzMac OS icns resourcecCs\t|jƒ|_d|_|j ¡|jd<|j ¡|_|jd|jd|jd|jdf|_dS)Nr5rVrrr)    r>ÚfpÚicnsr:rYÚinfor[Ú    best_sizer©rPr r rÚ_openþs  þzIcnsImageFile._opencCs|jSrS)Ú_sizermr r rrszIcnsImageFile.sizecCsª|}||jdkr0t|ƒdkr0|d|ddf}||jdkr†t|ƒdkr†|ddkr†dd„|jdDƒ}||kr†|jd| |¡}||jdkr d}t|ƒ‚||_dS)    NrVrrrrcSs,g|]$}|d|d|d|df‘qS)rrrr )Ú.0rr r rÚ
<listcomp>sz&IcnsImageFile.size.<locals>.<listcomp>z2This is not one of the allowed sizes of this image)rkraÚindexr7ro)rPÚvalueZ    info_sizeZ simple_sizesrr r rr s$ ÿ
þ
ýÿcCs¢t|jƒdkr@|j|_|jd|jd|jd|jdf|_tj |¡}|jdk    rh|jj|jkrh|S| ¡|j |j¡}| ¡}|j|_|j    |_    |j|_|S)Nrrrr)
rarrlrÚloadr*Z load_preparerjrdr:)rPZpxr*r r rrt sþ zIcnsImageFile.loadN) rerfrgÚ__doc__ÚformatÚformat_descriptionrnÚpropertyrÚsetterrtr r r rrhðs
 
 
 
rhc    CsÄt|dƒr| ¡dddddddddœ}d    d
„|j d g¡Dƒ}i}t| ¡ƒD]B}||krd||n | ||f¡}t ¡}|     |d ¡| 
¡||<qPg}    |  ¡D]*\}
}||} |      |
t t| ƒ| d œ¡q | t¡t } | t dt|    ƒ7} | tdd„|    Dƒƒ7} | t d| ¡¡| d¡| t dt t|    ƒt ¡¡|    D]*} | | d¡| t d| d¡¡qB|    D]8} | | d¡| t d| d¡¡| | d¡qrt|dƒrÀ| ¡dS)za
    Saves the image as a series of PNG files,
    that are then combined into a .icns file.
    Úflushr rHrGirJrI)rDrBr@r?rFrErCrAcSsi|] }|j|“qSr )Úwidth)rpr*r r rÚ
<dictcomp>Lsz_save.<locals>.<dictcomp>Z append_imagesZpng)ÚtyperÚstreamrcss|]}|dVqdS)rNr )rpÚentryr r rÚ    <genexpr>dsz_save.<locals>.<genexpr>z>isTOC r}rr~N)ÚhasattrrzZ encoderinfor\ÚsetÚvaluesÚresizer8r9ÚsaveÚgetvaluerUr'r raÚwriteÚMAGICÚsumrÚpack)r*riÚfilenamerVZprovided_imagesZ size_streamsrÚimageÚtempÚentriesr}r~Z file_lengthrr r rÚ_save:sV
ø
ÿ
 ý ÿ
 
 rcCs|dd…tkS)Nr)rˆ)Úprefixr r rrNxsrNz.icnsz
image/icnsÚ__main__rz)Syntax: python3 IcnsImagePlugin.py [file]rÚrbrVzout-%s-%s-%s.pngzout.pngZwindows)*r8ÚosrÚsysZPILrrrrZ check_codecr6rrˆr rrrr3r=r>rhrrNZ register_openrvZregister_extensionZ register_saveZ register_mimereraÚargvÚprintÚexitÚopenriZimfrkrr…r*ÚplatformÚ    startfiler r r rÚ<module>sF
  +
"gJ>