рдПрд╕рдПрд╕рдкреА - рдореВрд▓ рджреЛрд╖рд░рд╣рд┐рдд рдЫрд╡рд┐ рд╕рдВрдкреАрдбрд╝рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо

рдЕрдВрдд рдореЗрдВ, рдПрдХ рдмрд╛рд░ рд╡рд┐рдХрд╕рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдПрд╕рдПрд╕рдкреА (рд╕реНрдХреАрдирд░ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкреИрдХрд░) рдХрд╣реВрдВрдЧрд╛ред рдкреАрдПрдирдЬреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрд╕рдПрд╕рдкреА рдирд┐рд╖реНрдкрдХреНрд╖ рд░реВрдк рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реВрдВрдЧрд╛ред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рджреЛ рд╕рдВрдкреАрдбрд╝рди рдореЛрдб рд╣реИрдВ:
  1. рджреЛрд╖рд░рд╣рд┐рдд - рдЬрд┐рд╕рдореЗрдВ, рд╡рд┐рдШрдЯрди рдХреЗ рдмрд╛рдж рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдирд┐рдХрдЯрддрдо рдмрд┐рдЯ рдкрд░ рдмрд╣рд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛;
  2. рдиреБрдХрд╕рд╛рди рдХреЗ рд╕рд╛рде - рдЬреЛ рдЪрд┐рддреНрд░ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рдХрдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдмрд╕ рд╕рдВрдкреАрдбрд╝рди рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ, рдЫрд╡рд┐ рдХреЛ Ycbrrette рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
    рдХреЗрд╡рд▓ рдкреИрд▓реЗрдЯ рдХреЛ рдмрджрд▓рдХрд░ рд╣рдо рд╕рдВрдкреАрдбрд╝рди рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
    cY = 0.30078125 * R + 0.5859375 * G + 0.11328125 * B
    cCb = -0.171875 * R - 0.33984375 * G + 0.51171875 * B + 128
    cCr = 0.51171875 * R - 0.4296875 * G - 0.08203125 * B + 128
рдпрджрд┐ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдЪрд┐рддреНрд░ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ -
рдЫрд╡рд┐
рд╣рдореЗрдВ рдирд┐рдореНрди рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ:
183 960 - рдореВрд▓ PNG рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░
155 932 - рдПрд╕рдПрд╕рдкреА (рд╕рдВрдкреАрдбрд╝рди рдореЗрдВ 0.2 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ)
122 593 - рдПрд╕рдПрд╕рдкреА (рдиреБрдХрд╕рд╛рди рдХреЗ рд╕рд╛рде, рдиреБрдХрд╕рд╛рди)

рдЕрдЧрд▓реА рдЫрд╡рд┐ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдХреЗ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
www.libpng.org/pub/png/img_png/16million-pschmidt.png
59852 - рдкреАрдПрдирдЬреА
1428 - рдПрд╕рдПрд╕рдкреА

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░рдг рд╣реИрдВ:
  1. рдЫрд╡рд┐ рдХреЛ рдЖрд░рдЬреАрдмреА рд╕рд░рдгреА рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ;
  2. рдпрджрд┐ рд╣рд╛рдирд┐рдкреВрд░реНрдг рдореЛрдб рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ YcbCr рдкреИрд▓реЗрдЯ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдХреЛрдбрд┐рдВрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
  3. рдЫрд╡рд┐ рдХреЛ рдкреИрде рдлрд╝рд┐рд▓реНрдЯрд░ (рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реИрдЦрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдореВрд▓реНрдп рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА) рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
  4. рдХрд┐рд╕реА рдЧреИрд░-рдЬрдЯрд┐рд▓ рддрд░реАрдХреЗ рд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рд╣рдЯрд╛рдирд╛:
    I = 4 рд╕реЗ рдпреВрдмрд╛рдЙрдВрдб ( рдмрд╛рдЗрдЯрдЕрд░реЗ ) рдЪрд░рдг 4 <br/>
    рдЖрд░ = рдмрд╛рдЗрдЯрдЕрд░реЗ ( i + 0 ) <br/>
    g = рдмрд╛рдЗрдЯрдЕрд░реЗ ( i + 1 ) <br/>
    b = рдмрд╛рдЗрдЯрдЕрд░реЗ ( i + 2 ) <br/>
    рдпрджрд┐ рдирд╣реАрдВ ( lR = R рдФрд░ Lg = g рдФрд░ lB = b ) рдпрд╛ ( Cnt> = MAX_ITERATE ) рддрдм <br/>
    рдпрджрд┐ Cnt = MAX_ITERATE рддреЛ Cnt = 0 <br/>
    рдмрд╛рдЗрдЯрдЕрд░реЗ ( рдкреЙрд╕ + 0 ) = рдПрд▓рдЖрд░ <br/>
    рдмрд╛рдЗрдЯрдЕрд░реЗ ( рдкреЙрдЬрд╝ + 1 ) = рдПрд▓рдЬреА <br/>
    рдмрд╛рдЗрдЯрдЕрд░реЗ ( рдкреЙрд╕ 2 ) = рдПрд▓рдмреА <br/>
    рдмрд╛рдЗрдЯрдЕрд░реЗ ( рдкреЙрд╕ 3 ) = Cnt <br/>
    lR = R <br/>
    Lg = g <br/>
    lB = b <br/>
    pos = pos + 4 <br/>
    Cnt = 1 <br/>
    рдПрд▓реНрд╕ <br/>
    Cnt = Cnt + 1 <br/>
    рдЕрдВрдд рдЕрдЧрд░ <br/>
    рдЕрдЧрд▓рд╛
  5. рдмреАрдбрдмреНрд▓реНрдпреВрдЯреА рдХреЛрдбрд┐рдВрдЧ (рдмрд░реЛрдЬрд╝-рд╡реНрд╣реАрд▓рд░ рдкрд░рд┐рд╡рд░реНрддрди), рдЕрд░реНрдерд╛рддреН - рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди - рдЖрд░реНрдХрди, рд▓реЗрдЦрдХ - рджрд┐рдорд┐рддреНрд░реА рдорд╛рд▓рд┐рд╢реЗрд╡;
  6. рдЕрдЧрд▓рд╛ рдореЗрд░рд╛ рдХрд╛рд░реНрдп рдЖрддрд╛ рд╣реИ, рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдмрд╛рдЗрдЯ рдХреЛ рд╣рдЯрд╛рдХрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдмрд╛рдЗрдЯ рдФрд░ рдЙрди рдкрджреЛрдВ рдХреЗ рдПрдХ рдмрд┐рдЯрдореИрдк рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЬрд╣рд╛рдВ рд╕реЗ рдпрд╣ рдмрд╛рдЗрдЯ рд╣рдЯрд╛ рджреА рдЧрдИ рдереАред рдпрд╣ рдЪрд░рдг 3 рдмрд╛рд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЪрдпрдирд┐рдд рдореВрд▓реНрдп);

    рдбрд┐рдо рдореИрдВ рдЬрдм рддрдХ
    рдбрд┐рдо iCnt рд▓реЙрдиреНрдЧ
    рдбрд┐рдо рд╕рд╛рдЗрдЬрд╝рд╕реНрдЯреНрд░реАрдо ( ) рдмрд╛рдЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ
    рдбрд┐рдо рдиреНрдпреВрд╕реНрдЯреНрд░реАрдо ( ) рдмрд╛рдЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ
    рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд░реВрдк рдореЗрдВ рдордВрдж рдЖрдХрд╛рд░
    рдбрд┐рдо SizeLengthReal рд▓рдВрдмреЗ рд╕рдордп рддрдХ
    рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд░реВрдк рдореЗрдВ рдордВрджрддрд╛
    рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд░реВрдк рдореЗрдВ рдирдИ NewLengthReal
    рдбрд┐рдо рдмрд┐рдЯрдкреЛрд╕ рд▓реЙрдиреНрдЧ
    рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЖрдХрд╛рд░
    рдбрд┐рдо рдлреНрд░реАрдХ ( 255 ) рдЕрд╕ рд▓реЙрдиреНрдЧ
    рдмрд╛рдЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдо рдлреНрд░реАрдХрд░
    рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдо рдлреНрд░реАрдХрд╛рдЙрдВрдЯ
    рдЬрдм рддрдХ рдордВрдж рджрд╣реА
    рдЬрдм рддрдХ рдирдИ рдЧрд┐рдирддреА рдордВрдж
    рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдбрд┐рдо рдПрдбрдЪрд░
    рдбрд┐рдо рдкрд┐рдЫрд▓реЗ рдЪрд╛рд░ рдЬрдм рддрдХ
    рдбрд┐рдо рдмрд┐рдЯрдСрд░ ( 7 ) рдмрд╛рдЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ

    рдЖрдХрд╛рд░ = UBound ( bts ) + 1

    SizeLengthReal = 1024
    ReDim SizeStream ( SizeLengthReal )

    NewLengthReal = 1024
    ReDim NewStream ( NewLengthReal )

    I = 0 рд╕реЗ 7 рдХреЗ рд▓рд┐рдП
    BitOr ( i ) = ( 2 ^ i )
    рдЕрдЧрд▓рд╛

    I = 0 рд╕реЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП - 1
    рдХрд░рдЪрд░ = рдмреАрдЯреАрдПрд╕ ( рдЖрдИ )
    рдлрд╝реНрд░реАрдХ ( рдХрд░рдЫрд╛рд░ ) = рдлрд╝реНрд░реАрдХ ( рдХрд░реНрдХрд░ ) + рез
    рдЕрдЧрд▓рд╛

    I = 0 рд╕реЗ 255 рдХреЗ рд▓рд┐рдП
    рдЕрдЧрд░ рдлреНрд░реАрдХ ( i ) > рдлреНрд░реАрдХрд╛рдЙрдВрдЯ рддрдм
    FreqCount = рдлрд╝реНрд░реАрдХ ( i )
    рдлреНрд░реАрдЪрдХреНрд░ = рдЖрдИ
    рдпрджрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ
    рдЕрдЧрд▓рд╛

    I = 0 рд╕реЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП - 1

    рдХрд░рдЪрд░ = рдмреАрдЯреАрдПрд╕ ( рдЖрдИ )

    рдЕрдЧрд░ ( рдХрд░рдЪрд╣рд░ <> рдлреНрд░реАрдЪрд╛рд░реНрдЬ ) рддрдм
    AddChar = AddChar рдпрд╛ BitOr ( BitPos )
    рдпрджрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ

    рдмрд┐рдЯрдкреЛрд╕ = рдмрд┐рдЯрдкреЛрд╕ + рез
    рдЕрдЧрд░ рдмрд┐рдЯрдкреЛрд╕ = 8 рддреЛ
    SizeStream ( SizeLength ) = AddChar
    рдпрджрд┐ SizeLength + 10 > SizeLengthReal рддрдм
    SizeLengthReal = SizeLengthReal * 2
    ReDim рдкрд░рд┐рд░рдХреНрд╖рдг SizeStream ( SizeLengthReal )
    рдпрджрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ
    SizeLength = SizeLength + 1
    рдмрд┐рдЯрдкреЛрд╕ = реж
    AddChar = 0
    рдпрджрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ

    рдЕрдЧрд░ ( рдХрд░рдЪрд╣рд░ <> рдлреНрд░реАрдЪрд╛рд░реНрдЬ ) рддрдм
    NewStream ( NewLength ) = рдХрд░рдЪрд░
    рдпрджрд┐ NewLength + 10 > NewLengthReal рддрдм
    NewLengthReal = NewLengthReal * 2
    ReDim рд╕рдВрд░рдХреНрд╖рд┐рдд NewStream ( NewLengthReal )
    рдпрджрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ
    NewLength = NewLength + 1
    рдпрджрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ
    рдЕрдВрддрд┐рдо рдХрдЪрд░ = рдХрд░рдЫрд░

    рдЕрдЧрд▓рд╛

    '***
    'рдЕрдЧрд░ AddChar <> 0 рддреЛ
    SizeStream ( SizeLength ) = AddChar
    SizeLength = SizeLength + 1
    'рдПрдВрдб рдЗрдл

    ReDim рд╕рдВрд░рдХреНрд╖рд┐рдд рдмреАрдЯреАрдПрд╕ ( ( SizeLength + NewLength + 4 + 1 + 4 ) )

    рдХреЙрд▓ рдХреЙрдкреАрдореЗрд░реА ( bts ( 0 ) , FreqChar, 1 )
    CallMemory ( bts ( 1 ) , рдЖрдХрд╛рд░, 4 ) рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ
    CallMemory ( bts ( 5 ) , SizeLength, 4 ) рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ
    CallMemory ( bts ( 9 ) , SizeStream ( 0 ) , SizeLength ) рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ
    рдХреЙрд▓ рдХреЙрдкреАрдореЗрд░реА ( bts ( 9 + SizeLength ) , NewStream ( 0 ) , NewLength )

    рдорд┐рдЯрд╛ рдЖрдХрд╛рд░, рдиреНрдпреВрд╕реНрдЯреНрд░реАрдо
  7. рдФрд░ рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреЛ рдХрд┐рд╕реА рднреА рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рд╣рдлрд╝рдореИрди, рдЕрдВрдХрдЧрдгрд┐рдд, рдЬрд╝рд┐рдк) рдХреЗ рд╕рд╛рде рд╕рдВрдХреБрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рд▓рдЬрд╝рдорд╛ рдХреЛ рд╕реЗрдХ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
рдЖрдк рдпрд╣рд╛рдВ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкреНрд░реЗрд╕рд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - http://www.sendspace.com/file/nv2suu

рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбрд┐рдмреНрдмреЗ рдореЗрдВ Jpeg рдХреЛ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА Jpeg2000 рдЬреИрд╕реЗ рдиреБрдХрд╕рд╛рди рдХреЗ рд╕рд╛рде рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рддрд░рдВрдЧ рд╕рдВрдкреАрдбрд╝рди рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рднреА рд╣реЛрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In113668/


All Articles