Advertisement
Guest User

Untitled

a guest
Nov 28th, 2014
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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 пикселов, к примеру?
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement