Упражнение bmp, что это за файл

Обновлено: 18.05.2024

Тип файла BMP стал настолько популярным, что многие проприетарные изображения, которые вы просматриваете, переименовываются в файлы BMP. Этот тип файла может хранить как монохромные, так и многоцветные данные изображения с глубиной цвета 16, 32 или 64 бита. Большинство растровых изображений несжаты и занимают много места, но их можно сжать без ущерба для качества.

Поэтому важно научиться открывать файл BMP, прежде чем думать об их редактировании или преобразовании в другие форматы. Открытие и просмотр таких файлов не обязательно должно быть большой проблемой, если вы знаете, что делать. Вам нужна подходящая программа для просмотра BMP и эффективный конвертер изображений на случай, если вам потребуется преобразовать их в другие форматы.

Что такое файл BMP?

Вашему устройству не удалось открыть файл BMP? Возможно, вы не сможете устранить проблему без правильного понимания формата файла BMP и того, как открыть файл BMP. Но сначала вам нужно ответить на самый важный вопрос: что такое файл BMP?

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

Как открыть файл BMP

Файл BMP, также известный как файл независимой от устройства растровой графики, не защищен патентами, поэтому многие программы поддерживают его открытие, просмотр и редактирование. Вот полезные способы открытия файлов BMP.

Использование программ, встроенных в Windows или macOS

Вероятно, на вашем устройстве есть несколько растровых изображений, и вы открываете и просматриваете их без необходимости в дополнительном программном обеспечении. Это возможно, потому что ваша ОС поставляется в комплекте с программным обеспечением, которое может открывать и читать файлы BMP. Microsoft Windows Photos и Apple Photos могут открывать изображения в формате файлов BMP для устройств Windows и Mac соответственно.

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

Сторонние приложения

Если по какой-либо причине вы не можете открывать и просматривать файлы BMP с помощью приложения по умолчанию, предоставляемого вашей операционной системой, вы можете вздохнуть спокойно, поскольку доступно множество программ для открытия файлов BMP. Вероятно, у вас уже есть один или два на вашем устройстве, если у вас есть какое-либо графическое приложение от Adobe. Adobe Photoshop, Adobe Illustrator, ACD Systems Canvas и CorelDRAW откроют ваши растровые изображения.

Это программное обеспечение премиум-класса, которое может стоить вам руки и ноги, поэтому, если вы не готовы ослабить свои кошельки, вы можете рассмотреть другие менее дорогие или даже бесплатные приложения, которые также могут выполнять эту работу. Вы можете загрузить и установить GIMP, XnView и IrfanView, которые помогут вам открывать файлы с расширением .bmp. Эти приложения удобны в использовании и не требуют обширных технических навыков.

Простой поиск в Google выдаст сотни сторонних приложений, которые помогут вам открывать, просматривать и редактировать файлы BMP, но вы должны соблюдать осторожность. Интернет изобилует вредоносным программным обеспечением, замаскированным под служебные приложения. Убедитесь, что загружаете все файлы с надежных сайтов, а на вашем компьютере установлена ​​надежная современная антивирусная программа.

Некоторыми безопасными местами для поиска программного обеспечения BMP являются Microsoft, Apple Store и Google Play. Вы можете найти много других безопасных сайтов, но у вас должна быть система безопасности. Кроме того, убедитесь, что приложение, которое вы хотите загрузить, совместимо с вашей системой.

Использование конвертеров изображений

Возможно, ваше устройство по-прежнему не сможет открывать файлы BMP, несмотря на то, что на нем установлено множество программ, совместимых с BMP. Или, в некоторых случаях, вы хотите поделиться фотографиями со своими друзьями, чьи устройства могут быть несовместимы с файлами BMP. В этих случаях требуется преобразовать изображение BMP в формат, который может прочитать ваше устройство. Вам потребуются услуги эффективного конвертера изображений.

В Интернете можно загрузить и установить на свое устройство ряд бесплатных конвертеров изображений. Они могут преобразовать ваш файл BMP в распространенные форматы, такие как PDF, JPG, TIF, ICO, а также PNG. Вы даже можете найти некоторые из них, которые работают прямо из вашего браузера, поэтому вам не нужно устанавливать их на свой компьютер. К таким приложениям относятся Zamzar и FileZigZag.

К популярным конвертерам изображений относятся XnConvert, CoolUtils, Adapter, DVDVideoSoft, PixConverter и SendTo-Convert. Однако этот список не должен ограничивать ваш выбор, поэтому вы можете попробовать как можно больше приложений, пытаясь определить лучшее для ваших нужд преобразования изображений. Но вы должны быть уверены, что загружаемое вами программное обеспечение совместимо с вашим устройством и вашей ОС.

Все еще не открываете файлы BMP?

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

Не хватает вариантов? Конечно, нет. Возможно, вы имеете дело с поврежденным файлом, поэтому лучше просканировать носитель на наличие проблем. Также может быть важно попытаться открыть проблемный файл BMP с другого устройства, и если это не удастся, вы узнаете, что это файл, а не ваша машина. Если вы диагностируете такую ​​проблему, получите свежую копию файла.

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

Атаки вредоносного ПО на вашу систему также могут препятствовать открытию файлов в вашей системе. Известно, что некоторые вредоносные программы нацелены на файлы, повреждая или полностью заменяя их, поэтому при двойном щелчке по ним они не открываются. Чтобы противостоять такой проблеме, всегда имейте под рукой надежный антивирус, гарантирующий его актуальность. Забудьте о тех бесплатных антивирусах, которые утверждают, что защищают ваши устройства одним нажатием кнопки. Пойдите на некоторые жертвы и купите высококачественное антивирусное программное обеспечение — вред, который вы можете понести, если вы этого не сделаете, будет намного больше, чем стоимость хорошей антивирусной программы.

Теперь, когда вы понимаете, как работать с файлами BMP в вашей системе, важно ответить на вопрос: что такое файл BMP? Изучение того, как открывать и просматривать растровые изображения на компьютере, улучшит ваше портфолио, особенно если вы намерены заняться профессиональным производством изображений. Выбор этого пути может потребовать профессионального, но удобного редактора изображений, который поможет вам создавать безупречные фотографии BMP. Вы можете попробовать Picverse Photo Editor Photo Editor, доступный как для Windows, так и для Mac, и сами убедитесь в результатах!

BMP – это простой формат файлов растровых графических изображений, предназначенный для хранения растровых цифровых изображений независимо от устройства отображения, первоначально и главным образом в операционных системах Microsoft Windows и OS/2. Этот формат иногда называют Device-Independent Bitmap (DIB), так как при загрузке в память с помощью программного обеспечения Windows изображение хранится в виде структуры DIB. Несколько обратно совместимых версий были представлены с новыми версиями Windows. По состоянию на конец 2011 года текущей версией BMP является версия 5, представленная в Windows 98 в 1998 году. Это описание касается версии 5, но относится и к более ранним версиям, поскольку структура осталась неизменной для обеспечения обратной совместимости. В статье Википедии о BMP есть таблица, описывающая различия между версиями.

Цитируя часть 1 статьи Дэвида Чарлапа 1995 года в журнале Dr. Dobbs's Journal: «В отличие от других форматов файлов изображений, таких как GIF (формат файла обмена графическими данными CompuServe) и JPEG (Объединенная группа экспертов по фотографии), формат файла BMP не был предназначен для переноски. Вместо этого он был разработан для простой работы с Windows API с использованием тех же структур, которые приложения Windows используют для управления растровыми изображениями в памяти. По мере изменения API менялся и формат файла BMP». BMP используется в основном для значков, снимков экрана и других целей в Windows.

Формат файла BMP версии 5 позволяет хранить двухмерные цифровые изображения произвольной ширины, высоты и разрешения, как монохромные, так и цветные, с различной глубиной цвета (1, 4, 8, 16, 24, 32 или 64 бита). на пиксель). Цвета могут быть проиндексированы. Дополнительные функции включают сжатие (специальные алгоритмы сжатия без потерь, которые быстро распаковываются), альфа-каналы и цветовые профили ICC. На практике большинство изображений BMP несжаты, а изображения 16 и 32 бита всегда несжаты.

Структура файла BMP включает два заголовка. Первый — это 14-байтовый BITMAPFILEHEADER. Здесь указывается тип файла растрового изображения, размер файла и положение (смещение) в файле, где начинаются данные пикселей. Этот заголовок просто позволяет проверить тип файла и его повреждение. Второй заголовок, обычно известный как заголовок DIB, предоставляет техническую информацию, необходимую для визуализации изображения, такую ​​как количество бит на пиксель, высоту и ширину изображения в пикселях, метод сжатия. Второй заголовок будет иметь другое имя, размер и другой набор записываемых элементов в зависимости от версии спецификации. Более поздние версии заголовка DIB добавили новые элементы в конце заголовка. Если указан профиль ICC, заголовок DIB предоставляет указатель на начало информации ICC. Если используется таблица цветов, она находится в конце заголовка DIB.После таблицы цветов, которая является обязательной для глубины цвета 8 или меньше, следуют данные изображения. Наконец, информация о профиле ICC, либо встроенная, либо ссылка на путь к другому файлу.

Местное использование

Опыт LC или существующие активы LC не создает изображения BMP для воспроизведения предметов коллекции или поддержки сохранения коллекции. Однако отдельные изображения BMP могут использоваться как элементы веб-страницы.
предпочтение LC При оцифровке предметов коллекции или приобретении исходно-цифрового графического контента Библиотека Конгресса предпочитает форматы TIFF_6, JPEG 2000, DNG или JPEG. Заявление о рекомендуемых форматах Библиотеки Конгресса (RFS) включает BMP в качестве предпочтительного формата для фотографий в цифровой форме и других графических изображений в цифровой форме. RFS не указывает версию BMP.

Факторы устойчивого развития

Microsoft никогда не публиковала спецификацию для BMP. Информация о структуре и методах кодирования данных была включена в ряд справочников программистов, руководств, интерактивных справочных средств и файлов, связанных с комплектами разработки программного обеспечения Microsoft Windows (SDK). Тем не менее, формат хорошо изучен и подробно описан в разное время способами, которые многие считают более полезными. Многие из этих описаний не относятся к последней версии. По состоянию на июнь 2021 года Microsoft предоставляет информацию через Microsoft Docs. Ниже приведен избранный список источников документации:



До сих пор мы рассматривали только текстовые файлы этого класса, но большинство реальных файлов в файловой системе на самом деле являются двоичными. Это означает, что данные, которые они содержат, не обязательно ограничены буквенно-цифровыми символами, которые вы найдете в текстовом файле и которые вы можете редактировать в текстовом редакторе. Примеры двоичных форматов файлов включают MP3, DOC, JPG и многие другие файлы, которые не ограничиваются необработанным текстом ASCII. В этом упражнении мы увидим, как писать программы на C, способные читать и записывать двоичные файлы. Мы изучим специальный формат файла для данных изображения, называемый BMP, который обычно используется в операционной системе Windows. Большинство веб-браузеров также могут читать и отображать файлы BMP.

Назначение

Напишите программу на C, которая считывает изображение из двоичного BMP-файла на диске, инвертирует все пиксели и сохраняет изображение как новый BMP-файл.

Информация о файлах изображений BMP

Формат файла BMP – один из самых простых форматов, но он по-прежнему имеет сложную поддержку расширений, сжатия и различных цветовых моделей. Чтобы упростить выполнение этого упражнения, мы сосредоточимся исключительно на 24-битных несжатых файлах BMP. Мы предоставили функцию BMP_checkValid(), которая гарантирует, что файл, который вы пытаетесь прочитать, удовлетворяет этим ограничениям. Ваш код должен вызвать BMP_checkValid(), чтобы убедиться, что это так.

Как правило, файлы BMP состоят из 54-байтового заголовка (определенного в файле bmp.h, который мы предоставим в следующем разделе), за которым следуют данные изображения. Заголовок имеет одинаковый формат для всех 24-битных изображений BMP и содержит информацию о размере изображения, его размерах, цветовой модели и так далее. Сразу за заголовком следует большой блок байтов, содержащих значения цвета для изображения, расположенные в виде последовательности строк (другими словами, первые значения относятся к первой строке, затем второй, затем третьей и т. д.). Значения цвета в 24-битном BMP представлены тремя байтами: один для красного (0-255), один для зеленого (0-255) и один для синего (0-255). Эти три байта однозначно представляют определенный цвет для данного конкретного пикселя изображения.

Чтение файла BMP состоит из следующих шагов:

  1. Открыть двоичный файл для чтения
  2. Прочитать 54-байтовый заголовок в память
  3. Проверьте правильность данных в заголовке (используйте BMP_checkValid, заданный в bmp.c)
  4. Выделить место для данных изображения.
  5. Чтение данных изображения (размер файла минус 54 байта заголовка)
  6. Закройте файл

Сохранение файла BMP аналогично:

  1. Открыть двоичный файл для записи
  2. Запишите 54-байтовый заголовок в файл
  3. Запишите данные изображения в файл (опять же, размер файла из заголовка минус 54 байта)
  4. Закройте файл

Скелетный код и тестовые случаи

Загрузите файлы каркаса здесь.

Дополнительные наборы тестов здесь.

НЕ ИЗМЕНЯЙТЕ ex5.c. Однако вы можете временно закомментировать некоторые коды в ex5.c, чтобы проверить функциональность отдельных функций.

Технические характеристики

  1. Вы должны использовать следующий оператор печати, если пользователь не вводит достаточно аргументов командной строки (и выходите с EXIT_FAILURE):
    printf("Использование: ex5 \n");
  2. Вы должны использовать следующий оператор печати, если не можете открыть файл (и выйти с EXIT_FAILURE):
    printf("Невозможно открыть файл!\n");
  3. Вы должны использовать следующий оператор печати, если динамическая память не выделена должным образом (и выйти с EXIT_FAILURE):
    printf("Невозможно выделить память!\n");
  4. Вы должны использовать следующий оператор печати, если входной BMP-файл недействителен (используйте BMP_checkValid) (и выйдите с EXIT_FAILURE):
    printf("BMP-файл недействителен!\n");
  5. Исходный файл (argv[1]) и конечный файл (argv[2]) являются аргументами командной строки.
  6. Ваша программа должна сначала прочитать исходный файл с диска, затем инвертировать все пиксели изображения в памяти, а затем сохранить файл обратно на диск, используя имя целевого файла в качестве нового имени.
  7. Загрузка данных изображения должна выполняться путем чтения остатка содержимого файла (header.size - sizeof(BMP_Header)) с помощью fread. Данные изображения будут идти сразу после данных BMP_Header в файле.
  8. Вы должны использовать функцию PrintBMPHeader(), указанную внутри bmp.c, для печати заголовка.
  9. Ваша функция загрузки BMP не обязательно должна работать для всех файлов .bmp (стандарт BMP допускает сжатие, различную разрядность и цветовые карты). Это нужно только для работы с 24-битными изображениями RGB без цветовой карты. Если вы хотите попробовать это с другими изображениями помимо тех, которые мы предоставляем ниже, убедитесь, что вы сохранили файл .bmp с отключенным RLE (сжатием) и с 24-битным цветовым пространством.
  10. Инвертирование пикселя цвета RGB состоит из считывания байта как "значения" для пикселя и замены его на "255 - значение". Это необходимо сделать для всех компонентов (красный, зеленый, синий) для каждого пикселя.
  11. Сохранение файла BMP аналогично его загрузке. Сначала запишите BMP_Header, который вы загрузили с помощью fwrite, а затем итеративно запишите каждый пиксель с помощью fwrite после заголовка.
  12. Внимание! В Интернете существуют свободно доступные загрузчики и хранители файлов BMP с исходным кодом C. Копирование с них является мошенничеством! Предполагается, что вы сами пишете код, и вам необходимо использовать структуры и функции в наших файлах bmp.h и bmp.c, вы не можете изменять ни один из них.

Предупреждение

Вы не можете использовать что-либо вроде следующего:

Вы должны использовать malloc и бесплатно.

Компиляция и выполнение

Предупреждающие сообщения часто указывают на ошибки. За это задание вы теряете 0,1 балла за каждое предупреждающее сообщение. Команда создаст исполняемый файл с именем «ex5».

Чтобы выполнить эту программу, введите

Второй аргумент (argv[1]) — файл для загрузки, а третий аргумент (argv[2]) — файл для сохранения (будет создан).

Процедура отправки

Создайте zip-файл, содержащий следующие файлы

  • bmp.c
  • bmp.h
  • ex5.c
  • Makefile. Makefile должен создать исполняемый файл "ex5".

Вы можете использовать веб-сайт тестирования курса. Отправьте окончательный исходный код в Blackboard.

Перед отправкой необходимо указать имя пользователя и пароль через Blackboard. Имя пользователя и пароль отличаются от вашей карьерной учетной записи Purdue.

// Кредит: профессор Юнг-Сян Лу и профессор Ченг-Кок Ко создали более ранние задания, на которых основано это задание. Текст из этого задания был скопирован с разрешения.

Обзор

В этом упражнении вы напишете код для чтения, записи и обрезки файлов изображений BMP.

HW14 потребует ваш рабочий код от HW13. Написание идеального, чистого кода для этого задания и его тщательное тестирование значительно облегчат вам жизнь в этом задании, которое будет несколько сложнее, чем это.

Формат файла BMP

Файл BMP имеет следующий формат:

< /tr>
Заголовок 54 байта
Палитра (необязательно) 0 байт (для 24-битных изображений RGB)
Данные изображения размер файла — 54 (для 24-битных изображений RGB)

Обратите внимание, что количество байтов, которое занимает каждое поле, можно получить, разделив число 16 или 32 на 8. Например, поле «тип» занимает 2 байта. Все эти поля являются целыми числами. «uint» означает «беззнаковый», а «int» означает «подписанный». Например, поля «ширина» и «высота» являются целыми числами со знаком. Однако для простоты все BMP-файлы, которые у нас есть, будут содержать только положительные целые числа. Вы можете предположить это в своем коде. Кроме того, мы имеем дело с несжатым форматом BMP (поле сжатия равно 0).

Из-за упаковки, указанной в файле bmp.h, вы должны иметь возможность использовать fread для чтения первых 54 байтов файла BMP и сохранения 54 байтов в структуре BMPHeader.

Среди всех этих полей в структуре BMPHeader вы должны обратить внимание на следующие поля:

< td>размер файла
битколичество бит на пиксель
ширина количество пикселей в строке
высотаколичество строк
размер
imagesizeразмер данных изображения (размер файла - размер заголовка, который равен 54)

О битах, ширине, высоте и размере изображения мы поговорим позже. Вы должны использовать следующую структуру для хранения файла BMP, заголовок для первых 54 байтов данного файла BMP, и данные должны указывать на место, достаточно большое (размер изображения) для хранения данных изображения (информация о цвете каждого пиксель).

Фактически в структуре BMPImage хранится весь BMP-файл.

Теперь давайте более подробно рассмотрим поля bits, width, height и imagesize. Поле битов записывает количество битов, используемых для представления пикселя. В этом упражнении (а также в следующем упражнении и задании) мы имеем дело с файлами BMP только с 24 битами на пиксель или 16 битами на пиксель. Для 24-битного представления 8 бит (1 байт) для RED, 8 бит для GREEN и 8 бит для BLUE. Для 16-битного представления каждый цвет представляется с помощью 5 бит (старший бит не используется). В этом упражнении мы будем использовать только 24-битные файлы BMP для проверки ваших функций. Однако ваш код также должен поддерживать 16-битный формат. (Обратите внимание, что формат заголовка на самом деле более сложен для 16-битного формата. Однако в этом упражнении и следующем упражнении и задании мы для простоты будем использовать один и тот же формат заголовка как для 24-битных, так и для 16-битных файлов BMP. Итак, да, мы злоупотребляем форматом!)

Поле ширины показывает количество пикселей в строке. Следовательно, общее количество байтов, необходимых для представления строки пикселей для 24-битного представления, равно ширине * 3. Однако формат BMP требует, чтобы каждая строка была дополнена в конце, чтобы каждая строка была представлена ​​кратным 4 байтам. данных. Например, если в каждой строке только один пиксель, нам нужен дополнительный байт для заполнения строки. Если в строке два пикселя, 2 дополнительных байта. Если в строке три пикселя, 3 дополнительных байта. Если в строке четыре пикселя, нам не нужно слишком выполнять заполнение. Мы требуем, чтобы вы присвоили значение 0 каждому байту заполнения.

Поле высоты показывает количество строк. Строка 0 — это нижняя часть изображения. Файл организован таким образом, что нижняя строка следует за заголовком, а верхняя строка находится в конце файла. В каждой строке самый левый пиксель имеет более низкий индекс. Следовательно, первый байт данных, т. е. data[0], принадлежит нижнему левому пикселю.

Поле размера изображения равно высоте * количеству данных в строке. Обратите внимание, что количество дат в строке включает отступы в конце каждой строки.

Вы можете визуализировать одномерные данные в виде трехмерного массива, организованного в виде строк пикселей, где каждый пиксель представлен 3 байтами цветов (24-битное представление) или 2 байтами цветов (16-битное представление). представление). Однако из-за заполнения вы не можете легко преобразовать одномерные данные в трехмерный массив. Вместо этого вы можете сначала преобразовать его в двумерный массив, состоящий из строк пикселей. Для каждой строки данных вы можете преобразовать ее в двумерный массив, где первое измерение захватывает пиксели слева направо, а второе измерение — это цвет каждого пикселя (3 байта или 2 байта).

В статье Википедии о формате файлов BMP есть хорошая диаграмма и более подробная информация об этом формате.

Обработка ошибок времени выполнения

В этом задании вам нужно будет обрабатывать ошибки во время выполнения. Это не то же самое, что ошибки в вашем коде. Это проблемы (или особые условия), которые могут возникнуть из-за входных данных от вызывающего объекта функции, которую вы пишете. Например, файл может быть недоступен или поврежден, или malloc(…) может дать сбой и вернуть NULL.

Для целей этого задания стратегия обработки ошибок будет двухсторонней:

  1. Возвращает специальное значение, если операция не удалась. Для функций, которые возвращают FILE* , вы вернете NULL, если операция не удалась.
  2. Возвратить сообщение об ошибке через адресную передачу. Обычно вызывающая сторона передает адрес char* . Если операция выполнена успешно, вызываемый объект ничего с ней не сделает. Однако в случае сбоя вызываемый объект вернет новую строку, выделенную в куче. Ответственность за его освобождение лежит на вызывающем абоненте.

Вы сделаете это для всех функций в этом назначении, которые принимают параметр error .

Вот набросок основного шаблона, который мы описываем:

EXIT_SUCCESS и EXIT_FAILURE — это константы, определенные как 0 и 1 соответственно в файле stdlib.h.Хотя мы пока не использовали их в ECE 264, на самом деле они лучше, чем просто возвращать 0 и 1.

Разминочные упражнения

Это задание включает в себя разминку, которая поможет вам подготовиться. Это составляет 20% от вашей оценки за HW13. Оценка будет относительно легкой, но применяются обычные базовые требования.

  1. Чтение текстового файла
    Создайте функцию, которая считывает содержимое файла и возвращает его в виде строки в куче. Вызывающий отвечает за освобождение этой памяти. Используйте fopen(…) , fread(…) и fclose(…) .
  2. Запись текстового файла
    Создайте функцию, которая записывает заданное содержимое в файл по указанному пути. Используйте fopen(…) , fwrite(…) и fclose(…) .
  3. Записать точку
    Напишите функцию, которая записывает одну точку в файл по указанному пути. Используйте fopen(…) , fwrite(…) и fclose(…) . Для класса Point скопируйте и вставьте следующий тип структуры в свой файл:

Структура файлаwarmup.c описана в таблице Требования ниже. Вы должны написать свой собственный файлwarup.c. При желании вы можете добавить вспомогательные функции.

Отказаться.

Спешите, и вам не нужна практика? Эта разминка предназначена для того, чтобы помочь вам понять, что вам нужно для успешного выполнения оставшейся части задания, а не для того, чтобы не добавить дополнительную работу. Поэтому мы предлагаем вам вариант. Те, кто считает, что практика им не нужна, могут «отказаться». изменив файлwarmup.c так, чтобы он ничего не делал, кроме вывода следующего сообщения точно и выхода:

Если вы это сделаете, ваша оценка за HW13 будет основываться исключительно на оставшейся части этого задания. Если вы оставите Warmup.c незавершенным, если вы не сдадите Warmup.c, или если сообщение, которое он печатает, не совпадает полностью, то вы получите 0 за часть разминки этого задания (20%).

Разработка через тестирование

Используйте разработку через тестирование, чтобы выполнить это задание поэтапно. Не менее 12 этапов должны быть явно отмечены комментариями в main(…) в test_bmp.c. Это будет выглядеть примерно так:

Этот аспект задания будет проверен, но только в той степени, в которой мы сможем сделать это эффективно (то есть, возможно, очень легко). Тем не менее, вы должны серьезно следовать ему ради собственной выгоды.

Помните: ваш код никогда не должен взламываться более чем на 10–15 минут за раз.

bmp.h и тестовые файлы

Мы предоставили файл bmp.h и несколько файлов тестовых изображений. Вы должны использовать наш bmp.h. Чтобы получить их, запустите 264get hw13. Вы можете использовать другие файлы изображений BMP по вашему выбору*, но не все файлы BMP будут работать с этим кодом (например, оттенки серого, другие глубины цвета и т. д.), поэтому вы можете использовать предоставленные файлы для тестирования.

Любые файлы изображений, которые вы отправляете, должны иметь рейтинг G и не должны нарушать какие-либо авторские права (т. е. ваши собственные изображения или изображения, лицензированные по свободной лицензии). Укажите авторство в файле bmp.c в виде комментария, например:

Требования

Во всех функциях, которые принимают FILE* fp , вы можете предположить, что он действителен и открывается в правильном режиме. Однако вы не можете ничего предполагать об объеме данных. Кроме того, вы не можете предполагать, что каждый вызов fread(…) или fwrite(…) будет успешным.

Во всех функциях, которые принимают ошибку char**, вы должны обрабатывать ошибки во время выполнения, как описано в раздел выше (Обработка ошибок времени выполнения).

  • Вернуть изображение как BMPImage в куче.
  • Используйте check_bmp_header(…) для проверки целостности файла.
  • Обработка всех видов ошибок во время выполнения с помощью метода, описанного выше.
    • Это означает, что в случае ошибки установить *error в адрес описательного сообщения в куче и вернуть NULL .
    • Вызывающий объект обязан освободить память для сообщения об ошибке.
    • fopen(…) и fclose(…) не разрешены в bmp.c. (См. таблицу разрешенных функций/символов ниже.)
    • Возвращает значение true тогда и только тогда, когда данный BMPHeader действителен.
    • Заголовок действителен, если ① его магический номер равен 0x4d42, ② данные изображения начинаются сразу после данных заголовка (заголовок -> смещение == BMP HEADER SIZE), ③ заголовок DIB имеет правильный размер (DIB_HEADER_SIZE), ④ есть только одна плоскость изображения, ⑤ нет сжатия ( header->compression == 0 ), ⑥ num_colors и Important_colors равны 0, ⑦ изображение имеет 16 или 24 бита на пиксель, ⑧ поля size и imagesize указаны правильно в относительно битов, ширины и высоты полей или размера файла.
    • Возвращает значение true тогда и только тогда, когда операция прошла успешно.
    • Обрабатывайте ошибки во время выполнения, используя метод, описанный выше.
      • Это означает, что в случае ошибки установить *error на адрес описательного сообщения в куче и вернуть false .
      • Вызывающий объект обязан освободить память для сообщения об ошибке.
      • fopen(…) и fclose(…) не разрешены в bmp.c.(См. таблицу разрешенных функций/символов ниже.)
      • x — это начальный индекс от левого края входного изображения.
      • y — начальный индекс от верхнего края входного изображения.
      • w — ширина нового изображения.
      • h — высота нового изображения.
      • При этом будет создан новый BMPImage, включая BMPHeader, отражающий ширину и высоту (и связанные поля) для нового изображения ( w и h ). Скопируйте данные в пикселях из исходного изображения в данные нового изображения.
      • Обрабатывайте ошибки во время выполнения, используя метод, описанный выше.
        • Это означает, что в случае ошибки установить *error в адрес описательного сообщения в куче и вернуть NULL .
        • Вызывающий объект обязан освободить память для сообщения об ошибке.
        • Поскольку crop_bmp(…) не читает и не записывает никаких файлов, обработка ошибок здесь будет несколько проще.
        • Для этого не требуется никаких аргументов командной строки.
        • Все имена файлов изображений должны быть жестко закодированы в файле test_bmp.c.
        • Файлы должны быть включены в вашу заявку.

        Эта функция не является обязательной. Если он включен, он не будет проверен, но должен возвращать 0 в конце, чтобы избежать проблем с нашим тестером.)

        • Вызывающий объект отвечает за освобождение этой памяти.
        • Используйте fopen(…) , fread(…) и fclose(…) .
        • Используйте fopen(…) , fwrite(…) и fclose(…) .
        • Для класса Point скопируйте и вставьте следующий тип структуры в свой файл:
        • Для этого не требуются malloc(…) или free(…).
        • Используйте fopen(…) , fread(…) и fclose(…) .

        Какой это объем работы?

        Это задание должно иметь ту же сложность, что и HW12. Как обычно… Не полагайтесь на эту оценку. Ваш пробег может варьироваться в любом направлении.

        1. Как я могу просмотреть содержимое BMP напрямую?
          Лучший способ проверить двоичные данные — создать шестнадцатеричный дамп. В bash вы можете ввести xxd myimage.bmp . Так как это, вероятно, будет долго, вы захотите просмотреть в vim. Один из способов сделать это — ввести xxd myimage.bmp | вим - из баш. Другой способ — открыть файл в vim и ввести :%!xxd. (Не сохранять!)

        Предположим, у вас есть следующее крошечное изображение BMP 6x6: . (Да, это действительно только 6 пикселей на 6 пикселей. Не волнуйтесь. Увеличенная версия включена в одну из диаграмм ниже.)

        Чтобы получить шестнадцатеричный дамп прямо в командной строке, вы можете ввести это в bash: Будет удобнее просматривать в vim, поэтому вместо этого мы вводим это из bash. (Не забудьте "-" в конце!) Вот шестнадцатеричный дамп, вы его увидите. Не волнуйтесь, если это выглядит загадочно. Читайте дальше, и вы все поймете.

        Вы можете разбить его на части, используя приведенную выше информацию о формате файла BMP. Вот тот же шестнадцатеричный дамп, на этот раз с некоторыми аннотациями.

        Для этого и других форматов двоичных файлов вы можете понять, какое значение и где находится, просто взглянув на спецификацию и шестнадцатеричный дамп двоичного файла.

        1. Насколько велико это изображение BMP (в пикселях)?
        2. Сколько байтов в файле?
        3. Для заголовка BMP:
          1. Сколько байт это занимает?
          2. Где это на схеме?
          3. Каково его смещение в файле (т. е. количество байтов от начала файла)?
            1. Какого он цвета?
            2. Где данные (3 байта) на диаграмме?
            3. Сколько байтов от начала данных изображения (в пикселях)?
            4. Сколько байтов от начала файла?
            5. Каковы его координаты (x,y)? (Подсказка: см. маленькое представление изображения в правом нижнем углу этой схемы.)

            Помните, что две шестнадцатеричных цифры составляют один байт. Например, 0x12345678 состоит из четырех байтов: 0x12, 0x34, 0x56 и 0x78. Когда мы сохраняем его с прямым порядком байтов, мы сначала сохраняем младший значащий байт (LSB) в файле (или памяти). По этой причине прямой порядок байтов также может называться сначала LSB.

            В этом задании вы копируете байты непосредственно из файла в память и обратно. К счастью для вас, архитектуры x86 и x64, на которых работает большинство компьютеров Linux и Windows, используют прямой порядок байтов для хранения чисел в памяти. Вы могли заметить это при использовании команды x/… в gcc.

            Длинная версия: строка — это просто массив символов, а каждый символ — это просто число. Endian-ness влияет только на то, как хранится одно число, а не на более крупные структуры, такие как массивы или структуры. Кроме того, поскольку на нашей платформе (на самом деле, на всех платформах в силу специального положения стандарта, но я отвлекся) char — это только один байт, то порядок следования байтов не повлияет даже на отдельный символ, потому что он применяется только к порядку байтов в числе, требующем нескольких байтов для хранения в файле или памяти.

            1. (ЛУЧШИЙ) Используйте xxd myfile.БМП | вим - из баш. (Не забудьте поставить "-" в конце!)
            2. Игнорировать 0x0a.
            3. Откройте файл командой vim -b myfile.bmp, а затем используйте :%!xxd для преобразования в шестнадцатеричный дамп. Параметр -b указывает vim открыть его в бинарном режиме, который (среди прочего) отключает новую строку в конце.
            4. В vim откройте файл с помощью :tabe ++binary myfile.bmp, а затем используйте :%!xxd для преобразования в шестнадцатеричный дамп. Это также открывает его в бинарном режиме.
            1. длинное целое _get_file_size(…)
            2. _Color _get_pixel(BMPImage* изображение, int x, int y)
              typedef struct < unsigned char r, g, b; >;
            3. int _get_image_row_size_bytes(BMPHeader* bmp_hdr)
            4. int _get_image_size_bytes(BMPHeader* bmp_hdr)

            Ваш read_file(…) сначала прочитает BMPHeader из файла, используя fread(…) Это похоже на разминку. (Пример, показанный в лекции профессора Куинна, можно найти на странице расписания.)

            На основе информации в объекте BMPHeader вы узнаете, сколько байтов содержится в данных пикселей изображения. При этом вы будете читать массив беззнаковых символов, используя fread(…) .

            Для fread(…) это все, что вам нужно. Вам не нужно много делать с пиксельными данными, за исключением crop_bmp(…) . Однако вам нужно понимать поля в заголовке изображения, чтобы протестировать его.

            Основное внимание в этом задании уделяется тестированию. Чтение и запись изображений не должны вызывать особых затруднений.

            Ваш write_bmp(…) будет очень похож. Он запишет объект BMPHeader, используя fwrite(…), а затем использует fwrite(…) для записи данных пикселей.

            Изображения состоят из маленьких точек, называемых пикселями. Изображения могут храниться различными способами. В этом задании мы сосредоточимся на формате файла BMP и, в частности, на 24-битном цветовом формате. В этом формате каждый пиксель состоит из 3 байтов: красного, зеленого и синего. Эти данные изображения (пиксели) хранятся сразу после заголовка (54 байта).

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

            Каждая строка должна быть кратна 4 байтам. Чтобы убедиться, что это так, в конец каждой строки можно добавить от 0 до 3 байтов заполнения.

            Все это проиллюстрировано на диаграмме (аннотированный вывод xxd) в Q1 выше. Прежде чем продолжить, убедитесь, что вы понимаете диаграмму.

            Читайте также: