Почему для хранения растровых изображений требуется большой объем памяти
Обновлено: 21.11.2024
Мое приложение читает файл (обычно обычный текст), затем сжимает его, а затем создает растровое изображение из сжатых данных. До размера файла около 30 МБ текста (примерно 15 МБ в сжатом виде) он работает так, как ожидалось. При 40 МБ текста (20 МБ в сжатом виде) я получаю исключение при создании нового растрового изображения.
Да, с этим растровым изображением вы немного выходите за рамки возможного. Для этого вам потребуется 10000 x 9000 x 4 = 360 МБ непрерывного пространства виртуальной памяти. У меня не было проблем с выделением его в отладчике, 1 ГБ оперативной памяти, 2,5 ГБ подкачки. Но вы, вероятно, также выделяете какой-то другой большой буфер для обработки PDF. Или вносят некоторые DLL, чей предпочтительный адрес загрузки фрагментирует пространство виртуальной памяти. DependencyWalker может помочь вам диагностировать это.
Обратите внимание, что вы можете ограничить выделенный размер растрового изображения, выбрав более консервативный формат пикселей. Format24bppRgb потребуется 270 МБ.
У меня нигде нет этих 360 МБ, поэтому мне интересно, что я делаю не так, если что, и как это решить. Я использую 32 bbp и было бы неудобно, но можно переключиться на 24 bbp
Все ответы
У меня нет с этим проблем. Сохраняет бмп нормально. 13 МБ
У меня нет с этим проблем. Сохраняет бмп нормально. 13 МБ
Я попытался немного воспроизвести то, что происходит в моем коде, но это не ошибка.
ЛОЛ. Дикое предположение, вы делаете это в цикле и не удаляете растровые изображения? Возможно, вам не хватает памяти.
ЛОЛ. Дикое предположение, вы делаете это в цикле и не удаляете растровые изображения? Возможно, вам не хватает памяти.
Нет, пользователь начинает либо с открытия текстового файла, либо с создания/ввода пароля. После выполнения обоих действий пользователь выбирает "Зашифровать", и процесс начинается:
1 - Содержимое текстового файла (сохраненное в виде массива байтов) сжимается в другой массив байтов с использованием сжатия GZIP или Deflate.
2. Размер сжатого массива преобразуется в ширину и высоту растрового изображения с приблизительными соотношениями сторон по выбору пользователя (16:9, 4:3, 1:1), и создается пустое растровое изображение**
3 — для каждого возможного байта в массиве (0..255) генерируется несколько уникальных цветов, которые добавляются в список (цветов) с использованием SHA-хэша символа и пароля, объединенных причудливым образом.
4 - для каждого байта содержимого текстового файла пиксель растрового изображения устанавливается в один из цветов, соответствующих этому байту.
5. По завершении пользователь может сохранить растровое изображение в виде файла .jpg (без потерь)
Шаг 2 – возникновение исключения
Существует несколько циклов for-next, определяющих необходимый размер изображения, устанавливающих пиксели, создающих список цветов, но не использующих растровые изображения. Он создается, заполняется и сохраняется. Я не избавляюсь от него, но эта ошибка возникает при первом запуске и, насколько я могу судить, связана только с размером. Я могу шифровать, сохранять и расшифровывать столько файлов меньшего размера один за другим, сколько захочу, не закрывая программу.
Вот аннотированный профиль памяти.
Насколько я понимаю, самое большое растровое изображение, которое вы можете создать в своем приложении, будет зависеть от самого большого непрерывного блока виртуальной памяти, который доступен, как сказал Ханс Пассант в этой теме. Имейте в виду, что память может быть немного фрагментирована, когда вы создаете и выпускаете различные переменные в своем коде, подобно тому, как жесткий диск фрагментируется при создании и удалении файлов.
Кроме того, как сказал nobugz, «. Но вы, вероятно, также выделяете какой-то другой большой буфер .», например, ваши большие байтовые массивы. Что касается создания списка (цвета) после создания растрового изображения, как вы прокомментировали в своем коде, я не уверен, но я считаю, что список цветов, вероятно, не потребует непрерывного блока памяти, как растровое изображение.
Создание нового растрового изображения без его удаления также может привести к проблемам с ним, если сборщик мусора не соберет их достаточно быстро.
Если вы скажете, что это невозможно, я попробую
Растровое изображение объявляется на уровне формы точно так же, как растровое изображение, а затем устанавливается как новое растровое изображение, как только пользователь решит зашифровать набор текста. В этот момент детали профиля памяти показывают массив 50 МБ как 52 МБ, а сжатый как 25. Использование памяти резко возрастает (900 МБ) при загрузке текста, затем возвращается к 80 МБ или около того и остается там. Он поднимается на небольшую сумму непосредственно перед исключением. Создание списка цветов не приводит к заметному всплеску использования памяти.
Изображение профиля, которое я разместил выше, включает создание этих списков после загрузки текста.
Растровое изображение объявляется на уровне формы так же, как растровое изображение, а затем устанавливается как новое растровое изображение, как только пользователь решит зашифровать набор текста. В этот момент в деталях профиля памяти массив размером 50 МБ отображается как 52 МБ, а сжатый — как 25.Использование памяти резко возрастает (900 МБ) при загрузке текста, затем снова снижается до 80 МБ или около того и остается на этом уровне. Он поднимается на небольшую сумму непосредственно перед исключением. Создание списка цветов не приводит к заметному всплеску использования памяти.
Изображение профиля, которое я разместил выше, включает создание этих списков после загрузки текста.
Итак, вы запускаете приложение, сохраняете один файл и получаете сообщение об ошибке? Или через 5 файлов? Можете ли вы продублировать шаблон, используя те же файлы?
Что означает большой подъем и обрыв на графике слева? Нагрузочный тест что? Битовая карта? Текст?
Девен,
Не уверен, что вы отвечаете мне, но я хочу сказать, что на самом деле у вас может быть больше памяти, чем необходимо, но к тому времени, когда вы попытаетесь создать новый экземпляр растрового изображения, память вполне может быть фрагментирована. и нет непрерывного блока памяти (все вместе подряд), который был бы достаточно большим для растрового изображения такого размера. Для этого потребуется непрерывный блок памяти длиной (6048 * 3402 * 4) = 82301184 байт (78,49 МБ).
Если вы скажете, что это невозможно, я попробую
Девен,
Не уверен, что вы отвечаете мне, но я хочу сказать, что на самом деле у вас может быть больше памяти, чем необходимо, но к тому времени, когда вы попытаетесь создать новый В случае растрового изображения память вполне может быть фрагментирована, и не существует непрерывного блока памяти (все вместе подряд), достаточно большого для растрового изображения такого размера. Для этого потребуется непрерывный блок памяти длиной (6048 * 3402 * 4) = 82301184 байт (78,49 Мб).
Если вы скажете, что это невозможно сделать, я попробую< /p>
Можно ли проверить и/или выделить фрагмент памяти, а затем записать и сохранить с помощью битов блокировки или чего-то еще? Просто чтобы посмотреть, не в этом ли проблема?
Нетрудно проверить, просто увеличивайте размер растровых изображений до тех пор, пока он не взорвется?
Я не пробовал, но, возможно, это сработает. Однако вам необходимо заранее знать размер растрового изображения. Я читал что-то в одной из ссылок ранее, где они предлагали попытаться создать все большие буферы, а что нет при запуске, а затем создать растровое изображение. Звучит как в основном та же идея, но в обратном порядке. Тем не менее, все равно нужно знать размеры всех их заранее. Сейчас я отправляюсь на землю ZZZzzzz, но, может быть, я немного проверю это завтра, если кто-то из вас двоих не проверит это к тому времени.
Я также вижу, что Ханс предложил в ссылке из моего второго поста попробовать использовать компонент Windows Imaging для решения этой проблемы с большими изображениями. Не знаю, согласуется ли это с недавними вещами, с которыми, как я видел, экспериментировал Девон в своих последних нескольких вопросах. 8)
Если вы скажете, что это невозможно, я попробую
Итак, вы запускаете приложение, сохраняете один файл и получаете сообщение об ошибке? Или через 5 файлов? Можете ли вы продублировать шаблон, используя те же файлы?
Что означает большой подъем и обрыв на графике слева? Нагрузочный тест что? Битовая карта? Текст?
Я могу запустить приложение и обработать, казалось бы, произвольное количество текстовых файлов, если они не превышают 25 МБ, и оно никогда не выйдет из строя. Я могу смешивать разные размеры, я могу попробовать файлы размером 50 МБ, которые не работают, а затем вернуться к файлам меньшего размера.
Я могу запустить приложение и попробовать файл размером 30, 40 или 50 МБ, но это не удается. Файл размером 30 МБ редко удается, а файл размером 40 и 50 МБ — никогда.
Удар и обрыв — это «Загрузить текст», а не «Загрузить тест». Почему он так сильно всплескивает и почему он возвращается обратно, я понятия не имею, это было из-за загрузки тестового файла размером 50 МБ.
Итак, вы запускаете приложение, сохраняете один файл и получаете ошибку? Или через 5 файлов? Можете ли вы продублировать паттерн, используя те же файлы?
Что представляет собой большая выпуклость и обрыв на графике слева? Нагрузочный тест что? Битовая карта? Текст?
Я могу запустить приложение и обработать, казалось бы, произвольное количество текстовых файлов, если они не превышают 25 МБ, и оно никогда не даст сбоев. Я могу смешивать файлы разных размеров, я могу попробовать файлы размером 50 МБ, которые не работают, а затем вернуться к файлам меньшего размера.
Я могу запустить приложение и попробовать файл размером 30, 40 или 50 МБ, но он не работает. Файл размером 30 МБ редко удается, 40 и 50 – никогда.
Удар и обрыв — это "Загрузка текста", а не "Загрузка теста". понятия не имею, это из-за загрузки тестового файла размером 50 МБ.
Когда я использую этот пример в цикле, я перешел к размеру растрового изображения 10 000 x 20 000, и при 20 был создан файл размером 147 МБ, но без ошибок.
Когда я удаляю dispose, я получаю 10 или 11, а затем выдаю ошибку.
Вы утилизируете или нет? Вы не в своем примере?
PS Размер файла № 10 (10000 x 10000), в котором возникает ошибка, составляет около 80 МБ, когда он создается при удалении.
PS2: возможно, вам нужно разместить свои списки/массивы, которые вы создаете в тексте загрузки, а затем объявить растровое изображение. Возможно, память, которую вы используете в своем калькуляторе, все еще висит, и общее количество, которое вы используете, каким-то образом превышает лимит. Попробуйте удалить все, что вы делаете, а затем объявите растровое изображение.
Насколько велики ваши массивы?Или что вы используете.
PS3, насколько сложно изменить приложение, чтобы оно просто выполняло один и тот же файл в цикле, подобном этому, до тех пор, пока не возникнет ошибка? Вы говорите, что когда вы нажимаете 30 мб, он ошибается. Так что сделайте 10 МБ в цикле, подобном этому, пока он не ошибется, т.е. 10 раз.
Вы утилизируете или нет? Вы не в своем примере?
Нет, я ничего не удаляю, я полагаю, что мог бы избавиться от растрового изображения после его сохранения, но, конечно, не раньше, но для меня это не объясняет, почему я могу сжимать, шифровать и сохранять 5 или более Файлы по 5,10,15,20 МБ один за другим без проблем.
PS2: возможно, вам нужно разместить свои списки/массивы, которые вы создаете в тексте загрузки, а затем объявить растровое изображение. Возможно, память, которую вы используете в своем калькуляторе, все еще висит, и общее количество, которое вы используете, каким-то образом превышает лимит. Попробуйте избавиться от всего, что вы делаете, а затем объявите растровое изображение.
При загрузке текста создается один массив размером с текстовый файл.
При вводе или генерации пароля создаются два цветных словаря, каждый по 3000 цветов, один для шифрования (Целое, Цвет), другой для расшифровки (Цвет, Целое). Это можно изменить, чтобы сделать словарь необходимым только для отложенной операции. При нажатии кнопки «Зашифровать» исходный массив из текстового файла сжимается в другой массив, обычно примерно вдвое меньше исходного. Этот сжатый массив используется для вычисления наименьших размеров растрового изображения, которые будут содержать по крайней мере каждый байт в сжатом массиве, размер растрового изображения всегда немного больше емкости сжатого массива. Когда я на самом деле заполняю растровое изображение, я создаю другой массив случайных чисел точно такой же длины, как у растрового изображения, и использую Array.copy для вставки в него сжатых данных по индексу 0. Итак, опять же, я предполагаю, что после создания сжатого массива исходный массив больше не нужен, пока не будет загружен другой файл или не будет использован другой пароль для повторного шифрования тех же данных. Кроме того, после создания и заполнения массива для заполнения растрового изображения сжатый массив больше не нужен. У меня нет ничего, что могло бы предотвратить повторное сжатие оригинала, даже если он уже мог быть сжат предыдущей операцией. Я даже не знаю, как избавиться от массива и оставить его пригодным для использования позже.
Насколько велики ваши массивы? Или что вы используете.
«Исходный» массив — это размер текстового файла с использованием File.ReadAllBytes.
Сжатый массив примерно вдвое меньше "исходного" массива.
Два словаря по 3000 статей в каждом
PS3, насколько сложно изменить приложение, чтобы оно просто выполняло один и тот же файл в цикле, подобном этому, до тех пор, пока не возникнет ошибка? Вы говорите, что когда вы нажимаете 30 мб, он ошибается. Так что сделайте 10 МБ в цикле, подобном этому, пока он не ошибется, т.е. 10 раз.
Если вы хотите создать тест, который автоматизирует загрузку файла меньшего размера снова и снова, я могу это сделать. Прошлой ночью я вручную прогнал около 20 циклов, 1 МБ, 30, 5, 10, 40, 20, 50, обратно к меньшим файлам наугад, и это не удалось только на 30, 40 и 50, а после сбоя - файл меньшего размера. удалось. Я создал еще одну программу, которая просто создает текстовые файлы любого размера, используя несколько списков слов, собранных из словарей, сайтов кроссвордов, сайтов Scrabble и т. д.
Вероятно, я тестировал 500 файлов и два раза видел, как после неудачной попытки с большим файлом, а затем с файлом, который должен быть в порядке, происходила аномалия: процесс завершался всего за несколько миллисекунд. (Обычно это занимает 700 миллисекунд на мегабайт), и результирующий файл изображения слишком мал (например, 30 КБ для текстового файла размером 5 МБ). Этому у меня нет никакого объяснения.
В этой главе описывается, как использовать индексы в среде хранилища данных, и обсуждаются следующие типы индексов:
Основы базы данных Oracle9i для получения общей информации об индексировании
Растровые индексы
Растровые индексы широко используются в средах хранения данных. Среды обычно имеют большие объемы данных и специальные запросы, но низкий уровень параллельных транзакций DML. Для таких приложений растровое индексирование обеспечивает:
-
Сокращение времени отклика для больших классов одноранговых запросов. Уменьшение требований к хранилищу по сравнению с другими методами индексирования. Значительный прирост производительности даже на оборудовании с относительно небольшим количеством ЦП или небольшим объемом памяти. Эффективное обслуживание во время параллельного DML и нагрузок.
Полное индексирование большой таблицы с помощью традиционного индекса B-дерева может быть чрезмерно затратным с точки зрения пространства, поскольку индексы могут быть в несколько раз больше, чем данные в таблице. Битовые индексы обычно составляют лишь часть размера проиндексированных данных в таблице.
Растровые индексы доступны, только если вы приобрели Oracle9i Enterprise Edition. Дополнительные сведения о функциях, доступных в Oracle9i и Oracle9i Enterprise Edition, см. в разделе Новые функции базы данных Oracle9i.
Индекс предоставляет указатели на строки в таблице, содержащие заданное значение ключа. Обычный индекс хранит список идентификаторов строк для каждого ключа, соответствующего строкам с этим значением ключа. В растровом индексе растровое изображение для каждого значения ключа заменяет список идентификаторов строк.
Каждый бит в растровом изображении соответствует возможному идентификатору строки, и если бит установлен, это означает, что строка с соответствующим идентификатором строки содержит значение ключа. Функция сопоставления преобразует позицию бита в фактический идентификатор строки, так что индекс битовой карты обеспечивает те же функции, что и обычный индекс. Если число различных значений ключа невелико, растровые индексы экономят место.
Битовые индексы наиболее эффективны для запросов, содержащих несколько условий в предложении WHERE. Строки, удовлетворяющие некоторым, но не всем условиям, отфильтровываются до обращения к самой таблице. Это сокращает время отклика, часто значительно.
Преимущества приложений для хранения данных
Растровые индексы в первую очередь предназначены для приложений хранилищ данных, в которых пользователи запрашивают данные, а не обновляют их. Они не подходят для приложений OLTP с большим количеством одновременных транзакций, изменяющих данные.
Параллельный запрос и параллельный DML работают с растровыми индексами так же, как и с традиционными индексами. Растровое индексирование также поддерживает параллельное создание индексов и объединенных индексов.
Глава 17, "Методы моделирования схем" для получения дополнительной информации об использовании индексов растровых изображений в средах хранилищ данных
Количество элементов
Преимущества использования растровых индексов максимальны для столбцов, в которых отношение количества уникальных значений к количеству строк в таблице меньше 1 %. Мы называем это отношение степенью кардинальности. Половая колонка, имеющая только два различных значения (мужской и женский), идеально подходит для растрового индекса. Однако администраторы хранилища данных также создают растровые индексы для столбцов с более высокой кардинальностью.
Например, в таблице с миллионом строк столбец с 10 000 различных значений является кандидатом на индекс битового массива. Битовый индекс для этого столбца может превзойти индекс B-дерева, особенно когда этот столбец часто запрашивается вместе с другими индексированными столбцами. Фактически, в типичных средах хранилища данных растровый индекс можно использовать для любого неуникального столбца.
Индексы B-дерева наиболее эффективны для данных с большим числом элементов, то есть для данных со многими возможными значениями, такими как имя_клиента или номер_телефона . В хранилище данных индексы B-дерева следует использовать только для уникальных столбцов или других столбцов с очень высокой кардинальностью (то есть столбцов, которые почти уникальны). Большинство индексов в хранилище данных должны быть растровыми индексами.
В нерегламентированных запросах и подобных ситуациях растровые индексы могут значительно повысить производительность запросов. Условия И и ИЛИ в предложении WHERE запроса можно быстро разрешить, выполнив соответствующие логические операции непосредственно с растровыми изображениями перед преобразованием результирующего растрового изображения в идентификаторы строк. Если результирующее количество строк невелико, на запрос можно быстро ответить, не прибегая к полному сканированию таблицы.
Пример 6-1 Bitmap Index
Ниже показана часть таблицы клиентов компании.
Поскольку cust_gender , cust_marital_status и cust_income_level являются столбцами с низкой кардинальностью (есть только три возможных значения для семейного положения и региона, два возможных значения для пола и 12 для уровня дохода), растровые индексы идеально подходят для этих столбцов. . Не создавайте битовый индекс для cust_id, потому что это уникальный столбец. Вместо этого уникальный индекс B-дерева для этого столбца обеспечивает наиболее эффективное представление и поиск.
Таблица 6-1 иллюстрирует битовый индекс для столбца cust_gender в этом примере. Он состоит из двух отдельных растровых изображений, одно для пола.
Каждая часть растрового изображения имеет атрибут имени файла, который представляет собой имя графического файла, содержащего изображение. В SDL вы устанавливаете это, определяя параметр имени файла.
Если вы установите для параметра предварительной загрузки значение false, вы не сможете определить имя файла и сможете установить его позже с помощью PCL. После вызова bitmap::set_filename необходимо вызвать bitmap::load, чтобы изображение было загружено и отображено на картинке.
Если имя файла не включает полный путь (букву диска и информацию о каталоге), Presentation добавляет к имени файла значение параметра заголовка default_path. Например, если путь по умолчанию был "C:\\Stimuli", при загрузке растрового изображения "mypic" Presentation будет искать файл "C:\\Stimuli\\my_pic.bmp".
Поскольку каждое растровое изображение требует большого объема памяти для хранения, важно, чтобы вы называли части растрового изображения, которые будут использоваться более одного раза. (См. «Именование стимулов».) В противном случае в памяти будет храниться несколько копий одного и того же изображения.
Исходные растровые изображения имеют определенную высоту и ширину в пикселях.Однако вы также можете указать Presentation изменить размер изображения. В SDL вы делаете это, определяя параметры высоты и ширины. Если вы не зададите эти параметры, Presentation будет использовать исходные значения. Определения параметров растрового изображения могут появляться в любом порядке.
Если вы хотите изменить размер изображения, сохранив соотношение сторон (отношение ширины к высоте), используйте параметр scale_factor. Если вы назначите значение с плавающей запятой для scale_factor , размеры изображения будут исходными размерами, умноженными на этот коэффициент. Параметр scale_factor также принимает два специальных значения. Если для параметра scale_factor задано значение scale_to_width, будет использоваться указанная вами ширина, а высота будет скорректирована для сохранения того же соотношения сторон, что и исходное изображение. Если scale_factor равно scale_to_width, вы должны определить параметр ширины и не можете определять параметр высоты. Если для параметра scale_factor задано значение scale_to_height, будет использоваться указанная вами высота, а ширина будет скорректирована для сохранения того же соотношения сторон, что и исходное изображение. Если scale_factor имеет значение scale_to_height, вы должны определить параметр высоты и не можете определять параметр ширины.
Поскольку растровые изображения требуют большого объема памяти, мы рекомендуем делать их настолько большими, насколько это необходимо. Например, предположим, что ваше изображение представляет собой маленький красный кружок на черном фоне. Если вы используете это изображение в изображении с черным фоном, изображение должно быть достаточно большим, чтобы содержать круг. В противном случае Presentation будет тратить ресурсы, копируя черное пространство на черный фон.
При использовании определенного оборудования дисплея вам не разрешается делать части изображения больше, чем размер экрана в режиме отображения вашего эксперимента. Если вы получаете сообщение об ошибке загрузки изображения, которое шире или выше самого экрана, это может быть причиной.
Загрузка данных изображения
Графические данные хранятся в памяти в несжатом формате, чтобы минимизировать время, необходимое для отрисовки изображения. В результате графика может потреблять значительные ресурсы памяти. Если у вас недостаточно оперативной памяти для хранения всех изображений в одном сценарии, вы можете использовать PCL для загрузки и выгрузки стимулов во время сценария. (См. Растровые изображения в PCL.) По умолчанию Presentation загружает все стимулы, определенные в SDL, перед запуском сценария. Если вы не хотите загружать конкретное растровое изображение перед сценарием, потому что позже вы будете загружать его самостоятельно с помощью PCL, задайте для параметра предварительной загрузки значение false . Вы можете сделать прозрачным любой произвольный набор пикселей, а не только непрерывные фигуры.
Определение значения preload как true равнозначно его полному отсутствию. Вы не должны использовать этот параметр, если вы не используете PCL.
Прозрачный цвет
Части изображения можно сделать прозрачными. Когда растровое изображение рисуется на изображении, эти прозрачные части не рисуются, что позволяет отображать исходное изображение через эти прозрачные «отверстия». Для этого необходимо определить параметр Transparent_color в описании растрового изображения. Значением этого параметра является цвет. Любые пиксели изображения, имеющие этот цвет, будут прозрачными. Обратите внимание, что эта функция не выполняет никаких операций прозрачного смешивания — пиксели указанного цвета просто не рисуются.
1191 день с
Рождественских каникул
Растровая графика, хранение и сжатие изображений
Растровая графика – это изображения, состоящие из прямоугольников, состоящих из маленьких точек, называемых пикселями. Почти все изображения, с которыми вы имеете дело на компьютере, являются примерами растровых изображений. Чем больше количество пикселей в изображении, тем выше разрешение изображения и тем больше деталей оно может содержать.
Базовое редактирование растровых изображений можно выполнять во многих программах, однако Adobe Photoshop является коммерческой программой, которую предпочитают многие фотографы.
Хранение изображений
Все растровые изображения хранятся на компьютере в виде прямоугольной сетки пикселей.
Разрешение изображения относится к количеству пикселей в сетке; более высокое разрешение означает, что в изображении может быть сохранено больше деталей.
В приведенной ниже презентации PowerPoint показано одно и то же изображение в формате jpg с пятью различными разрешениями.
Упражнение — Раскраска по номерам — Представление изображения (CS Unplugged)
Производители цифровых камер обычно указывают разрешение в мегапикселях (один миллион пикселей). Это относится к общему количеству пикселей в изображении. Современные камеры имеют разрешение 8 Мп (3254 x 2448), 12 Мп (4290 x 2800), 14 Мп (4290 x 3264) и даже выше.
Битовая глубина
Помимо разрешения, битовая глубина изображения влияет на его качество.Битовая глубина — это количество битов, используемых для хранения каждого пикселя изображения.
Самая распространенная для фотографов глубина цвета — 24 бита, также известная как истинный цвет. В полноцветных изображениях для хранения каждого пикселя используется 3 байта (24 бита = 3 байта). В каждом пикселе один байт (8 бит) используется для представления уровня красного, один байт для уровня синего и один байт для уровня зеленого.
Это изображение является полноцветным 24-битным (подробнее о том, как это сделать, см. ниже).
Вычисление будет следующим:
3648 x 2056 x 3 = 22 500 864 байта
22 500 864/1024 = 21 973,5 КБ
21 973,5/1024 = 21,5 МБ (т. е. размеры в пикселях указаны в верхней части экрана размера изображения)
На самом деле, этот расчет дает только максимальные требования к объему памяти, но фактическое требуемое пространство часто намного меньше
(это изображение занимает всего 3,7 МБ). Позже мы увидим, почему.
Щелкните изображение выше, чтобы узнать, что такое поле Размер изображения в Photoshop
Сжатие
На самом деле приведенный выше расчет упрощен. Из-за огромного объема данных, необходимых для хранения изображений, видео и других мультимедийных данных, только несколько форматов файлов хранят данные с использованием этого несжатого подхода (BMP и TIFF являются двумя наиболее распространенными примерами).
Большинство форматов файлов используют некоторые форма сжатия для уменьшения избыточных повторяющихся данных в изображениях и, таким образом, уменьшения требуемого места в файле.
20 x 20 x 1 = 400 байт
щелкните изображение, чтобы открыть оригинал
Для упрощения предположим, что он использует только пять цветов. Мы можем предположить, что для обозначения каждого цвета на изображении используется одно число, и назначить их, как показано в таблице ниже.
Он может быть сохранен как: "два пикселя черного цвета, семь пикселей серого цвета, один пиксель черного цвета, десять пикселей серого цвета".
т.е. 2, 3, 7, 4, 1, 3, 10, 4
Первое число представляет количество пикселей, второе число – цвет пикселя. Это уменьшает количество цифр (байтов), необходимых для хранения этой части изображения, с 20 до 8.
Сжатие с потерями — это компромисс: качество изображения снижается в обмен на уменьшение объема памяти. Он делает это, отбрасывая данные, которые «вероятно» не будут упущены. Например, если два соседних пикселя на изображении имеют почти одинаковый цвет, сжатие с потерями может сделать их абсолютно одинаковыми. Затем он может применить стандартные методы без потерь к этим новым блокам непрерывного цвета. Однако после того, как данные были удалены, их нельзя получить снова.
Самым популярным форматом файла изображения, в котором используется сжатие с потерями, является JPEG.
Сжатие JPEG в действии
Мы можем оценить огромный объем данных, содержащихся в файлах изображений, с помощью замечательной утилиты Pixel Spreadsheet. Одной из мощных идей медиа-вычислений является абстракция данных: видимые манипуляции с изображениями производятся путем изменения низкоуровневых, почти невидимых объектов — пикселей. Pixel Spreadsheet позволяет загружать изображения, извлекать пиксельные данные и сохранять их в электронной таблице. Отсюда вы можете применить простую формулу для управления значениями. Например, установка значений одного цвета в 0 приведет к окрашиванию изображения. Вычитание каждого значения из 255 создает негативное изображение, а усреднение трех цветов дает оттенки серого. После перезагрузки новые значения можно отобразить как новое изображение и сравнить с исходным.
Используя эту утилиту, вы сразу увидите, как можно создавать простые эффекты Photoshop.
Задачи, чтобы проверить нашу способность выражать манипуляции с данными в виде формул в электронной таблице
Попробуйте повернуть или отразить изображение
- Как работает сжатие файлов — How Stuff work
- Статья: Все, что вам нужно знать о сжатии изображений
Невероятные интерактивные изображения
- Лондон, вид сверху. Рекордное интерактивное изображение столицы с разрешением 320 гигапикселей, позволяющее увеличить масштаб улиц и зданий в 20 милях от нее — Daily Mail, 21 февраля 2013 г.
- Изображение горы Эверест размером четыре миллиарда пикселей. Daily Mail, 19 декабря 2012 г.
- Полетайте по Манхэтту, не вставая с дивана – Daily Mail, 10 января 2013 г.
Фото или компьютер?
Думаете, у вас хороший глаз? Можете ли вы отличить реальную фотографию от объекта, сгенерированного компьютером? Попробуйте подделку или фото-викторину
Читайте также: