Esempio n. 1
0
def dqt(flag, name, popper, print_details=False):
    """
    DQT
    :return:
    """
    DQT = {}
    length = read_bytes(popper, 2)
    content = read_bytes(popper, length - 2, False)
    Pq = (content[0] & 0xf0) >> 4
    Tq = content[0] & 0x0f
    table = content[1:]
    if print_details:
        idx_seg = 1
        idx_seg = print_bytes(length, idx_seg, 2)
        print('\t\t\t\t\t\t\t\t', 'Length = {length}'.format(length=length))
        idx_seg = print_bytes(content[:1], idx_seg)
        print(
            '\t\t\t\t\t\t\t\t', '(Pq,Tq)',
            '高四位Pq为量化表的数据精确度,Pq=0时,Q0~Qn的值为8位,Pq=1时,Qt的值为16位,Tq表示量化表的编号,为0~3。在基本系统中,Pq=0,Tq=0~1,也就是说最多有两个量化表。'
        )
        print('\t\t\t\t\t\t\t\t', '(Pq,Tq)=(%d,%d)' % (Pq, Tq))
        print_bytes(table, idx_seg)
    table = decode_dqt(table, Pq, print_details)

    DQT['flag'] = flag
    DQT['name'] = name
    DQT['length'] = length
    DQT['content'] = content
    DQT['Pq'] = Pq
    DQT['Tq'] = Tq
    DQT['table'] = table
    return DQT
Esempio n. 2
0
def dht(flag, name, popper, print_details=False):
    DHT = {}
    length = read_bytes(popper, 2)
    content = read_bytes(popper, length - 2, False)
    if print_details:
        idx_seg = 1
        idx_seg = print_bytes(length, idx_seg, 2)
        print('\t\t\t\t\t\t\t\t', 'Length = {length}'.format(length=length))
        print_bytes(content, idx_seg)
    TcTh = content[0]
    Tc = (TcTh & 0xf0) >> 4
    Th = TcTh & 0x0f

    cnts = dict(zip(range(1, 17), content[1:17]))

    vals = content[17:]
    vals_cur = 0
    codes = {}
    code_val = 0
    for k in cnts:
        # print(k, cnts[k])
        for cnt in range(cnts[k]):
            # print('\t', (bin(val), k))

            # # codes[code]={len,value}
            # codes[val] = {'len':k,'val':vals[vals_cur]}

            # # codes[(code,len)]=value
            codes[(code_val, k)] = vals[vals_cur]
            vals_cur += 1
            code_val += 1
        code_val <<= 1
        # print()

    DHT['flag'] = flag
    DHT['name'] = name
    DHT['length'] = length
    DHT['Tc'] = Tc
    DHT['Th'] = Th
    DHT['table'] = codes

    if print_details:
        for k in DHT:
            if k == 'table':
                print_huf_codes(DHT['table'], print_details)
            else:
                print('\t\t', '%8s' % k, '\t', DHT[k])

    DHT['content'] = content
    return DHT
Esempio n. 3
0
def app_n(flag, name, popper, print_details=False):
    """
    APP N
    :return:
    """
    APP_N = {}
    length = read_bytes(popper, 2)
    content = read_bytes(popper, length - 2, False)
    if print_details:
        idx_seg = 1
        idx_seg = print_bytes(length, idx_seg, 2)
        print('\t\t\t\t\t\t\t\t', 'Length = {length}'.format(length=length))
        print_bytes(content, idx_seg)
    APP_N['flag'] = flag
    APP_N['name'] = name
    APP_N['length'] = length
    APP_N['content'] = content
    return APP_N
Esempio n. 4
0
def sof_0(flag, name, popper, print_details=False):
    """
    SOF0
    :return:
    """
    SOF0 = {}
    length = read_bytes(popper, 2)
    content = read_bytes(popper, length - 2, False)
    if print_details:
        idx_seg = 1
        idx_seg = print_bytes(length, idx_seg, 2)
        print('\t\t\t\t\t\t\t\t', 'Length = {length}'.format(length=length))
        print_bytes(content, idx_seg)
    P = content[0]
    Y = bytes_2_int(content[1:3])
    X = bytes_2_int(content[3:5])
    Nf = content[5]
    Tqs = []
    for c in range(Nf):
        # 成分编号
        Cn = content[6 + c * 3]
        # 水平垂直采样因子
        HnVn = content[7 + c * 3]
        # 量化表编号
        Tqn = content[8 + c * 3]

        Tqs.append([Cn, HnVn, Tqn])

    SOF0['flag'] = flag
    SOF0['name'] = name
    SOF0['length'] = length
    SOF0['P'] = P
    SOF0['Y'] = Y
    SOF0['X'] = X
    SOF0['Nf'] = Nf
    SOF0['Tqs'] = Tqs
    if print_details:
        print('\tSOF0')
        for k in SOF0:
            print('\t\t', '%8s' % k, '\t', SOF0[k])
    SOF0['content'] = content
    return SOF0
Esempio n. 5
0
def sos(flag, name, popper, print_details=False):
    SOS = {}
    length = read_bytes(popper, 2)
    content = read_bytes(popper, length - 2, False)
    if print_details:
        idx_seg = 1
        idx_seg = print_bytes(length, idx_seg, 2)
        print('\t\t\t\t\t\t\t\t', 'Length = {length}'.format(length=length))
        print_bytes(content, idx_seg)
    Ns = content[0]
    CsTdas = []
    for c in range(Ns):
        Csn = content[1 + c * 2]
        TdnTan = content[2 + c * 2]
        CsTdas.append([Csn, TdnTan])
    Ss = content[7]
    Se = content[8]
    AhAl = content[9]
    Ah = (AhAl & 0xf0) >> 4
    Al = AhAl & 0x0f

    SOS['flag'] = flag
    SOS['name'] = name
    SOS['length'] = length
    SOS['Ns'] = Ns
    SOS['CsTdas'] = CsTdas
    SOS['Ss'] = Ss
    SOS['Se'] = Se
    SOS['Ah'] = Ah
    SOS['Al'] = Al

    if print_details:
        for k in SOS:
            print('\t\t', '%8s' % k, '\t', SOS[k])

    SOS['content'] = content
    return SOS
Esempio n. 6
0
def app_0(flag, name, popper, print_details=False):
    """
    APP 0
    :return:
    """
    length = read_bytes(popper, 2)
    content = read_bytes(popper, length - 2, False)
    if print_details:
        idx_seg = 1
        idx_seg = print_bytes(length, idx_seg, 2)
        print('\t\t\t\t\t\t\t\t', 'Length = {length}'.format(length=length))
        idx_seg = print_bytes(content, idx_seg)

    identifier = bytes_2_int(content[:5])
    version = bytes_2_int(content[5:7])
    units = content[7]
    x_density = bytes_2_int(content[8:10])
    y_density = bytes_2_int(content[10:12])
    x_thumbnail = content[12]
    y_thumbnail = content[13]
    if print_details:
        print('''    {length:#06X}\tLength\t{length}
        {identifier:#012X}\tIdentifier\t{identifier_b}
        {version:#06X}\tVersion
        {units:#04X}\tUnits\t零时表示未指定,为1表示英寸,为2表示厘米
        {x_density:#06X}\tx_density\t{x_density}
        {y_density:#06X}\ty_density\t{y_density}
        {x_thumbnail:#04X}\tx_thumbnail\t{x_thumbnail}
        {y_thumbnail:#04X}\ty_thumbnail\t{y_thumbnail}'''.format(
            length=length,
            identifier=identifier,
            identifier_b=identifier.to_bytes(5, 'big'),
            version=version,
            units=units,
            x_density=x_density,
            y_density=y_density,
            x_thumbnail=x_thumbnail,
            y_thumbnail=y_thumbnail,
        ))
    # remain = length - 16
    # if remain > 0:
    #     remain = read_bytes(remain, False)
    #     print(remain)
    # else:
    #     remain = b''
    remain = content[12:]

    return {
        'flag': flag,
        'name': name,
        'length': length,
        'identifier': identifier,
        'version': version,
        'units': units,
        'x_density': x_density,
        'y_density': y_density,
        'x_thumbnail': x_thumbnail,
        'y_thumbnail': y_thumbnail,
        'data': remain,
        'content': content
    }