Определить, сколько памяти в битах будет занимать каждое растровое изображение

Обновлено: 21.11.2024

Основная идея битовой карты заключается в использовании бита для обозначения значения, соответствующего элементу, а ключ — это элемент. Поскольку бит используется для хранения данных, можно значительно сэкономить место для хранения. (PS: фокус) Экономьте место для хранения)

Предположим, есть такое требование: выяснить, существует ли определенное число m среди 2 миллиардов случайных целых чисел, и предположим, что 32-битная операционная система, 4 ГБ памяти

В Java int занимает 4 байта, 1 байт = 8 бит (1 байт = 8 бит)

Если каждое число хранится в целых числах, это 2 миллиарда целых чисел, поэтому занимаемое пространство составляет около (2000000000 * 4/1024/1024) ≈7,45 ГБ

Если побитовое хранение отличается, 2 миллиарда бит – это 2 миллиарда бит, а занятое пространство составляет около (2 000 000 000 / 8 / 1024 / 1024) ≈0,23 ГБ

Нет необходимости говорить об этом больше

Итак, вопрос в том, как выразить число?

Как я только что сказал, каждый бит представляет собой число, 0 представляет несуществование, а 1 представляет существование, что точно соответствует двоичному коду

Таким образом, мы можем легко выразить:

Минимальной единицей выделения компьютерной памяти является байт, то есть 8 бит. Что, если это означает ?

Конечно, это означает остальные 8 цифр:

Таким образом, это выглядит как двумерный массив

Если одно целое занимает 32 бита, нам нужно только применить массив целых чисел с длиной int TMP [1 + n / 32] для его хранения, где n представляет максимальное из этих чисел, которые нужно сохранить

TMP [0]: может выражать 0 ~ 31

TMP [1]: может выражать 32 ~ 63

TMP [2]: может выражать 64 ~ 95

Таким образом, для любого целого числа m число M / 32 получит нижний индекс, а M% 32 будет знать, где оно находится в этом нижнем индексе

добавить в

Вот вопрос. Как мы можем поместить в него число? Например, если вы хотите вставить цифру 5, как вы это сделаете?

Во-первых, 5 / 32 = 0, 5% 32 = 5, а значит, он должен быть на пятой позиции TMP[0]. Затем мы перемещаем 1 влево на 5 бит, а затем нажимаем бит или

Это эквивалентно 86 | 32 = 118

То есть, чтобы вставить число, сдвиньте 1 влево, чтобы представить бит числа, а затем нажмите или работайте с исходным числом

Для упрощения 86 + (5 / 8) | (1 < (5% 8))

устранить

Вышеупомянутое добавить, то если вы хотите, чтобы ясно, как это сделать?

Или в приведенном выше примере предположим, что мы хотим удалить 6, что нам делать?

Судя по рисунку, вам просто нужно установить позицию числа на 0

1 перемещается на 6 бит влево, чтобы достичь бита, представленного числом 6, затем меняется на бит и, наконец, объединяется с исходным числом на бит, так что позиция равна 0

поиск

Как мы уже говорили ранее, каждая цифра представляет собой число, 1 означает "да" (или существует), а 0 означает "нет" (или не существует). Установив число в 1 или 0, чтобы добавить и очистить малую группу, затем определить, существует ли число или нет, чтобы определить, равен ли бит числа 0 или 1

Предположим, что мы хотим знать, есть ли 3 или нет, тогда нам просто нужно оценить B [0] & (1 < < 3). Если это значение равно 0, то оно не существует, если равно 1, то оно существует

В чем польза растрового изображения

Быстрая сортировка, поиск и удаление дубликатов больших объемов данных

Быстрая сортировка

Предположим, что мы хотим отсортировать 5 элементов (4,7,2,5,3) в диапазоне от 0 до 7 (при условии, что эти элементы здесь не повторяются), мы можем использовать метод битовой карты для достижения цели сортировки.

Чтобы представить 8 чисел, нам нужно всего 8 бит (1 байт). Сначала мы открываем пространство размером 1 байт, устанавливаем все биты этих пространств в 0, а затем устанавливаем соответствующую позицию в 1.

Наконец, просматривается битовая область и выводится номер бита (2, 3, 4, 5, 7). Таким образом достигается цель сортировки, а временная сложность составляет O (n).

Преимущество:

  • Высокая эффективность, нет необходимости сравнивать и перекладывать;
  • Он занимает меньше памяти, например, n = 10000000; он занимает всего n / 8 = 1250000 байт = 1,25 м

Недостатки:

  • Невозможно дублировать все данные. То есть повторяющиеся данные нельзя сортировать и искать.
  • Только когда данных много, они могут иметь преимущество

Быстрое удаление веса

Найдите количество неповторяющихся целых чисел из 2 миллиардов целых чисел, а памяти недостаточно для хранения 2 миллиардов целых чисел.

Во-первых, в соответствии с тем, что «недостаточно места в памяти для хранения этих 0,5 миллиарда целых чисел», мы можем быстро связать битовую карту. Следующая ключевая проблема заключается в том, как разработать нашу битовую карту для представления состояния этих двух миллиардов чисел. На самом деле проблема очень проста. Есть только три состояния числа: небытие, только единица и повторение. Поэтому нам нужно всего 2 бита для хранения статуса числа. Предположим, мы установили несуществующее число как 00, существует один раз как 01 и существует два или более раз как 11. Тогда нам потребуется около 2 ГБ дискового пространства.

Следующая задача — поместить эти 2 миллиарда номеров в (хранить). Если соответствующий бит состояния равен 00, он будет изменен на 01, указывая, что он существует один раз; если соответствующий бит состояния равен 01, он будет изменен на 11, указывая на то, что он уже есть, то есть он появляется много раз; если он равен 11, соответствующий бит состояния останется неизменным, указывая на то, что он по-прежнему появляется много раз.

Наконец, подсчитав количество битов состояния 01, мы можем получить количество неповторяющихся чисел, а временная сложность равна O (n).

Быстрый поиск

Это то, о чем мы говорили ранее. Если элемент в массиве int имеет размер 4 байта, что составляет 32 бита, разделите его на 32, чтобы узнать индекс элемента. Если остаток от 32 будет найден, он узнает, в каком бите он находится. Если бит равен 1, это означает, что он существует.

Обзор и обзор

Растровое изображение в основном используется для быстрого получения статуса ключевого слова. Обычно требуется, чтобы ключевое слово представляло собой непрерывную последовательность (или ключевое слово составляло большую часть непрерывной последовательности). В самом простом случае 1 бит используется для представления статуса ключевого слова (можно отметить два состояния), но 2 бита (четыре состояния) и 3 бита (восемь состояний) могут использоваться по мере необходимости.

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

На 32-битных машинах целое число, например int a = 1, занимает в памяти 32 бита, что необходимо для удобства работы компьютера. Но для некоторых сценариев приложений это огромная трата, потому что мы можем использовать соответствующие 32 бита для хранения десятичных чисел от 0 до 31, что является основной идеей битовой карты. Алгоритм битовой карты использует эту идею для обработки большого количества данных, сортировки, запросов и дедупликации.

Дополнение 1

Исходя из того, что число не переполняется, для положительных и отрицательных чисел сдвиг на один бит влево эквивалентен степени 1, умноженной на 2, а сдвиг на n битов влево эквивалентен степени N, умноженной на 2 сдвиг на один бит вправо эквивалентен делению 2, а сдвиг на n бит вправо эквивалентен степени числа N, деленной на 2.

Сдвиг вправо, что эквивалентно n-й степени числа 2, например: 64 > > 3 эквивалентно 64 △ 8 = 8

^Исключая или эквивалентно остатку, например: 48 ^ 32 эквивалентно 48% 32 = 16

Дополнение 2

Обмен значениями двух переменных без использования сторонних переменных

Битовый набор

BitSet реализует битовый вектор, который может увеличиваться по мере необходимости. Каждый бит имеет логическое значение. Биты BitSet могут быть проиндексированы неотрицательными целыми числами (PS: это означает, что каждый бит может представлять неотрицательное целое число). Вы можете найти, установить и очистить немного. Логические операторы позволяют изменять содержимое другого BitSet. По умолчанию все биты имеют значение по умолчанию false.

Как видите, это похоже на то, что мы думали

Используйте длинный массив для хранения начальной длины 64. При установке значения сначала сдвиньте 6 бит вправо (эквивалентно делению на 64), чтобы вычислить позицию в массиве, а затем измените бит состояния

Не имеет значения, если вы ничего не понимаете в остальном

Фильтры Блума

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

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

Основной структурой данных фильтра Блума является битовый вектор (который можно понимать как массив).

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

Если вы хотите определить, входит ли элемент в набор, обычно вы думаете о сохранении всех элементов в наборе, а затем определяете их сравнением. Связанный список, дерево, хеш-таблица и другие структуры данных — все это образ мышления, но с увеличением количества элементов в наборе пространство для хранения должно быть все больше и больше; в то же время скорость поиска также все медленнее и медленнее, а временная сложность поиска составляет O (n), O (log n), O (1).

Принцип фильтра Блума заключается в том, что когда элемент добавляется в набор, элемент сопоставляется с k точками в битовом массиве с помощью k хэш-функций, и им присваивается значение 1. При поиске нам нужно только увидеть все ли эти точки равны 1, чтобы узнать, входят ли элементы в набор; если в этих точках есть 0, проверяемых элементов не должно быть внутри; если все они равны 1, проверяемые элементы, скорее всего, присутствуют (причина, по которой мы говорим «может», заключается в наличии ошибки).

Процесс фильтра Блума

<р>1. Во-первых, нам нужны k хеш-функций, каждая из которых может хэшировать ключ в целое число;

<р>2. Во время инициализации требуется массив из N бит, и каждый бит инициализируется 0;

<р>3. Когда ключ добавляется в набор, k хэш-функций используются для вычисления k хэш-значений, а соответствующая битовая позиция в массиве устанавливается в 1;

<р>4. При оценке наличия ключа в наборе используются k хеш-функций для вычисления k хэш-значений и запрашиваются соответствующие биты в массиве. Если все биты равны 1, считается, что они находятся в наборе.

Проблема 2

  1. Сколько страниц находится в виртуальном адресном пространстве?
  2. Каков максимальный размер адресуемой физической памяти в этой системе?
  3. Если средний размер процесса составляет 8 ГБ, вы бы использовали одноуровневую, двухуровневую или трехуровневую таблицу страниц? Почему?
  4. Вычислите средний размер таблицы страниц в ответе на вопрос 3 выше.

    36-битный адрес может адресовать 2 ^ 36 байтов в машине с байтовой адресацией. Поскольку размер страницы составляет 8 КБ (2^13), количество адресуемых страниц равно 2^36 / >2^13 = 2^23

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

Пейджинг 1 уровня
Поскольку у нас есть 2^23 страницы в каждом виртуальном адресном пространстве, и мы используем 4 байта на запись в таблице страниц, размер таблицы страниц будет 2^23 * 2^2 = 2 ^ 25. Это 1/256 собственного пространства памяти процесса, так что это довольно дорого. (32 МБ)

Пейджинг 2 уровня
Адрес будет разделен на 12 | 11 | 13, так как мы хотим, чтобы страницы таблицы страниц умещались на одной странице, и мы также хотим разделить биты примерно поровну.

Поскольку размер процесса составляет 8 ГБ = 2^33 Б, я предполагаю, что это означает, что общий размер всех отдельных страниц, к которым обращается процесс, составляет 2^33 Б. Следовательно, этот процесс обращается к 2^33 / 2^13 = 2^20 страниц. Нижний уровень таблицы страниц содержит 2^20 ссылок. Мы знаем, что размер каждого фрагмента нижнего уровня таблицы страниц составляет 2 ^ 11 записей. Таким образом, нам нужно 2^20 / 2^11 = 2^9 фрагментов нижнего уровня.

Тогда общий размер таблицы страниц равен:

//размер внешней таблицы страниц //общий размер внутренних страниц< /td>
1 * 2^12 * 4 + 2^9 * 2^11 * 4 = 2^20 * ( 2^-6 + 4) ~4 МБ

3 уровня пейджинга
Для 3 уровня пейджинга мы можем разделить адрес следующим образом:
8 | 8 | 7 | 13

Опять же, используя те же рассуждения, что и выше, нам нужно 2 ^ 20/2 ^ 7 = 2 ^ 13 фрагментов таблицы страниц уровня 3. Каждый фрагмент таблицы страниц уровня 2 ссылается на 2^8 фрагментов таблицы страниц уровня 3. Итак, нам нужно 2^13/2^8 = 2^5 таблиц уровня 2. И, конечно же, одна таблица уровня 1.

Общий размер таблицы страниц равен:

//размер внешней таблицы страниц //общий размер таблиц уровня 2 //общий размер самых внутренних таблиц
1 * 2^8 * 4 2^5 * 2^8 *4 2^13 * 2^7 * 4 ~4MB
Как легко заметить, двухуровневая и трехуровневая подкачка требуют гораздо меньше места, чем подкачка уровня 1. схема. А поскольку наше адресное пространство недостаточно велико, 3-уровневая подкачка работает не лучше, чем 2-уровневая. Из-за стоимости доступа к памяти гораздо логичнее выбрать двухуровневую схему подкачки для этого процесса.

Проблема 3

  1. Каков размер страницы в такой системе?Объясните свой ответ (число без обоснования не будет засчитано).

    4К. Последние 12 бит виртуального адреса представляют собой смещение на странице, которое варьируется от 0 до 4095. Таким образом, размер страницы равен 4096, то есть 4 КБ.

Поскольку физические адреса имеют длину 44 бита, а размер страницы — 4 КБ, номер кадра страницы занимает 32 бита. Принимая во внимание 4 защитных бита, каждая запись таблицы страниц уровня 3 занимает (32+4) = 36 бит. Округление для выравнивания записей по байтам (словам) приведет к тому, что каждая запись будет потреблять 40 (64) бит или 5 (8) байтов. Для таблицы из 256 записей нам потребуется 1280 (2048) байт.

Таблица страниц верхнего уровня не должна предполагать, что таблицы страниц 2-го уровня выровнены по страницам. Итак, мы храним там полные физические адреса. К счастью, нам не нужны управляющие биты. Таким образом, каждая запись занимает не менее 44 бит (6 байтов для выравнивания по байтам, 8 байтов для выравнивания по словам). Таким образом, каждая таблица страниц верхнего уровня имеет размер 256*6 = 1536 байт (256 * 8 = 2048 байт).

Попытка воспользоваться выравниванием по 256 элементам для уменьшения размера элемента, вероятно, не стоит усилий. Сделать это было бы сложно; вам нужно будет написать новый распределитель памяти, который гарантирует такое выравнивание. Кроме того, мы не можем полностью уместить таблицу в выровненную область размером 1024 байта (44-10 = 34 бита на адрес, что потребовало бы более 4 байтов на запись), и округление размера до следующей степени двойки не спасло бы использовать любой размер, а не просто хранить указатели и использовать обычный распределитель.

Аналогично каждая запись в таблице страниц 2-го уровня представляет собой 44-битный физический указатель, 6 байтов (8 байтов) при выравнивании по байтам (словам). Таким образом, таблица с 16 элементами занимает 96 (128) байт. Таким образом, требуемое пространство составляет 1536 (2048) байт для таблицы страниц верхнего уровня + 96 (128) байт для одной таблицы страниц второго уровня + 1280 (2048) байт для одной таблицы страниц третьего уровня = 2912 (4224) байт. Поскольку процесс может уместиться ровно на 16 страницах, внутренняя фрагментация не тратит память впустую.

Таким образом, требуемое пространство составляет 1536 (2048) байт для таблицы страниц верхнего уровня + 3 * 96 (3 * 128) байт для 3 таблиц страниц второго уровня + 3 * 1280 (3 * 2048) для 3 таблиц страниц третьего уровня. таблица страниц = 5664 (8576) байт.

Проблема 4

В соответствии с философией проектирования процессоров RISC, заключающейся в перемещении аппаратной функциональности в программное обеспечение, вы видите предложение о том, чтобы разработчики процессоров удаляли MMU (блок управления памятью) из аппаратного обеспечения. Чтобы заменить MMU, компиляторы генерируют так называемый позиционно-независимый код (PIC). PIC может быть загружен и запущен по любому адресу без выполнения какого-либо перемещения. Если предположить, что код PIC работает так же быстро, как код без PIC, в чем будет недостаток этой схемы по сравнению со страничным MMU, используемым в современных микропроцессорах?

Решение:
Нужно решение.

Проблема 5

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

Решение:
Нужно решение.

Проблема 6

Рассмотрите следующий фрагмент кода, который умножает две матрицы. Предположим, что двоичный файл для выполнения этой функции умещается на одной странице, и стек также умещается на одной странице. Предположим далее, что для хранения целого числа требуется 4 байта. Вычислите количество промахов TLB, если размер страницы равен 4096, а TLB имеет 8 записей с замещающей политикой, состоящей из LRU.

Решение:
1024*(2+1024*1024) = 1073743872
Двоичный файл и стек умещаются на одной странице, поэтому каждый занимает одну запись в TLB. Пока функция работает, она постоянно обращается к двоичной странице и странице стека. Таким образом, две записи TLB для этих двух страниц будут все время находиться в TLB, а данные могут занимать только оставшиеся 6 записей TLB.

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

Поскольку для хранения целого числа требуется 4 байта, а размер страницы составляет 4096 байт, для каждого массива требуется 1024 страницы. Предположим, что каждая строка массива хранится на одной странице. Тогда эти страницы можно представить в виде a[0..1023], b[0..1023], c[0..1023]: Страница a[0] содержит элементы a[0][0..1023], страница a[1] содержит элементы a[1][0..1023] и т. д.

Для фиксированного значения i, скажем, 0, функция выполняет цикл по j и k, у нас есть следующая ссылочная строка:

Для ссылочной строки (всего 1024 строки) a[0], c[0] приведут к двум промахам TLB. Поскольку доступ к a[0] и b[0] будет осуществляться через каждые четыре обращения к памяти, эти две страницы не будут заменены алгоритмом LRU. Для каждой страницы в b[0..1023] каждый раз при доступе к ней будет происходить один промах TLB. Таким образом, количество промахов TLB для второго внутреннего цикла равно
2+1024*1024 = 1048578.

Растровое изображение — это отображение одной системы, например целых чисел, в биты.Он также известен как битовый индекс или битовый массив.

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

Растровое изображение обеспечивает относительно простой способ отслеживания памяти, поскольку размер растрового изображения зависит только от размера памяти и размера единиц.

Изображение, поясняющее использование растрового изображения, выглядит следующим образом:

Растровое изображение, представленное на изображении, записывает 1 для занятой ячейки памяти и 0 для незанятой ячейки памяти. Первые 5 единиц заняты A, и соответствующая запись в растровом изображении — 11111. Следующие три единицы пусты, поэтому их запись в растровом изображении равна 000. После этого 6 единиц занимают B. Таким образом, запись в растровом изображении — 11111. Это продолжается, и результат, полученный в растровом изображении для A, B, C, D и E, показан на изображении.

Ключевые возможности Bitmap

Некоторые важные особенности растрового изображения —

  • Размер блока в растровых изображениях очень важен, и его следует выбирать с осторожностью.
  • Если размер единицы меньше, растровое изображение будет больше, так как оно будет содержать значение 0 или 1 для каждой из единиц. Точно так же, если размер единицы больше, растровое изображение будет меньше.
  • Размер блока не должен быть слишком большим, так как даже при размере блока всего 3 байта только один бит растрового изображения может представлять 24 бита.

Преимущество растрового изображения

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

Недостаток растрового изображения

Основная проблема с растровым изображением возникает, если блок памяти размером «n» должен быть занят процессом. Затем в растровом изображении требуется вакансия размера n, где все значения равны нулю.

Что влияет на размер файла растровых изображений? В этой статье показано, как рассчитать размер несжатых файлов.

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

Что такое размер файла и почему он важен?

Как упоминалось ранее, размеры файлов варьируются от битов, байтов и килобайтов (наименьшие размеры) до (и выше) гигабайтов, терабайтов и петабайтов (более крупные файлы).

В наши дни быстрое подключение к Интернету позволяет нам быстро передавать изображения. Если время передачи важно, изображение должно быть как можно меньше.

Факторы размера файла

Хотите продолжать
учиться?

Представление данных в вычислениях: оживление данных

Чем больше пикселей в изображении, тем больше места вам потребуется для его хранения.

Разрешение

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

Упражнение в классе: найдите решение

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

  1. Нажмите правой кнопкой мыши (или щелкните, удерживая клавишу CTRL, если вы используете Mac) на смайлике выше.
  2. Сохраните изображение на своем компьютере.
  3. Откройте папку с изображением и щелкните его правой кнопкой мыши (Ctrl + щелчок для Mac).
  4. Нажмите на свойства
  5. Найти высоту и ширину изображения
  6. Рассчитать разрешение изображения

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

Антракт: метаданные

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

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

Совет учителю: попросите учащихся подумать о том, какие еще типы метаданных могут собираться различными мобильными приложениями.

Разрядность

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

Представьте себе черно-белое изображение.Каждый пиксель может быть только черным или белым, поэтому мы можем представить это изображение двумя цветами и, следовательно, одним двоичным битом: 1 = белый и 0 = черный.

< td>16
Двоичные биты, доступные для цвета Количество цветов, которые мы можем представить для пикселя
1 2, черно-белое
2 4, например черный, белый и два серых
3 8
4
8 256
16 65536< /td>
24 16,7 млн

Изображения, которые вы делаете с помощью онлайн-приложений, таких как Instagram или Snapchat, скорее всего, будут храниться с глубиной цвета 16 или 24 бита. Это означает, что каждый пиксель может использовать один из 65 536 или 16,7 миллионов цветов соответственно. Вау!

Представьте, что вы работаете в компании по производству воздушных шаров и хотите создать цифровую рекламу, чтобы продемонстрировать все свои замечательные воздушные шары. Рекламу увидят миллионы людей со всего мира. Здесь использование 24 бит (16,7 миллионов цветов) для создания наиболее яркого и точного изображения в вашей рекламе имеет смысл! Качество изображения и небольшой размер файла — две конкурирующие цели, которые должны быть сбалансированы для каждого изображения.

Расчет размера

Размер файла может быть выражен как разрешение (ширина изображения, умноженная на высоту изображения), умноженное на разрядность (количество бит, необходимое для хранения цветов).

Файлы обычно также содержат некоторые метаданные, которые немного увеличивают размер файла, но пока мы их игнорируем.

Задание: Насколько велик ваш смайлик?

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

Как определить/вычислить размер растрового изображения в байтах (после декодирования с помощью BitmapFactory)? Мне нужно знать, сколько памяти он занимает, потому что я занимаюсь кэшированием/управлением памятью в своем приложении. (размера файла недостаточно, так как это файлы jpg/png)

Спасибо за любые решения!

Обновление: getRowBytes * getHeight может помочь. Я буду реализовывать это так, пока кто-нибудь не придумает что-то против этого.

4 ответа 4

getRowBytes() * getHeight() мне кажется работает нормально.

@TharakaNirmana Растровое изображение всегда содержит несжатое изображение. Сжатие используется только для сжатия изображения для сохранения в файл.

У меня есть одно изображение, но если я запускаю его в два разных изображения, то по какой-то причине на обоих устройствах я получаю изображение разного размера? например, в Galaxy S Duos это дает 656 КБ, а в устройстве MOTO G — 1136 КБ

@Kalpesh У вашего Samsung экран hdpi, а мотор - xhdpi, поэтому на этих моделях он загружает ресурсы разного размера. Ознакомьтесь с документацией по плотности отображения Google Display.

Лучше просто использовать библиотеку поддержки:

Но если в вашем проекте Android используется как минимум minSdk из 19 (kitkat, что означает 4,4), вы можете просто использовать bitmap.getAllocationByteCount() .

Я получаю количество выделенных байтов 3145728, используя BitmapCompat.getAlllocationByteCount(scaledBitmap). Но реальный размер 207kB. Что я делаю не так?

@Sniper Реальный размер чего? Если вы имеете в виду размер файла, это имеет смысл, потому что файл сжат. Никто в наши дни не поместит изображение в файл, не перекодировав его в JPG/PNG/WEBP. Файлы не должны иметь тот же размер, что и декодированное изображение. Приблизительное количество байтов для каждого изображения равно width*height*bytesPerPixel , где bytesPerPixel обычно равно 4 или 2. Это означает, что если у вас есть изображение размером 1000x1000, оно может занять около 4*1000*1000= 4 000 000 байт, то есть ~ 4 МБ.< /p>

У меня есть растровое изображение в моем onactivityResult, и я хочу проверить размер изображения и проверить, превышает ли его размер 5 МБ или нет, а затем отправить его на мой сервер, если он меньше 5 МБ, в противном случае предложить пользователю принять новая картинка.

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