zmc
2023-08-08 e792e9a60d958b93aef96050644f369feb25d61b
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
U
T±dÎ.ã    @s¾ddlZddlZddlZddlmZmZmZGdd„dƒZdd„Zdd    „Z    d
d „Z
Gd d „d ejƒZ dd„Z dd„Z e e je e ¡e e je ¡e e jddddddg¡e e jd¡dS)éNé)ÚImageÚ    ImageFileÚ_binaryc@sJeZdZdZddd„Zdd„Zdd„Zd    d
„Zd d „Zd d„Z    dd„Z
dS)Ú    BoxReaderz}
    A small helper class to read fields stored in JPEG2000 header boxes
    and to easily step into and read sub-boxes.
    éÿÿÿÿcCs ||_|dk|_||_d|_dS)Nrr)ÚfpÚ
has_lengthÚlengthÚremaining_in_box)Úselfrr
©r úLd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\PIL/Jpeg2KImagePlugin.pyÚ__init__s
zBoxReader.__init__cCs:|jr|j ¡||jkrdS|jdkr2||jkSdSdS)NFrT)r    rÚtellr
r )r Ú    num_bytesr r rÚ    _can_read#s
 
 
zBoxReader._can_readcCsh| |¡sd}t|ƒ‚|j |¡}t|ƒ|krLd|›dt|ƒ›d}t|ƒ‚|jdkrd|j|8_|S)NzNot enough data in headerzExpected to read z bytes but only got Ú.r)rÚ SyntaxErrorrÚreadÚlenÚOSErrorr )r rÚmsgÚdatar r rÚ _read_bytes-s
 
zBoxReader._read_bytescCs t |¡}| |¡}t ||¡S©N)ÚstructÚcalcsizerÚunpack)r Z field_formatÚsizerr r rÚ read_fields;s
 
zBoxReader.read_fieldscCs |j}| |¡}tt |¡|ƒSr)r rrÚioÚBytesIO)r rrr r rÚ
read_boxes@s
zBoxReader.read_boxescCs$|jr|j ¡|j|jkSdSdS)NT)r    rrr r
©r r r rÚ has_next_boxEszBoxReader.has_next_boxcCs€|jdkr|j |jtj¡d|_| d¡\}}|dkrL| d¡d}d}nd}||ksf| ||¡srd}t|ƒ‚|||_|S)    Nrrz>I4srz>QéézInvalid header length)r rÚseekÚosÚSEEK_CURr rr)r ZlboxÚtboxZhlenrr r rÚ next_box_typeKs
 
zBoxReader.next_box_typeN)r) Ú__name__Ú
__module__Ú __qualname__Ú__doc__rrrr r#r%r,r r r rrs
 
rc Cs| d¡}t |¡}|| |d¡}t d|¡\ }}}}}}}    }    }    }    }
dg|
} dg|
} dg|
} t|
ƒD],}t d|dd|¡\| |<| |<| |<qn||||f}|
dkrÐ| dd    @d
krÊd }qþd }n.|
dkrÞd }n |
dkrìd}n|
dkrúd}nd}||fS)z‹Parse the JPEG 2000 codestream to extract the size and component
    count from the SIZ marker segment, returning a PIL (size, mode) tuple.éz >HHIIIIIIIIHNz>BBBé$érrér'úI;16ÚLÚLAÚRGBéÚRGBA)rrÚi16berÚ unpack_fromÚrange)rÚhdrZlsizZsizZrsizZxsizZysizZxosizZyosizÚ_ZcsizZssizZxrsizZyrsizÚirÚmoder r rÚ_parse_codestreamas2
 
ÿ
 
 
 *rBcCs$|dkr d|d|d|SdS)zµConvert JPEG2000's (numerator, denominator, exponent-base-10) resolution,
    calculated as (num / denom) * 10^exp and stored in dots per meter,
    to floating-point dots per inch.réþé
i'Nr )ÚnumZdenomÚexpr r rÚ _res_to_dpiƒsrGcCs–t|ƒ}d}d}| ¡rT| ¡}|dkr4| ¡}qTq|dkr| d¡ddkrd}qd}d}d}d}d}    | ¡rj| ¡}|dkrî| d    ¡\}
} }}| |
f}|d
kr¶|d @d kr¶d }n6|d
krÄd}n(|dkrÒd}n|dkràd}n |dkrìd}qh|dkrh| ¡} |  ¡rh|  ¡} | dkrþ|  d¡\}}}}}}t|||ƒ}t|||ƒ}|dk    rh|dk    rh||f}    qhqþqh|dks~|dkrŠd}t|ƒ‚||||    fS)zªParse the JP2 header box to extract size, component count,
    color space information, and optionally DPI information,
    returning a (size, mode, mimetype, dpi) tuple.Nsjp2hsftypz>4srsjpx z    image/jpxsihdrz>IIHBrr4r'r5r6r1r7r3r8r9r:sres srescz>HHHHBBzMalformed JP2 header)rr%r,r#r rGr)rÚreaderÚheaderÚmimetyper+rrAZbpcZncÚdpiÚheightÚwidthÚresZtresZvrcnZvrcdZhrcnZhrcdZvrceZhrceZhresZvresrr r rÚ_parse_jp2_header‹s\
 
  rOcsNeZdZdZdZdd„Zdd„Ze‡fdd„ƒZej    d    d„ƒZd
d „Z
‡Z S) ÚJpeg2KImageFileZJPEG2000zJPEG 2000 (ISO 15444)c Cs†|j d¡}|dkr.d|_t|jƒ\|_|_nt||j d¡}|dkr–d|_t|jƒ}|\|_|_|_}|dk    rz||jd<|j d¡     d    ¡r¢| 
¡n d
}t |ƒ‚|j dks¶|jdkrÂd }t |ƒ‚d |_ d |_d }d }z|j ¡}t |¡j}Wnjtk
rZd }z4|j ¡}|j d tj¡|j ¡}|j |¡Wntk
rTd }YnXYnXdd|j d |j|j |j||ffg|_dS)Nr9óÿOÿQÚj2kr'ó jP  
‡
Újp2rKé sjp2cÿOÿQznot a JPEG 2000 filezunable to determine size/moderrÚjpeg2k©rr)rrÚcodecrBÚ_sizerArOZcustom_mimetypeÚinfoÚendswithÚ_parse_commentrrÚ_reduceÚlayersÚfilenor)ÚfstatÚst_sizeÚ    Exceptionrr(r!ÚSEEK_ENDÚtile)r ÚsigrIrKrÚfdr
Úposr r rÚ_openÏsP 
 
 
 
 
 
üÿzJpeg2KImageFile._opencCs¨|j d¡}t |¡}|j |dtj¡|j d¡}|s<q¤|d}|dkrNq¤|j d¡}t |¡}|dkrŽ|j |d¡dd…|jd<q¤q*|j |dtj¡q*dS)Nr1r)ééÙédÚcomment)rrrr;r(r)r*rZ)r r>r
ÚmarkerÚtypr r rr\s 
 
zJpeg2KImageFile._parse_commentcs|jp tƒjSr)r]ÚsuperÚreducer$©Ú    __class__r rrpszJpeg2KImageFile.reducecCs
||_dSr)r])r Úvaluer r rrp scCsª|jrž|jržd|j>}|d?}t|jd||ƒt|jd||ƒf|_|jd}|dd|j|j|dd|ddf}|dd|j|d|fg|_tj |¡S)Nrrr3r9rWr1)rdr]ÚintrrYr^rÚload)r ÚpowerÚadjustÚtÚt3r r rru$s 
þ
*zJpeg2KImageFile.load) r-r.r/ÚformatÚformat_descriptionrhr\ÚpropertyrpÚsetterruÚ __classcell__r r rqrrPËs4
rPcCs |dd…dkp|dd…dkS)Nr9rQrUrSr )Úprefixr r rÚ_accept5sþr€cCs |j}| d¡s| dd¡r"d}nd}| dd¡}| dd¡}| dd¡}| d    d
¡}| d d¡}    |    dk    r–t|    ttfƒrŠtd d „|    Dƒƒs–d}
t|
ƒ‚| dd¡} | dd¡} | dd¡} | dd¡}| dd¡}| dd¡}| dd¡}| dd¡}| d¡}t|tƒr|     ¡}| dd¡}d}t
|dƒrXz |  ¡}Wnt k
rVd}YnX|||||    | | | ||||||||f|_ t ||dd|jd|fg¡dS) Nú.j2kZno_jp2FrRrTÚoffsetÚ tile_offsetÚ    tile_sizeÚ quality_modeZratesÚquality_layerscSsg|]}t|ttfƒ‘qSr )Ú
isinstancertÚfloat)Ú.0Z quality_layerr r rÚ
<listcomp>Qsÿz_save.<locals>.<listcomp>z,quality_layers must be a sequence of numbersÚnum_resolutionsrZcodeblock_sizeÚ precinct_sizeÚ irreversibleÚ progressionZLRCPÚ cinema_modeÚnoÚmctÚsignedrlÚpltrr_rVrW)Z encoderinfor[Úgetr‡ÚlistÚtupleÚallÚ
ValueErrorÚstrÚencodeÚhasattrr_rbZ encoderconfigrÚ_saver)ZimrÚfilenamerZÚkindr‚rƒr„r…r†rr‹Z    cblk_sizerŒrrŽrr‘r’rlr“rfr r rrœ@sp      ÿþÿþ            
 
ðrœz.jp2rz.jpcz.jpfz.jpxz.j2cz    image/jp2)r!r)rÚrrrrrBrGrOrPr€rœZ register_openrzZ register_saveZregister_extensionsZ register_mimer r r rÚ<module>s"J"@j Hÿ