File size: 4,501 Bytes
01d61b8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
107
108
109
110
111
112
113
#!/usr/bin/env python
# coding: utf-8

# <h1>Table of Contents<span class="tocSkip"></span></h1>
# <div class="toc"><ul class="toc-item"></ul></div>

# Выполнено!

# In[1]:


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import gradio as gr


# In[2]:


header_type = np.dtype([('chunkId', 'a4'), ('chunkSize', 'i'), ('format', 'S4'), ('subchunk1Id', 'S4'), ('subchunk1Size', np.int32),
                   ('audioFormat', np.int16), ('numChannels', np.int16), ('sampleRate', np.int32), ('byteRate', np.int32),
                   ('blockAlign', np.int16), ('bitsPerSample', np.int16), ('subchunk2Id', 'S', 4), ('subchunk2Size', np.int32), 
                   ])


# In[3]:


bmp_header_124 = np.dtype([('type', 'S2'), ('size', np.int32, ), ('reserve', np.int16), ('reserve2', np.int16), ('offset', np.int32),
                     ('bV5Size', 'I'), ('bV5Width', 'i'), ('bV5Height', 'i'), ('bV5Planes', 'H'), ('bV5BitCount', 'H'),
                     ('bV5Compression', 'I'), ('bV5SizeImage', 'I'), ('bV5XPelsPerMeter', 'i'), ('bV5YPelsPerMeter', 'i'),
                      ('bV5ClrUsed', 'I'), ('bV5ClrImportant', 'I'), ('bV5RedMask', 'I'), ('bV5GreenMask', 'I'),
                       ('bV5BlueMask', 'I'), ('bV5AlphaMask', 'I'), ('bV5CSType', 'I'),
                       ('bV5Endpoints', '9i'), ('bV5GammaRed', 'I'), ('bV5GammaGreen', 'I'), ('bV5GammaBlue', 'I'),
                       ('bV5Intent', 'I'), ('bV5ProfileData', 'I'), ('bV5ProfileSize', 'I'), ('bV5Reserved', 'I')])
bmp_header_40 = np.dtype([('type', 'S2'), ('size', np.int32, ), ('reserve', np.int16), ('reserve2', np.int16), ('offset', np.int32),
                     ('bV5Size', 'I'), ('bV5Width', 'i'), ('bV5Height', 'i'), ('bV5Planes', 'H'), ('bV5BitCount', 'H'),
                     ('bV5Compression', 'I'), ('bV5SizeImage', 'I'), ('bV5XPelsPerMeter', 'i'), ('bV5YPelsPerMeter', 'i'),
                      ('bV5ClrUsed', 'I'), ('bV5ClrImportant', 'I')])
bmp_dtypes = {124: bmp_header_124, 40: bmp_header_40}


# In[4]:


filename = r"C:\Users\Ilia\Downloads\DJI.bmp"
def load_bmp(filename):
    if isinstance(filename, str):
        return_data = True
    else:
        filename = filename.name
        return_data = False
    with open(filename, 'rb') as file:
        header_type = np.int16(file.read(15)[14])
        file.seek(0)
        header = np.fromfile(file, dtype = bmp_dtypes[header_type], count = 1)
        byte_count_per_pxl = header['bV5BitCount'][0] // 8
        bmp_colors = np.dtype([('b', np.int32), ('g', np.int32), ('r', np.int32)])
        colors = np.fromfile(file ,dtype = f'{byte_count_per_pxl}B', count = header['bV5SizeImage'][0])
        fig, ax = plt.subplots(1, 1)
        colors[:, [0, 2]] = colors[:, [2, 0]]
        ax.imshow(np.flip(colors[:, :3].reshape((header['bV5Height'][0], header['bV5Width'][0], 3)), axis = 0))
        if return_data:
            return header, colors
        else:
            return gr.update(value = fig, visible = True)
    
    
    
def load_wav(filename):
    if isinstance(filename, str):
        return_data = True
    else:
        filename = filename.name
        return_data = False
    with open(filename, 'rb') as file:
        header = np.fromfile(file, dtype = header_type, count = 1)
        data = np.fromfile(file, dtype = np.int16, count = header['subchunk2Size'][0] // 2)\
                            .reshape(-1, header['numChannels'][0]).T.mean(axis = 0)
        fig, ax = plt.subplots()
        ax.plot(data);
    if return_data:
        return header, data
    else:
        return [gr.update(value = fig, visible = True), gr.update(value = (header[0][7], data), visible = True)];


# In[5]:


with gr.Blocks() as app:
    with gr.Row():
        with gr.Column():
            wav_file = gr.File(label = 'Загрузите WAV файл', file_count = 'single', file_types = ['.wav'])
            wav_btn = gr.Button(value = 'Обработать WAV')
            bmp_file = gr.File(label = 'Загрузите BMP файл', file_count = 'single', file_types = ['.bmp'])
            bmp_btn = gr.Button(value = 'Обработать BMP')
            
        with gr.Column():
            wav_plot = gr.Plot(visible = False)
            audio = gr.Audio(visible = False)
            bmp_plot = gr.Plot(visible = False)
    wav_btn.click(load_wav, inputs = wav_file, outputs = [wav_plot, audio])  
    bmp_btn.click(load_bmp, inputs = bmp_file, outputs = [bmp_plot])


# In[6]:


app.launch(share = True)