Короткий ответ

Строки пикселей BMP могут начинаться снизу или сверху. Изучите знаковую высоту и заголовок, используйте образец с явной ориентацией и проверяйте PNG и JPG, не скрывая ошибку декодера ручным переворотом.

Открыть инструменты

BMP → PNG

Открыть инструмент

Распознать два направления строк BMP

Данные аппаратно-независимого растра Windows не обязательно записаны от видимой верхней строки к нижней. В распространённом варианте BITMAPINFOHEADER положительная высота описывает растр bottom-up: массив пикселей начинается со строки, которая при показе окажется внизу. Отрицательная высота может описывать растр top-down, где первой идёт верхняя строка. Декодер обязан учесть знак и сопоставить порядок хранения с координатами экрана. Если он считает любой массив направленным сверху вниз, результат может оказаться перевёрнутым по вертикали.

Подготовьте источник с однозначной ориентацией: подпишите TOP у верхнего края и BOTTOM у нижнего, поместите асимметричную фигуру только с одной стороны и различите углы цветом. Запишите из заголовка ширину, высоту со знаком, глубину цвета и тип сжатия. Затем откройте исходный BMP в нескольких программах. Если переворачивает только одна, подозревайте её декодер. Если все показывают одинаково, создающее приложение могло записать строки неверно либо связать массив с несоответствующим знаком высоты. Сохраняйте имя и контрольную сумму проверяемого файла. Делайте снимки экранов только как дополнительное свидетельство: они не заменяют исследование байтов исходника и могут уже содержать автоматическую коррекцию просмотрщика.

  • Проверить знак высоты
  • Применить асимметричную мишень
  • Сравнить несколько декодеров BMP

Знак высоты может сообщать направление строк, а не только абсолютное число пикселей.

Отделить порядок строк от других нарушений ориентации

Вертикальный переворот из-за строк отличается от поворота камеры и проблемы Exif Orientation. Не диагностируйте BMP так же, как JPEG. Если текст остаётся читаемым слева направо, но верх и низ поменялись местами, сначала исследуйте порядок строк. Поворот на девяносто градусов, горизонтальное отражение или комбинированное преобразование скорее указывают на программу захвата, более раннюю конвертацию либо дополнительную операцию при отображении.

API захвата экрана и старые приложения иногда копируют DIB из памяти в файл BMP, сопоставляя массиву строк неправильный знак высоты. Смена расширения или ручной переворот готовой картинки маскирует симптом одного экземпляра, но не исправляет производственный путь. Запишите исходную программу, промежуточные действия и конечный конвертер, затем сравните файл после каждого этапа. Если одна и та же мишень даёт исправный и дефектный BMP, сопоставьте их заголовки, смещение данных пикселей и первые строки. Новые имена и хеши исключат случайное сравнение с кэшированной копией. При сбое только на одном компьютере фиксируйте также версию библиотеки, операционную систему и аппаратный путь обработки, чтобы воспроизведение оставалось проверяемым.

  • Отличать переворот от поворота
  • Проследить каждый этап
  • Сравнить исправный и дефектный заголовки

Проверить заполнение строк и смещение пикселей

Строки развёртки BMP могут содержать дополнительные байты для выравнивания. Если декодер переходит к следующей строке на число видимых байтов, а не на полный выровненный размер, обычно возникает диагональный сдвиг, цветные полосы или обрезанные строки, а не чистый вертикальный переворот. Проверьте смещение до массива пикселей, глубину цвета, ширину и формулу количества байтов на строку. Ширины, которые сами не попадают на границу хранения, выявляют такую ошибку лучше удобных кратных размеров.

Палитровые и сжатые разновидности BMP добавляют условия. Успех с одним несжатым 24-битным образцом не доказывает полную совместимость. Если рабочие файлы включают палитры 1, 4 или 8 бит, пиксели 16 или 32 бита, альфа-подобные каналы или сжатие, отдельно испытайте каждый реальный класс. Не угадывайте новые позиции заголовка и не правьте байты на месте. Надёжнее сохранить источник, прочитать его соответствующим реализации декодером и создать стандартный результат. Если симптом меняется при добавлении одного пикселя по ширине, сначала проверьте stride и выравнивание. Такой пограничный тест обычно информативнее десятка образцов с удобно кратными размерами и быстрее локализует неверную формулу строки.

  • Рассчитать выровненный stride
  • Испытать неудобные ширины
  • Охватить реальные глубины и палитры

Диагональный сдвиг и цветные строки чаще говорят об ошибке заполнения или смещения, а не только о направлении строк.

Сравнить PNG и JPG с учётом назначения

Конвертация BMP в PNG создаёт эталон без потерь, удобный для проверки ориентации, резких границ и точных цветов. JPG добавляет потери и не имеет альфа-канала, поэтому хуже подходит для диагностики мелкого текста и крайних пикселей. Сначала проверяйте PNG. Создавайте JPG только при требовании получателя, а качество JPEG, цветовую субдискретизацию и наложение на фон рассматривайте отдельно от порядка строк.

Покажите исходный BMP, PNG и JPG в одинаковом размере и сравните четыре угла, первую и последнюю строки и метки ориентации. Недостаточно убедиться, что картинка стоит прямо: ищите пропущенную линию, сдвиг цвета из-за заполнения и изменение прозрачности. Если конвертер автоматически исправляет противоречивый источник, зафиксируйте это. Другой инструмент может истолковать тот же BMP иначе, даже когда первый результат выглядит верно. Проверяйте как масштаб сто процентов, так и фактический размер показа, чтобы не пропустить однопиксельный дефект. Не сравнивайте только миниатюры: их ресэмплинг способен скрыть крайний ряд и смешать соседние цвета.

  • Взять PNG за эталон
  • Сравнить первую и последнюю строки
  • Записать автоматические исправления

Утвердить представительные BMP от начала до конца

Соберите набор из top-down и bottom-up файлов, нескольких ширин, палитровых изображений и используемых в производстве вариантов 24 или 32 бита. Пропустите каждый через настоящий инструмент BMP в PNG или BMP в JPG. Откройте результаты в целевом приложении и независимом просмотрщике. Подтвердите верх и низ, размеры, цвета, поведение альфа-канала и целостность крайних строк. Используйте новые имена и контрольные суммы, чтобы кэш, синхронизация или CDN не подменили файл старой версией.

Запишите исходные поля заголовка, создающую программу, версию конвертера, параметры вывода и среду испытания. Не чините неудачный производный файл переворотом с перезаписью; вернитесь к источнику и декодируйте его правильно. Для последней практической проверки загрузите в сервис доставки размеченную мишень и настоящее рабочее изображение, скачайте выданные версии и сравните их края. Пакетную обработку начинайте только после того, как каждый необходимый класс прошёл тест и второй просмотрщик подтвердил тот же результат. Сохраните журнал решения рядом с контрольными суммами, чтобы повторная проверка использовала те же условия и точно те же экземпляры файлов.

  • Проверить оба направления
  • Исключить старый кэш
  • Исследовать скачанный результат

До конвертации всей папки должны пройти проверку и ориентационная мишень, и настоящий рабочий BMP.

Главное

  • В распространённых структурах DIB положительная высота может означать порядок снизу вверх, а отрицательная — сверху вниз.
  • Декодер, игнорирующий знак высоты, способен перевернуть изображение по вертикали или дать разные результаты в разных приложениях.
  • Асимметричный размеченный образец и значения заголовка помогают отличить ошибку строк от поворота и сбоя при захвате.
  • После конвертации нужно проверить ориентацию, размеры, цвет, выравнивание и крайние строки в реальной системе-получателе.

Частые вопросы

Почему BMP может хранить нижнюю строку первой?

Традиционная компоновка DIB при положительной высоте может быть bottom-up, а декодер восстанавливает видимый порядок сверху вниз.

Отрицательная высота BMP всегда означает повреждение?

Нет. В поддерживаемых формах заголовка она может намеренно обозначать растр top-down.

Можно ли просто перевернуть результат в редакторе?

Так можно исправить вид одного файла, но несогласованность источника или декодера останется и проявится снова.

Диагональный сдвиг тоже вызван порядком строк?

Чаще он указывает на неверный выровненный размер строки или смещение пикселей, которые проверяют вместе с шириной и глубиной.

Какова последняя проверка конвертации?

Преобразуйте размеченную мишень и реальный BMP, затем сравните ориентацию, крайние строки, размеры и цвет в фактически скачанных файлах.

Источники

  1. Microsoft Learn — Device-Independent Bitmaps
  2. Microsoft Learn — BITMAPINFOHEADER Structure
  3. Microsoft Learn — BMP Format Overview