SHOW:
|
|
- or go back to the newest paste.
1 | static Size GetSizeBMP(Stream inp) { | |
2 | var b = new byte[24]; | |
3 | inp.Read(b, 0, 24); // ошибка, нужно читать 26 байт, | |
4 | // размер изображения хранится в последних восьми байтах из прочитанных | |
5 | ||
6 | List<int> l = new List<int>(); // зачем нужен этот List? | |
7 | // почему его элементы int? | |
8 | // чтобы потом кастовать обратно в byte? | |
9 | ||
10 | // в лучших традициях китайского быдлокодинга. цикл не судьба применить? | |
11 | l.Add(b[16]); | |
12 | l.Add(b[17]); | |
13 | l.Add(b[18]); | |
14 | l.Add(b[19]); | |
15 | l.Add(b[20]); | |
16 | l.Add(b[21]); | |
17 | l.Add(b[22]); | |
18 | l.Add(b[23]); | |
19 | // или вообще без циклов: | |
20 | // var l = b.Skip(16).Select(x => (int)x).ToList(); // вот вам и лямбда, раз так нужен интовый список | |
21 | // но ведь интовый список не нужен! | |
22 | // var l = b.Skip(16).ToArray(); | |
23 | // но цикла здесь таки будет достаточно. | |
24 | ||
25 | // адский ад в лучших традициях индусского быдлокодинга: числа в строки -> строки в строку -> строка в число. | |
26 | // потом еще удивляются: почему это программы тормозят. | |
27 | var hh = ((byte)l[0]).ToString("X") + ((byte)l[1]).ToString("X") + ((byte)l[3]).ToString("X") + ((byte)l[2]).ToString("X"); | |
28 | var ww = ((byte)l[4]).ToString("X") + ((byte)l[5]).ToString("X") + ((byte)l[7]).ToString("X") + ((byte)l[6]).ToString("X"); | |
29 | // ширина перепутана с высотой | |
30 | // вы вообще это тестировали? | |
31 | - | // пробовали как работает ваша функция с изображением со стороной в 260 пикселов? |
31 | + | // пробовали как работает ваша функция с изображением со стороной в 260 пикселов, к примеру? |
32 | return new Size(int.Parse(ww, System.Globalization.NumberStyles.HexNumber), | |
33 | int.Parse(hh, System.Globalization.NumberStyles.HexNumber)); | |
34 | } | |
35 | ||
36 | // --- исправленный вариант ---- | |
37 | public Size GetSizeBMP(Stream inp) { | |
38 | var b = new byte[26]; | |
39 | inp.Read(b, 0, 26); | |
40 | ||
41 | // Тут бы еще первые два байта проверить, чтобы удостоверится, | |
42 | // что читается именно BMP, а не что-то другое и выдать исключение, или вернуть пустой Size | |
43 | // ... | |
44 | ||
45 | return new Size(BitConverter.ToInt32(b, 18), BitConverter.ToInt32(b, 22)); | |
46 | ||
47 | // хрен с этим BitConverter'ом, ну не знаете, что он есть, да и пофиг. | |
48 | // обыкновенные битовые операции, которые работают вообще мгновенно, | |
49 | // вместо вашего индусского "числа в строки -> строки в строку -> строка в число" не судьба применить? | |
50 | // return new Size( | |
51 | // b[18] | b[19] << 8 | b[20] << 16 | b[21] << 24, | |
52 | // b[22] | b[23] << 8 | b[24] << 16 | b[25] << 24 | |
53 | // ); | |
54 | // выглядит как обыкновенная арифметика, должно быть понятно абсолютно всем программистам. | |
55 | } |