1. C++ / Говнокод #16996

    +145

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    //bytes 0-13
      bmp.push_back('B'); bmp.push_back('M'); //0: bfType
      bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); //2: bfSize; size not yet known for now, filled in later.
      bmp.push_back(0); bmp.push_back(0); //6: bfReserved1
      bmp.push_back(0); bmp.push_back(0); //8: bfReserved2
      bmp.push_back(54 % 256); bmp.push_back(54 / 256); bmp.push_back(0); bmp.push_back(0); //10: bfOffBits (54 header bytes)
    
      //bytes 14-53
      bmp.push_back(40); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0);  //14: biSize
      bmp.push_back(width % 256); bmp.push_back(width / 256); bmp.push_back(0); bmp.push_back(0); //18: biWidth
      bmp.push_back(height % 256); bmp.push_back(height / 256); bmp.push_back(0); bmp.push_back(0); //22: biHeight
      bmp.push_back(1); bmp.push_back(0); //26: biPlanes
      bmp.push_back(outputChannels * 8); bmp.push_back(0); //28: biBitCount
      bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0);  //30: biCompression
      bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0);  //34: biSizeImage
      bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0);  //38: biXPelsPerMeter
      bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0);  //42: biYPelsPerMeter
      bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0);  //46: biClrUsed
      bmp.push_back(0); bmp.push_back(0); bmp.push_back(0); bmp.push_back(0);  //50: biClrImportant

    Запостил: blackhearted, 30 Октября 2014

    Комментарии (56) RSS

    • байтоёбики
      Ответить
    • >push_back
      Наркоманы скорее. Байтоёбики, да и все остальные, сразу массив заполнят.
      Ответить
      • > все остальные
        Все остальные поюзают какой-нибудь libpng. Кому нужны эти BMP в 2014?
        Ответить
        • По сути libpng (в плане сжатия) являет собой старый-добрый zlib.

          Отчасти непонятно почему не расцвели lossy-only форматы из новых видеокодеков, использующиеся в режиме image (по сути видео из 1-го кадра) тот же x264, который жмёт раза в 2 лучше чем jpeg.
          Пытались-пытались делали вейвлетный JPEG-2000, который на поверку оказался кокашкой, ms сделала jpeg-hr, а гляди и поныне бал правит убогий формат 25 летней давности.
          Ответить
          • А здесь сложный вопрос. jpeg ведь тоже может жать в 2 раза лучше чем jpeg (и даже в 20). Насколько лучше/хуже выглядит фото? Насколько больше/меньше ресурсов жрет кодек? Обидится ли Вася, если не сможет открыть фотки с сиськами Маши?

            > убогий формат 25 летней давности
            Безобразно, зато единообразно.
            Ответить
            • P.S. Есть ли смысл ломать интероперабельность и еще лет 5-10 внедрять новый формат, если всё, что он даст - экономия места на диске в 2 раза и 10 битный цвет? Наверное нет.

              jpeg2000 вроде бы загнулся именно из-за этого, а не из-за технических проблем.
              Ответить
            • > жать в 2 раза лучше чем jpeg
              Это означает при одинаковом визуальном восприятии.

              >jpeg2000 вроде бы загнулся именно из-за этого
              Загнулся из-за патентов блядских на вейвлеты. И в принципе он был не так уж и хорош.
              Ответить
        • Девайс понимает только БМП, только хардкорр...
          И как раз из ПНГ богоугодного конвертится, дорогуша.
          Ответить
          • Забавно. Автор кода смог прикрутить кодек пнг, но не додумался найти аналогичный для бмп?
            Ответить
            • тоесть в кодеке бмп будит типа лудше, я правльно догадался?
              Ответить
              • Будит типа лудше. Там, по крайней мере, все варианты учли, а не захардкодили половину полей.

                P.S. Код из топика справится с рисунком ширины 17 или, к примеру, 31?
                Ответить
        • Не поверишь, но использование бмп цветёт и пахнет.
          Канеша, за границами браузерного дроча с цсс и яваскриптиком и прочего асп. нета с жабастой хуетой.
          Ответить
          • в смысле, это использование уже зацвело и воняет плесенью?
            Ответить
          • я видел, как текст форматировали картинками и хранили их в несжатом виде в формате .bmp, потому что голый WinAPI не умеет другие форматы
            Ответить
            • А голый winapi BMP разве умеет загружать? Емнип, оно только умело blit'ить правильно оформленные структурки, а читать заголовки и данные из файла один хрен приходилось самому...
              Ответить
    • std::vertor<char> bmp(100500, 0);
      bmp[0] = 'B';
      bmp[1] = 'M';
      // ...
      Ответить
      • bmheader.biWidth=324;
            bmheader.biHeight=256;
            bmheader.biPlanes=1;
            bmheader.biSizeImage=324*256;
            bmheader.biBitCount=32;
        Ответить
        • А что, уже можно стандартно вставлять произвольный паддинг в структуры? Для полей можно указывать endianness?
          В байты рано или поздно придётся писать.
          В предположении, что бмп-либы у нас нет, и нормального бинарного энкодера тоже, типичный quick-and-dirty хак.
          Ответить
          • bmheader.biWidth=htons(324);
             bmheader.biHeight=htons(256;
                bmheader.biPlanes=htons(1);
                bmheader.biSizeImage=htons(324*256);
                bmheader.biBitCount=htons(32);

            а код темы- уебанство и реальное говно
            Ответить
            • > htons
              В заголовке BMP big-endian что-ли?
              Ответить
              • или это такой протокол: BMP over TCP:)
                Ответить
              • Короче подставь свою платформозависимую функцию вместо htons.
                Ответить
                • Я ленивый распиздяй, и мне лень в очередной раз велосипедить кодек для BMP (в своё время и чпег мучал, и бмп, наигрался уже с ними)... Поэтому я тупо подключу соответствующую платформонезависимую либу и займусь решением задачи, а не скучной и унылой хуитой по раскладыванию полей в это перевёрнутое вверх-ногами говно мамонта под названием BMP.

                  P.S. Если твой BMP-кодек с первого раза правильно запишет 24-битную картинку с шириной, не кратной 4 - ты очень внимательный и аккуратный программист.
                  Ответить
                  • P.P.S. А если мне вдруг приспичит срочно-быстро-грязно сохранить рисунок - я поюзаю что-нибудь из семейства PPM/PGM. Там кодек пишется буквально за пару минут (т.к. хедер представляет собой всего лишь короткую строчку в духе P6 100 100 255), и никакой байтоёбли.
                    Ответить
                  • > Поэтому я тупо подключу соответствующую платформонезависимую либу и займусь решением задачи, а не скучной и унылой хуитой по раскладыванию полей в это перевёрнутое вверх-ногами говно мамонта под названием BMP.
                    Вот вам плюс, батенька. Бесполезнейшая трата времени.
                    Ответить
                    • > Бесполезнейшая трата времени.
                      Ну в своё время выводить 16 цветную BMP'шку в борманд паскале было интересно (и, наверное, полезно)... С JPEG'ом тоже было очень интересно повозиться - все эти дискретные косинусные преобразования, квантование, хаффмановское кодирование... Покопаться в форматах - это интересно и полезно.

                      Но писать кривожопый велосипед, когда космические корабли бороздят просторы большого театра полно готовых отлаженных либ - это уже моветон.
                      Ответить
                  • Кому вообще в 2014 году придет в голову писать кодировщик для популярного формата картинок?

                    Ну, кроме студента, который изучает для себя чудесный мир байтов.
                    Ответить
                    • > для популярного формата картинок
                      Для популярного в прошлом веке формата картинок.

                      fxd.
                      Ответить
                  • с 1го раза - нет, я долго не понимал, что за синяя хуита случилась с моей картинкой, пока не допёрло
                    Ответить
                  • Вот ведь было время!
                    Ответить
                  • А что делать, если всегда кратно 4?
                    Как тут не начать писать велосипед?
                    Ну вот такая предметная облость, битмап всигда по ширине кратен 4.
                    Ответить
          • Для бмп это явно не актуально, потому что структура уже есть. Насчет паддинга я не понял - чем плох
            uint8_t reserved[60];

            про ендианнес уже ответили. Ну и никто не запрещает однобайтовые поля использовать.
            Ответить
            • > потому что структура уже есть
              В шиндовз.аш? :)
              Ответить
              • Угу. Думаешь засудят если скопипастить?
                Ответить
          • > нормального бинарного энкодера
            Простенький кодек с putByte, putInt и т.п. можно наговнякать минут за 10... Всё лучше, чем байты по одному укладывать.
            Ответить
            • я разве спорю... Сам такой писал
              https://github.com/roman-kashitsyn/encoding-binary
              Ответить
        • Что-то я не сразу догнал, что в <Шindoшs.h> есть готовое апи для этого. Виноват, затупил.
          Ответить
      • std::vertor<char>

        Страдания маленького Ст Вертера.
        Ответить
    • скажите мне что это автогенеренка
      Ответить
      • Говорю, что это автогенерёнка. Код примерно такой:
        std::cout << "bmp.push_back(" << 40 << "); bmp.push_back(" << 0 << "); bmp.push_back(" << 0 << "); bmp.push_back(" << 0 << ");  //" << 14 << ": biSize" << endl;
        ...
        Ответить
    • Такое стремное чувство, что хотел написать похожий код и тут чел в комментарии ниже предлагает анал.
      Ответить
      • Въебал минус по ошибке. Прости пожалуйста.
        Ответить

    Добавить комментарий