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 | } |