[Powered by Google Translate] [Прохождение - Проблема Set 4] [Zamyla Chan - Гарвардский университет] [Это CS50. - CS50.TV] Хорошо. Привет всем, и добро пожаловать Пошаговое руководство 4. Сегодня наш PSET является криминалистика. Судебная экспертиза является очень весело PSET, что является работа с растровыми файлами чтобы узнать, кто совершил преступление. Тогда мы идем, чтобы изменить размеры некоторых графических файлов, Затем мы также собираемся иметь дело с действительно весело части, которая называется восстановление, , в котором мы в основном передал карту памяти , в котором кто-то случайно удалил все свои файлы, и мы попросили восстановить эти файлы. Но сначала, прежде чем мы получим в PSET, я просто хочу поздравить всех. Мы собираемся в середине этого курса. Викторина 0, позади нас, и мы в pset4, так что по существу, мы на полпути. Мы прошли долгий путь, если вы посмотрите на ваши psets, pset0 и pset1, так поздравить себя о том, и мы собираемся, чтобы попасть в некоторые действительно забавные вещи. Таким образом, наш инструментарий для этого PSET, опять же, вместо того, чтобы Суда ням-й обновление, мы можем просто запустить update50 если вы в версии 17.3 и выше прибора. Так что не забудьте запустить update50 - это намного проще, несколько меньше символов - чтобы убедиться, что вы находитесь на последней версии прибора. Особенно это важно, когда мы update50 начать использовать CS50 проверки. Поэтому убедитесь, что вы делаете это. Для всех разделов для этого PSET, мы будем иметь дело с файлами входы и выходы, файловый ввод / вывод Мы собираемся идти на множество программ, которые имеют дело с массивами указывающих на файлы и тому подобное, поэтому мы хотим убедиться, что мы действительно знакомо и удобно дело с тем, как вход и выход в файлы. В распределении код для этой PSET файл с именем copy.c, и вот что мы собираемся найти будет очень полезным для нас потому что мы собираемся в конечном итоге фактически копируете файл copy.c и просто изменить его немного, чтобы быть в состоянии достичь первые 2 части поставленной задачи. И поэтому то, как я уже говорил, мы имеем дело с растровыми изображениями, а также JPEG. Так на самом деле понимания структуры как эти файлы будут организованы, как мы можем на самом деле переводить 0 и 1 в структурах и то, что мы действительно можем понять и интерпретировать и редактировать, что будет действительно важно, так происходит в JPEG и растровых файлов и понимания структуры из них. Pset4, как обычно, начинается с раздела вопросов. Те, будет иметь дело с файлового ввода / вывода, и вы получите привыкли к этому. Тогда Часть 1 детективный роман, в котором вы дали растровый файл , который выглядит вроде как красные точки на всем протяжении. И то в основном то, что мы собираемся сделать, это взять этот файл и просто изменить его немного в версии, что мы можем читать. По сути, как только мы закончим, мы будем иметь тот же файл, кроме мы сможем увидеть скрытое сообщение скрыто все эти красные точки. Тогда Resize это программа, которая, учитывая файлов , а затем получила название файла, в котором он выводит, а затем присваивается номер, а также, на самом деле, что размер растровой тем, что целое значение. Тогда, наконец, у нас есть Recover PSET. Нам дан карт памяти и затем восстановить все фотографии , которые были случайно удалены, но, как мы узнаем, на самом деле не удаляется и удаляется из файла; мы только отчасти потеряла, где они были в файле, но мы собираемся восстановить это. Великий. Так происходит в файл I / O в частности, это целый список функций, которые вы будете использовать. Вы уже видели немного основы Еореп, FREAD, и FWRITE, но мы собираемся смотреть дальше в некотором файле ввода / вывода функций, таких как fputc, , в котором вы просто написать один символ за один раз, в FSEEK, где вы вроде переместить индикатор позиции файла вперед и назад, и некоторые другие. Но мы будем идти в этом немного позже, во время PSET. Итак, сначала просто попасть в файле ввода / вывода, прежде чем идти в PSET, , чтобы открыть файл, например, то, что вы должны сделать, это на самом деле установить указатель на файл. Поэтому у нас есть указатель на файл *. В этом случае, я звоню его в указатель, потому что это будет мой INFILE. И поэтому я собираюсь использовать функцию Еореп, а затем имя файла , а затем режим, в котором я буду иметь дело с файлом. Так что "R" в данном случае для чтения, "w" для записи, а затем "" для добавления. Например, когда вы имеете дело с входной_файл и все, что вам нужно сделать, это прочитать биты и байты, хранящиеся там, то вы, вероятно, захотите использовать "Г" в качестве режима. Если вы хотите на самом деле писать, отчасти сделать новый файл, то, что мы собираемся сделать, это мы собираемся открыть новый файл и использовать "W" режим записи. Итак, когда вы на самом деле чтение в файлах, структура выглядит следующим образом. Прежде всего, включать указатель на структуру, которая будет содержать байт, которые вы читаете. Так что это будет в конце расположение байт, которые вы читаете. Вы тогда собираетесь указать размер, как и в основном, сколько байтов Ваша программа должна читать в файл, размером в основном один элемент, и тогда вы будете указывать, сколько элементов вы хотите читать. И, наконец, вы должны знать, где вы читаете с, так что это будет вашей в указатель. Я цветом, потому что эти FREAD также очень похож на FWRITE, кроме вас, хотите, чтобы убедиться, что вы используете правильный заказ, Убедитесь, что вы на самом деле запись или чтение с правой файл. Таким образом, то, как и прежде, если у нас есть размер элемента, а также ряд элементов, то мы можем поиграть здесь немного. Скажем, у меня есть собака, структура и так, то я хочу прочитать двух собак одновременно. Что я могу сделать, это сказать размер одного элемента будет размер одной собаки и я собираюсь на самом деле читать два из них. Кроме того, что я мог сделать, это сказать, что я только собираюсь читать один элемент и что один элемент будет размером две собаки. Так вот аналогичная, как вы можете видов поиграть с размером и количеством в зависимости от того, что более интуитивно понятным для вас. Хорошо. Итак, теперь мы получим в письменном виде файлов. Если вы хотите записать файл, первый аргумент на самом деле, где вы читаете с. Так что в основном данные, которые вы собираетесь писать в файл, , который является из указателя в конце. Так что, когда вы имеете дело с PSET, убедитесь, что вы не запутались. Может быть, есть определение бок о бок. Вы можете вытащить определений в руководстве, введя мужчину, а затем FWRITE, например, в терминале, или вы можете обратиться к этому слайду и убедитесь, что вы используете правильный. Итак, еще раз, для FWRITE, когда у вас есть файл, который вы хотите записать в, что это будет последний аргумент, и что это будет указатель на этот файл. Итак вот как мы имеем дело с написанием, возможно, несколько байт в то время, но говорят, что вы просто хотите написать всего одну характера. Как мы увидим позже в этом, например, в растровые изображения мы должны его использовать. Вот тогда мы можем использовать fputc, по существу, просто положив один символ за раз, CHR, в указатель, и это наш из указателей нет. Так вот, когда мы стремимся или писать в файл, Файл отслеживать, где мы находимся. Так что это своего рода курсора, индикатор позиции файла. И поэтому, когда мы писать или читать снова в файл, файл на самом деле не помнит, где она есть, и так продолжается от того, где находится курсор. Это может быть полезно, если вы хотите, скажем, читать в определенном количестве, чтобы сделать что-то , а затем прочитать в следующем размере, но иногда мы могли бы вернуться назад или фактически начать с некоторого значения ссылки. Таким образом, то функция FSEEK, что он делает, это позволяет нам двигаться курсор в определенный файл определенное количество байт. И то, что мы должны сделать, это указать, где ссылки значение. Так что либо она движется вперед или назад от того, где в настоящее время находится курсор, или мы можем указать, что он просто должен двигаться в от начала файла или в конце файла. И поэтому вы можете передать в отрицательных или положительных значений к сумме, и что будет вид перемещения курсора вперед или назад. Прежде чем мы перейдем в другой psets, любые вопросы о файле I / O? Хорошо. Как мы углубимся в примеры, не стесняйтесь, чтобы остановить меня вопросы. Таким образом, в детективный роман, вы передали файл изображения похожи на эту красную на слайде, и, похоже, это - букет из красных точек - и вы действительно не знаю, что там написано. Если у вас косоглазие, Вы можете быть в состоянии видеть легким голубоватым цветом в центре. По существу, это когда текст будет сохранен. Существовал убийство, которое произошло, и мы должны выяснить, кто это сделал. Для того чтобы сделать это, мы должны вида преобразовать это изображение в удобном для чтения формате. Если вы, ребята, никогда не сталкивались с этим, иногда было бы мало наборы где вы бы увеличительное стекло с красной пленкой. Любой? Да. Таким образом, вы бы руками что-то вроде этого, вы бы увеличительным стеклом с красным фильм по ней, вы бы поставить его над изображением, , и вы сможете увидеть сообщение скрыто в нем. Мы не имеем увеличительное стекло с красной пленкой, так что вместо этого мы собираемся виды создать наш собственный В этом PSET. И поэтому пользователь будет вводить детективный роман, то ключ,. BMP, так что это INFILE, что это красная точка сообщения, а потом они говорят verdict.bmp будет наш выходной файл. Таким образом, он собирается создать новую растровых изображений похожий на ключ один кроме как в удобном для чтения формате, где мы можем увидеть скрытое сообщение. Поскольку мы собираемся иметь дело с редактирования и работы с растровыми изображениями какой-то, мы собираемся вида погружения в в структуре этих растровых файлов. Мы пошли на это немного в лекции, но давайте посмотрим на них еще немного. Растровые изображения, по существу только расположение байтов где мы указали, какие байты означает, что. Так вот вроде как карту растровых изображений говорят, что она начинается с некоторого файлы заголовков, начинает с некоторой информацией в там. Вы видите, что около Байт номер 14 размер указывается в растровые изображения, и это продолжается. Но то, что мы действительно заинтересованы в здесь, начиная примерно с байта номер 54. У нас есть эти RGB троек. То, что это собирается сделать, это содержать фактические пикселей, цвет значения. Все, что выше, что в заголовке некоторую информацию соответствующего размера изображения, ширину изображения, а высота. Когда мы идем в заполнение позже, мы увидим, почему размер изображения может отличаться от ширины или высоты. Итак, чтобы представить эти - эти растровые изображения представляют собой последовательности байтов - что мы можем сделать, это сказать хорошо, я буду помнить, что в индексе 14, вот где размер, например, но вместо того, что мы собираемся сделать, чтобы сделать это проще будет описать его структуру. И так у нас есть две структуры сделали для нас, BITMAPFILEHEADER и BITMAPINFOHEADER, и поэтому, когда мы читаем в этот файл, по умолчанию он собирается идти в порядке, и так, чтобы она также собирается заполнить в таких переменных, как biWidth и biSize. И, наконец, каждый пиксель представлен тремя байтами. Во-первых, это количество синего в пиксель, второй это количество зеленых, И, наконец, количество красного, где 0 это практически не синий или зеленый или нет ни одной красной , а затем и далее является максимальным значением. Эти шестнадцатеричные значения. Итак, если мы имеем ff0000, то, что соответствует максимальным количеством синего и то не зеленые и не красные, так то, что даст нам сине пикселей. Тогда, если у нас есть все ф.ф. по всем направлениям, то это означает, что у нас есть белый пиксель. Это своего рода противоположность Обычно, когда мы говорим RGB. Это на самом деле происходит BGR. Поэтому, если мы на самом деле выглядят в пример растрового изображения - позвольте мне вытащить один здесь. Это немного мал. Я масштабирования, и мы видим, что это нечетко. Похоже, блоки цвета. У вас есть белые блоки, а затем красные блоки. Если вы играете в Microsoft Paint, например, вы могли бы сделать что-то вроде этого на основном только живопись определенные квадраты в определенном порядке. Итак, что это означает в растровых заключается в следующем. Здесь мы имеем первые белые пиксели, что все 6 являются F, а затем у нас есть красные пиксели, указано 0000ff. И так последовательность байт, что мы имеем показывает, как растровые изображения будет выглядеть. Так что я сделал здесь просто написано все эти байты, а затем окрашены в красный так что вы можете видеть вид, если вы косоглазие немного, как этот вид указывает на улыбающееся лицо. Таким образом, чтобы работа растрового изображения, я себе это в основном в виде сетки. И так по умолчанию, каждая строка в таблице должна быть кратной 4 байт. Если мы посмотрим на растровые изображения, вы заполнения каждого значения. Например, у вас может быть красным здесь, здесь зеленая, синяя здесь, но вы должны убедиться, что изображение заполняется несколькими из четырех байтов. Так что если я хочу, чтобы мой образ, чтобы быть в трех кварталах широкий, то я должен был бы положить пустые значения В последней, чтобы сделать его кратным четырем. Так вот я хотел бы добавить в то, что мы называем обивка. Я просто хочу, чтобы указать, что там с х. Сейчас говорят, что мы хотим изображение, которое находится в 7 пикселей длиной, например. У нас есть 1, 2, 3, 4, 5, 6, 7, и все это заполняется цветом. Таким образом, что растровые изображения работаем, что нам нужно 8-й. Сейчас у нас есть 1, 2, 3, 4, 5, 6, 7. Нам нужно 8 ячеек для растрового изображения правильно читать. Итак, что мы должны сделать, это добавить в только немного обивка чтобы убедиться, что все ширины равномерное и что все ширины кратной 4. И вот я уже отмечалось ранее, заполнение в виде х или волнистая линия, но в реальной растровых изображений обивка указывается шестнадцатеричный 0. Так что был бы один символ, 0. Что может пригодиться, является XXD команды. Что он делает на самом деле показывает, как подобное тому, что я делал раньше с смайлик Когда я на самом деле распечатать то, что каждый цвет будет на пиксель , а затем цветом его, когда вы запускаете XXD с помощью следующих команд, то оно будет на самом деле распечатать то, что цвета для тех, кто пикселей. То, что вы должны сделать, это здесь я указываю, как-S 54 говорит, что я собираюсь начать на 54-м байте потому что до этого, помните, если мы оглянемся на карте растровых изображений, Вот и все заголовки и тому подобное. Но то, что мы действительно заботимся о том, фактические пикселей, которые указывают на цвет. Таким образом, добавив в этот флаг,-ы 54, то мы можем увидеть значения цвета. И не беспокойтесь о сложных флагами и тому подобное. В спецификации поставленной задачи, вы будете иметь указания, как использовать XXD для отображения пикселей. Так что если вы видите здесь, это отчасти выглядит как зеленое поле, эта маленькая вещь. Я цветом 00ff00 в основном говорят не синий, много зеленого, а не красного цвета. Так что соответствует зеленый цвет. Как вы видите здесь, мы видим зеленый прямоугольник. Этот зеленый прямоугольник находится всего в 3 пикселей в ширину, так что то, что мы должны сделать, чтобы убедиться, что изображение делится на 4 широк добавить в дополнительных накладок. И так, то это, как вы видите эти 0s здесь. Это на самом деле будет результат вашей Resize PSET, по существу принимая небольшие растровые, а затем увеличивая его на 4. И что же мы видим, что на самом деле это изображение находится в 12 пикселей в ширину, но 12 является кратным 4, и поэтому мы на самом деле не вижу никакой 0s в конце, потому что не нужно добавлять потому что он полностью заполняется. Он не имеет больше места. Хорошо. Любые вопросы о обивка? Хорошо. Cool. Как я упоминал ранее, растровые изображения просто последовательность байтов. И то, что у нас есть, вместо того, чтобы отслеживать, какие именно числа байт соответствует определенному элементу, мы фактически создали структуру для представления этого. Итак, что мы имеем RGBTRIPLE структуры. Всякий раз, когда у вас есть экземпляр RGB тройки, потому что это типа определяют структуру, то вы можете получить доступ к rgbtBlue переменной, Аналогично зеленый и красный переменных, в котором будет указано, сколько синего, зеленого и красного, соответственно, у вас есть. Так что, если у нас есть синяя набор переменных 0, зеленые установлено далее, , что является максимальным значением вы можете иметь, а затем красный переменная установлена ​​в 0, Затем, какого цвета будет эта тройка RGB представляют? >> [Студент] Green. Зеленый. Именно так. Это будет полезно знать, что всякий раз, когда у вас есть экземпляр RGB тройки, Вы можете фактически получить доступ количество цветов - синий, зеленый и красный - отдельно. Теперь, когда мы говорили о структуре, давайте взглянем на файл BMP. Эти структуры для вас. Здесь мы имеем BITMAPFILEHEADER структуры. Интересным является тот размер. Позже, у нас есть информация заголовка, который имеет несколько вещей, которые интересны для нас, а именно: размер, ширину и высоту. Как мы пойдем в позже, когда вы читаете в в файл, он автоматически считывает, потому что мы создали, чтобы быть то же самое. Так biSize будет содержать право байт, которые соответствуют фактическим размером изображения. А то вот, наконец, как мы уже говорили, у нас есть RGBTRIPLE ЬурейеЕ структуры. У нас есть rgbtBlue, зеленый и красный, связанных с ним. Великий. Хорошо. Теперь, когда мы понимаем, растровые изображения немного, понимаем, что у нас есть файл заголовка и информация заголовков, связанных с ним, а затем после этого, у нас есть интересные вещи цветов, и эти цвета представлены RGBTRIPLE структуры, а те, в свою очередь, есть три значения, связанные с синего, зеленого и красного. Итак, теперь мы можем вид думаете о Восстановление немного. Извините. Подумайте о том, детективный роман. Когда у нас есть ключ файл, то, что мы хотим сделать, это прочитать в ее пиксель за пикселем а то как-то изменить те пиксели, так что мы можем вывести его в удобном для чтения формате. И так, чтобы вывести его, мы собираемся написать пиксель за пикселем в verdict.bmp файл. Это отчасти многое сделать. Мы понимаем, что. Итак, что мы сделали, мы фактически предоставил вам copy.c. Что copy.c делает, это просто делает точную копию данного растровый файл, а затем выводит его. Таким образом, это уже открывает файл для вас, говорится в пиксель за пикселем, а затем записывает его в в выходной файл. Давайте посмотрим на это. Это обеспечение надлежащего использования, получение файлов здесь. Что это делает он задает входной файл, то, что мы прошли в России в входной_файл здесь, которая является нашим вторым аргументом командной строки. Проверок, чтобы убедиться, что мы можем открыть файл. Проверяет, чтобы убедиться, что мы можем сделать новый выходной файл здесь. Затем, что она делает здесь, это только в основном начинает читать, чтобы растровый файл с самого начала. В начале, как мы знаем, содержит BITMAPFILEHEADER, и поэтому эти последовательности битов будет напрямую заполнить BITMAPFILEHEADER. Итак, что мы имеем здесь говорят, что BITMAPFILEHEADER BF - Это наша новая переменная типа BITMAPFILEHEADER - мы собираемся положить внутрь BF то, что мы читаем в указатель, который является нашим INFILE. Сколько мы читаем? Мы читаем в сколько байт мы должны содержаться все BITMAPFILEHEADER. Кроме того, это то, что мы делаем для информации заголовка. Таким образом, мы продолжаем вдоль нашего файла в INFILE, и мы читаем эти биты и байты, и мы подключить их непосредственно в в этих случаях переменные, которые мы делаем. Здесь мы только убедившись, что растрового изображения растрового изображения. Теперь у нас есть выходной файл, верно? Так как он стоит, когда мы создаем, это по сути пустой. Таким образом, мы в основном создаем новый растровый с нуля. Что мы делаем это, мы должны убедиться, что мы копируем в заголовке файла и информационный заголовок так же, как входной_файл имеет. Что мы делаем это мы пишем - и помните, что БФ переменную тип BITMAPFILEHEADER, так что мы делаем, мы просто используем, что содержание для записи в выходной файл. Вот, помню, мы говорили о обивка, , как это важно, чтобы убедиться, что количество пикселей, которое у нас есть, кратного 4. Это очень полезная формула для расчета, сколько у вас есть обивка с учетом ширины вашего файла. Я хочу вас, ребята, помните, что в copy.c у нас есть формула для расчета заполнения. Хорошо? Так что все это помню. Великий. Итак, что делает следующий copy.c он перебирает все Scanlines. Он проходит через строки, а затем хранит каждая тройка, что он читает а затем записывает его в выходной файл. Таким образом, то здесь мы читаем только один RGB тройные в то время, , а затем положить в тот же тройку в выходной файл. Хитрость в том, что обивка не RGB тройки, и поэтому мы не можем просто читать, что обивка количество троек RGB. Что мы должны сделать, это на самом деле просто переместить наши позиции в файле индикатор, передвигать курсор, в виде пропустить все отступы, так что мы на следующей строке. А то, что это делает копию показывает вам, как вы можете добавить обивка. Итак, мы подсчитали, сколько обивка нам нужно, так что это означает, что мы должны обивка количество 0s. Что это делает цикл, который ставит обивка количество 0s в нашей выходной_файл. И, наконец, вы закрываете оба файла. Вы закрываете INFILE, а также выходной_файл. Так вот, как copy.c работ, и это будет очень полезно. Вместо того чтобы просто на самом деле прямого копирования и вставки или просто глядя на него, и набрав в то, что вы хотите, Вы можете просто хочу, чтобы выполнить эту команду в терминале, ср copy.c whodunit.c, который создаст новый файл, whodunit.c, , который содержит те же содержания, как копирование делает. Итак, что мы можем сделать, это использовать его в качестве основы, на которой строится и редактировать для наших детективный роман файл. Это наши с-DOS, чтобы сделать для детективный роман, но то, что делает copy.c на самом деле заботится о большинстве из них для нас. Так что все мы должны сделать, это изменить следующий пикселей по мере необходимости на самом деле сделать файл для чтения. Помните, что для данного пиксела тройной, так что для данной переменной типа RGBTRIPLE, Вы можете получить доступ синие, зеленые и красные значения. Это собирается пригодятся, потому что, если вы можете получить к ним доступ, это означает, что вы также можете проверить их, и это означает, что вы также можете изменить их. Поэтому, когда мы вернулись в наш красно например увеличительное стекло, В основном, это действует как своего рода фильтр для нас. Итак, что мы хотим сделать, это мы хотим, чтобы фильтровать все из троек, которые входя Есть несколько различных способов сделать это. В принципе, вы можете иметь любой тип фильтра Вы хотите. Может быть, вы хотите изменить все красные пиксели или, может быть, вы хотите изменить другого цвета пикселя на другой цвет. Это зависит от вас. Помните, что вы можете проверить, какой цвет пикселя а затем вы можете изменить его, как вы проходите. Хорошо. Так вот детективный роман. Как только вы запустите детективный роман, вы будете знать, кто виновник преступления был. Теперь мы собираемся идти изменить. Мы будем еще иметь дело с растровыми изображениями. То, что мы собираемся делать это мы будем иметь входные растровые а потом мы собираемся пройти в ряд, а затем получить выходной файл растрового где это в основном наши входной_файл масштабируется с. Скажем мой файл был только один пиксель большой. Тогда, если моя п было 3 года, масштабирование на 3, то я хотел бы повторить, что пиксель п число раз, так 3 раза, а затем и уменьшите его 3 раза, а также. Таким образом, вы видите, что я его масштабирования по вертикали, и по горизонтали. А то вот пример. Если у вас есть п = 2, вы увидите, что первый синих пикселей там повторяется два раза горизонтально, так и вертикально в два раза. А то, что продолжается, и поэтому у вас есть прямое масштабирование исходного изображения на два. Так вот, если бы мы подробно псевдокод для этого, мы хотим открыть файл. А потом, зная, что если мы вернемся сюда, мы видим, что ширина выходной файл будет отличаться от ширины INFILE. Что это значит? Это означает, что наша информация заголовка изменится. И то, что мы хотим сделать, это обновить информацию заголовка, зная, что когда мы читаем в файлы, если вы работаете на copy.c рамки, у нас уже есть переменная, которая указывает, какой размер и тому подобные вещи. Поэтому, как только у вас есть, что то, что вы можете сделать, это изменить эти конкретные переменные. Помните, если у вас есть структура, как получить доступ к переменным в этом. Вы можете использовать оператор точки, правильно? Таким образом, то, используя это, вы знаете, что вам нужно изменить заголовок информации. Итак, вот только список фактических элементов, которые будут изменения в вашем файле. Размер файла будет меняться, изображения, а также ширины и высоты. Так вот возвращаясь к карте растровых изображений, смотреть на ли это заголовок файла или информация заголовок, содержащий эту информацию , а затем изменить при необходимости. Опять же, говорят CP copy.c Изменение размера. Это означает, что теперь Изменение размера содержит все, что содержится внутри копию потому что копия дает нам способ чтения, чтобы каждая строка пиксель за пикселем. Только теперь, вместо того, чтобы просто изменяя значения, как мы это делали в детективный роман, то, что мы хотим сделать, это мы хотим написать в несколько пикселей тех пор, как наша п больше 1. Тогда то, что мы хотим сделать, это мы хотим, чтобы растянуть его по горизонтали на п, а также растянуть его по вертикали на п. Как мы можем это сделать? Скажите ваше п 2 и у вас есть эта данного INFILE. Курсор начнет в первом, и что вы хотите делать, если п 2, вы хотите распечатать в 2-х из них. Так что вы печатаете в 2 из них. Тогда ваш курсор будет переходить к следующему пикселя, который является красный, и это будет распечатать 2 из тех красных, добавляя его на то, что он делал раньше. Затем курсор перемещается к следующему пикселей и сделать в 2-х из них. Если вы посмотрите на copy.c рамки, что она делает здесь оно создает новый экземпляр RGB тройка, новая переменная называется тройка. А вот когда он читает в ней, он читает из INFILE 1 RGBTRIPLE и сохраняет его внутри, что тройная переменной. И тогда у вас действительно есть переменная, представляющая конкретного пикселя. Затем, когда вы пишете, что вы можете сделать, это закрывать FWRITE заявление в цикл , который записывает его в свои выходной_файл столько раз, сколько необходимо. Это достаточно просто. Просто в основном, повторяют процесс написания п число раз масштабировать его по горизонтали. Но тогда мы должны помнить, что наши обивка будет меняться. Раньше, скажем, у нас было что-то длины 3. Тогда мы просто добавим в том, сколько обивка? Еще один, чтобы сделать его кратным 4. Но сказать, что мы масштабирования данного изображения, п = 2. Итак, сколько синих пикселей бы мы в конце? Мы бы 6. 1, 2, 3, 4, 5, 6. Хорошо. 6 не кратно 4. Что ближайшего числа, кратного 4? Это будет 8. Таким образом, мы фактически будем иметь 2 символа обивка там. Кто-нибудь помнит, если у нас есть формула для расчета обивка и где это может быть? [Неразборчиво ответ студента] >> Да, copy.c. Право. Существует формула в copy.c посчитать, сколько у вас есть обивка данной конкретной ширине растровых изображений. Итак, что это будет полезно, когда нужно добавить определенное количество обивка на самом деле выяснить, сколько обивка вам нужно добавить. Но, обратите внимание, однако, то, что вы хотите, чтобы убедиться, что вы используете правильный размер. Только будьте осторожны, потому что вы в основном будем иметь дело с двумя растровых изображений. Вы хотите, чтобы убедиться, что вы используете правильный. Когда вы расчете обивка для выходного файла, который вы хотите использовать ширину выходной_файл , а не ширины предыдущего. Великий. Такое заботится о растяжении целом растрового изображения по горизонтали. Но то, что мы хотим сделать, на самом деле растянуть его как вертикально, так. Это будет немного сложнее, потому что когда мы закончили копирование строк и писать эту строку, наш курсор будет в конце. Таким образом, если мы читаем снова, то она просто будет читать в следующей строке. Итак, что мы хотим сделать, это вид найти способ копирования этих строк снова или просто вид, что принимает строку, а затем переписывать его заново. Как я вроде упоминал, существует несколько различных способов сделать это. Что вы можете сделать, это, как вы проходите через чтение и особенно Scanline и изменяя ее по мере необходимости, то вид магазина все эти пиксели в массиве. Тогда в дальнейшем вы знаете, что вам нужно распечатать этот массив снова, и поэтому вы можете просто использовать этот массив, чтобы сделать это. Еще один способ сделать это можно скопировать на одну строку вниз, понимаю, что вам необходимо скопировать это снова, так на самом деле, наведите курсор, и это будет методом FSEEK. Вы можете переместить курсор все пути назад и повторите процесс копирования снова. Так что, если наша масштабирования числа п, то сколько раз мы должны вернуться и переписать линию? >> [Студент] п - 1. >> Да, совершенно. п - 1. Мы сделали это один раз уже, так что потом мы хотим повторить процесс возвращения п - 1 количество раз. Хорошо. Так что у вас есть функции изменения размера. Теперь мы можем попасть в очень интересное, мой любимый PSET, который является восстановление. Вместо того, растровые изображения, на этот раз мы имеем дело с JPEG. Мы фактически не дал свой файл, просто из JPEG, нам дают в основном сырой формат карт памяти. И поэтому она содержит немного информации и мусора значения в начале, а затем он начинает и имеет кучу файлов JPEG. Тем не менее, мы вручили карту, где мы удалили фотографии; по сути, мы забыли, где фотографии находятся в пределах карты. Так вот наша задача в Восстановление должен пройти через эту карту формата и найти эти фотографии еще раз. К счастью, структура файлов JPEG и картотеки немного полезным. Это, безусловно, могло бы быть немного сложнее, если бы не было в данном формате. Каждый файл JPEG на самом деле начинается с двух возможных последовательностей, перечисленных выше. В основном, когда у вас есть новый файл JPEG, она начинается либо с последовательностью FFD8 ffe0 или другой, FFD8 ffe1. Другая полезная вещь, чтобы знать, что изображения в формате JPEG хранятся непрерывно. Поэтому, когда один файл JPEG заканчивается, а другой начинается. Так что это не любые промежуточные значения там. Когда вы доберетесь до начала JPEG, если вы уже читали JPEG, Вы знаете, что вы попали в конец предыдущего и начало следующего. Для вида визуализировать это, я сделал схему. Еще одна вещь, о формате JPEG, что мы можем читать их в последовательности 512 байт за один раз, Аналогично с началом карт. Мы не нужно проверять каждый байт, потому что это отстой. Поэтому вместо того, что мы можем сделать на самом деле только что прочитал в 512 байт, в то время, , а затем, вместо проверки в между теми, кто эти маленькие кусочки, мы можем просто проверить начале 512 байт. По сути, в этой картине, что вы видите в начале карты, у вас есть ценности, которые на самом деле не относящиеся к фактическим формате JPEG себя. Но то, что у меня есть звезды, чтобы указать одно из двух исходных последовательностей для JPEG. Поэтому, когда вы видите звезды, вы знаете, что у вас есть файл JPEG. А потом каждый файл JPEG будет кратным 512 байт но не обязательно то же самое несколько. Таким образом, что вы знаете, что вы попали другого JPEG, если вы нажмете другую звезду, другой, начиная последовательность байтов. А что у вас тут у вас есть файл JPEG красной продолжается, пока вы нажмете звезды, о чем свидетельствует новый цвет. Вы продолжаете, а затем вы попадаете другой звезды, вы попали другого JPEG, Вы продолжаете весь путь до конца. Вы находитесь на последней картины здесь, розовый. Вы идти до конца, пока не упретесь в конец файла характер. Это будет очень полезно. Несколько основной вынос здесь: Картотеке не начинается с JPEG, но как только начинается JPEG, все изображения в формате JPEG хранятся бок о бок друг с другом. Некоторые псевдокод для восстановления. Во-первых, мы собираемся открыть нашу картотеку, и это будет с помощью нашего файлового ввода / вывода. Мы собираемся повторить следующий процесс, пока мы не достигли конца файла. Мы собираемся читать 512 байт за один раз. И то, что я сказал здесь, что мы собираемся хранить его в буфер, так в основном держаться за тех 512 байт, пока мы точно знаем, что с ними делать. Тогда то, что мы хотим сделать, это мы хотим проверить, можем ли мы попали звезда или нет. Если мы попали звезды, если бы мы попали одного из исходных последовательностей, Затем мы знаем, что мы попали в новый файл JPEG. Что мы хотим сделать, это мы собираемся хотите создать новый файл в нашем каталоге pset4 продолжать делать, что файл. А кроме того, если мы уже сделали JPEG и раньше, Затем мы хотим закончить этот файл и подтолкнуть ее к pset4 папку, где мы будем иметь, что файл хранится, потому что если мы не указываем, что мы закончили, что JPEG файлов, тогда мы будем в основном имеют неопределенную сумму. JPEG, никогда не закончится. Таким образом, мы хотим убедиться, что, когда мы читаем в в файл JPEG и писать, что, Мы хотим специально близко, что для того, чтобы открыть следующую. Мы хотим проверить несколько вещей. Мы хотим проверить, находимся ли мы в начале нового JPEG с нашим буфером а также, если мы уже нашли JPEG до потому что это изменит ваш процесс немного. Так вот после того как вы пройти весь путь и вы попали в конец файла, то что вы хотите сделать, вы хотите, чтобы закрыть все файлы, которые в данный момент открыты. Это, вероятно, будет последний файл JPEG, что у вас есть, а также картотеки, что вы занимались. Последнее препятствие, которое нам нужно было решить, как на самом деле сделать файл JPEG и как на самом деле толкать его в папку. PSET требует, чтобы каждый JPEG, что вы нашли бы в следующем формате, где у вас есть номер. JPG. Номер, даже если это 0, мы называем это 000.jpg. Всякий раз, когда вы находите JPEG в программу, Вы собираетесь хотите назвать его в порядок, в котором он был найден. Что это значит? Мы должны вида отслеживать, как много мы нашли и то, что число каждого JPEG должно быть. Здесь мы собираемся воспользоваться Sprintf функции. Как и в Printf, которые только отчасти отпечатки значения из в терминал, Sprintf печатает файл из в папку. И что же это будет делать, если у меня было Sprintf, название, а затем строка есть, было бы распечатать 2.jpg. Если предположить, что я закрыл файлы правильно, , который будет содержать файл, который я писала из. Но дело в том, что код, который я здесь не вполне удовлетворяет то, что PSET требуется. PSET требует, чтобы второй файл JPEG должны быть названы 002, а не только 2. Поэтому, когда вы печатаете из названия, то, возможно, вы захотите изменить заполнитель немного. Кто-нибудь помнит, как мы позволить лишние пробелы, когда мы что-то напечатать? Да. >> [Студент] Вы ставите 3 между знаком процента и 2. >> Да, совершенно. Вы будете ставить 3 в данном случае, потому что мы хотим пространство для 3. % 3d, вероятно, даст вам 002.jpg вместо 2. Первый аргумент в Sprintf функции на самом деле массив символов, которые мы раньше знали как строки. Те, воля, вид больше похож на временное хранение, просто хранить результирующую строку. Вы не будете действительно иметь дело с этим, но вы должны включить его. Зная, что каждое имя файла имеет номер, который занимает три символа, и потом. JPG, как долго этот массив может быть? Выбросьте номер. Сколько символов в заголовке, в названии? Таким образом, есть 3 хэштеги, период, JPG. >> [Студент] 7. >> 7. Не совсем. Мы собираемся хотим 8, потому что мы хотим, чтобы обеспечить нулевой терминатор, а также. Наконец, чтобы вытянуть процесс, что вы будете делать для восстановления, у вас есть начало информации. Вы продолжаете, пока не найдете начале файла JPEG, и это может быть либо один из двух стартовых последовательностей. Вы продолжайте читать. Каждая черта здесь представляет 512 байт. Вы продолжайте читать, продолжайте читать, пока вы не сталкиваетесь другой пуска. Если у вас есть, что вы в конечном текущего JPEG - в данном случае, это красный, так что вы хотите, чтобы покончить с этим. Вы хотите, чтобы Sprintf имя, что в вашей папке pset4, то вы хотите, чтобы открыть новую JPEG, а затем продолжайте читать пока вы не сталкиваетесь следующем. Читайте дальше, продолжайте чтение, и, наконец, в конце концов, вы собираетесь достичь к концу файла, и так что вы хотите, чтобы закрыть последнюю JPEG, что вы работаете, Sprintf, что в вашем pset4 папку, а затем посмотреть на все фотографии, которые вы получили. Те картинки, на самом деле фотографий CS50 персонала, и так это когда часть бонуса удовольствие от PSET приходит в является то, что вы соревнуетесь в разделах найти ТФ в фотографии и сфотографироваться с ними, чтобы доказать, что вы сделали PSET и поэтому вы можете увидеть, какие сотрудники имеют в своих картинах. И тогда вы делаете снимки с персоналом. Иногда вам придется преследовать их вниз. Вероятно, некоторые из них будут пытаться убежать от вас. Вы сфотографироваться с ними. Это продолжается. Это не из-за когда PSET связано. Сроки будут объявлены в спецификации. Тогда вместе с раздела, в зависимости от раздела принимает самое фотографий с самого сотрудников победит довольно удивительный приз. Это своего рода стимул, чтобы получить pset4 закончена как можно быстрее потому что тогда вы можете приступить к делу охота на все различные CS50 сотрудников. Это не обязательно, хотя, так что как только вы получите фотографии, Затем вы закончите с pset4. И я закончил с Пошаговое руководство 4, так что спасибо всем, кто пришел. Удачи вам в криминалистике. [Аплодисменты] [CS50.TV]