Лучшее качество BMP или JPEG?
Файлы формата BMP представляют собой несжатые растровые изображения, а файлы формата JPG представляют собой сжатые цифровые изображения. 3. Изображения в формате BMP имеют более высокое разрешение, чем изображения JPG. … Изображения BMP имеют более высокое качество, чем изображения JPG.
Что лучше JPEG, PNG или BMP?
Формат JPG представляет собой сжатый файл с потерями. Это делает его полезным для хранения фотографий меньшего размера, чем BMP. … Для хранения штриховых рисунков, текста и графических значков в файле меньшего размера GIF или PNG являются лучшим выбором, поскольку они не имеют потерь.
Является ли файл BMP высоким разрешением?
BMP или Bitmap Image File — это формат, разработанный Microsoft для Windows. В файлах BMP отсутствует сжатие или потеря информации, что позволяет изображениям иметь очень высокое качество, но также и очень большие размеры файлов. Поскольку BMP является проприетарным форматом, обычно рекомендуется использовать файлы TIFF.
(3) Bitmap : 이미지 파일 3개 사용
Какой формат изображения самого высокого качества?
TIFF — формат изображения самого высокого качества
TIFF (формат файлов изображений с тегами) обычно используется стрелками и дизайнерами. Это без потерь (включая вариант сжатия LZW). Итак, TIFF называется форматом изображений высочайшего качества для коммерческих целей.
В чем разница между JPEG и растровым изображением?
Растровое изображение — это формат файла изображения, который используется для хранения цифровых изображений. Слово bitmap означает карту битов. Они используются для создания реалистичной графики и изображений. .
.
Битовая карта:
1 | Это расшифровывается как Joint Photographic Experts Group. | Это расшифровывается как Map of Bits. |
Почему PNG плохой?
Одна из выдающихся особенностей PNG — это поддержка прозрачности. Как для цветных изображений, так и для изображений в градациях серого пиксели в файлах PNG могут быть прозрачными.
.
PNG.
Сжатие без потерь | Размер файла больше, чем у JPEG |
Поддержка прозрачности | Нет встроенной поддержки EXIF |
Отлично подходит для текста и скриншотов |
Каковы недостатки БМП?
BMP: растровое изображение Windows
Неотъемлемая часть Windows | Вывод больших файлов даже после сжатия |
Большой цветовой спектр | |
Просто структурировано |
Лучшее качество BMP или PNG?
Между форматами BMP и PNG нет разницы в качестве (за исключением того, что PNG сжимается с использованием алгоритма deflate).
BMP формат (пример кода)
Какой формат JPEG лучше?
В качестве общего ориентира: качество JPEG 90 % дает изображение очень высокого качества при значительном уменьшении исходного размера файла 100 %. Качество JPEG 80% обеспечивает большее уменьшение размера файла практически без потери качества.
Почему файлы BMP такие большие?
BMP — это формат изображения, разработанный Microsoft для операционной системы Windows, который характеризуется большими размерами файлов. Файлы BMP не сжимаются и не теряют деталей при сохранении, но могут быстро занимать много места на жестком диске.
Какое лучшее качество фото?
Какой формат изображения для вас самый качественный?
- Формат JPEG. JPEG (Joint Photographic Experts Group) — самый популярный формат изображений. …
- RAW-формат. Файлы RAW — это формат изображения самого высокого качества. …
- формат ТИФФ. TIFF (Tagged Image File Format) — это формат изображения без потерь. …
- Формат PNG. …
- Формат PSD.
PNG или JPEG более высокого качества?
Как правило, PNG является форматом сжатия более высокого качества. Изображения JPG обычно имеют более низкое качество, но быстрее загружаются.
Какое самое высокое разрешение фото?
Прага 400 гигапикселей (2018)
Это фотография с самым высоким разрешением, которую я когда-либо делал, и одна из немногих самых больших фотографий, когда-либо созданных кем-либо. Это фото имеет ширину 900,000 7000 пикселей и состоит из более чем XNUMX XNUMX отдельных изображений.
Какой файл меньше JPEG или BMP?
Размеры файлов намного меньше, чем BMP, потому что на самом деле используется хорошее сжатие, но он может хранить только индексированную палитру. Это означает, что в файле может быть максимум 256 различных цветов.
Являются ли растровые изображения пикселизированными?
В компьютерной графике пикселизация (или пикселизация в британском английском) вызывается отображением растрового изображения или части растрового изображения такого большого размера, что видны отдельные пиксели, небольшие одноцветные квадратные элементы отображения, составляющие растровое изображение. Такое изображение называется пиксельным (пиксельным в Великобритании).
Что такое JPEG против PNG?
PNG означает переносимую сетевую графику с так называемым сжатием без потерь. … JPEG или JPG расшифровываются как Объединенная группа экспертов по фотографии с так называемым сжатием с потерями. Как вы могли догадаться, это самая большая разница между ними. Качество файлов JPEG значительно ниже, чем у файлов PNG.
Источник: frameboxxindore.com
Работа с растром на низком уровне для начинающих
Поводом для данной статьи стал следующий пост: «Конвертация bmp изображения в матрицу и обратно для дальнейшей обработки». В свое время, мне немало пришлось написать исследовательского кода на C#, который реализовывал различные алгоритмы сжатия, обработки. То, что код исследовательский, я упомянул не случайно. У этого кода своеобразные требования.
С одной стороны, оптимизация не очень важна – ведь важно проверить идею. Хотя и хочется, чтобы эта проверка не растягивалась на часы и дни (когда идет запуск с различными параметрами, либо обрабатывается большой корпус тестовых изображений). Примененный в вышеупомянутом посте способ обращения к яркостям пикселов bmp.GetPixel(x, y) – это то, с чего начинался мой первый проект.
Это самый медленный, хотя и простой способ. Стоит ли тут заморачиваться? Давайте, замерим.
Использовать будем классический Bitmap (System.Drawing.Bitmap). Данный класс удобен тем, что скрывает от нас детали кодирования растровых форматов – как правило, они нас и не интересуют. При этом поддерживаются все распространенные форматы, типа BMP, GIF, JPEG, PNG.
Кстати, предложу для начинающих первую пользу. У класса Bitmap есть конструктор, который позволяет открыть файл с картинкой. Но у него есть неприятная особенность – он оставляет открытым доступ к этому файлу, поэтому повторные обращения к нему приводят к эксепшену. Чтобы исправить это поведение, можно использовать такой метод, заставляющий битмап сразу «отпустить» файл:
public static Bitmap LoadBitmap(string fileName)
Методика замеров
Замерять будем, перегоняя в массив и обратно в Bitmap классику обработки изображений – Лену (http://en.wikipedia.org/wiki/Lenna). Это свободное изображение, его можно встретить в большом количестве работ по обработке изображений (и в заголовке данного поста тоже). Размер – 512*512 пикселов.
Немного о методике – в таких случаях я предпочитаю не гоняться за сверхточными таймерами, а просто много раз выполнять одно и то же действие. Конечно, с одной стороны, в этом случае данные и код уже будут в кэше процессора. Но, зато мы вычленяем затраты на первый запуск кода, связанный с переводом MSIL-кода в код процессора и другие накладные расходы. Чтобы гарантировать это, предварительно запускаем каждый кусок кода один раз – выполняем так называемый «прогрев».
Компилируем код в Release. Запускаем его обязательно не из-под студии. Более того, студию также желательно закрыть – сталкивался со случаями, когда сам факт её «запущенности» иногда сказывается на полученных результатах. Также, желательно закрыть и другие приложения.
Запускаем код несколько раз, добиваясь типичных результатов – необходимо убедиться, что на нем не сказывается какой-то неожиданный процесс. Скажем, проснулся антивирус или еще что-то. Все эти меры позволяют нам получить стабильные, повторяемые результаты.
«Наивный» метод
Именно этот метод был применен в оригинальной статье. Он состоит в том, что используется метод Bitmap.GetPixel(x, y). Приведем полностью код подобного метода, который конвертирует содержимое битмапа в трехмерный байтовый массив. При этом первая размерность – это цветовая компонента (от 0 до 2), вторая – позиция y, третья – позиция x. Так сложилось в моих проектах, если вам захочется расположить данные иначе – думаю, проблем не возникнет.
public static byte[, ,] BitmapToByteRgbNaive(Bitmap bmp) < int width = bmp.Width, height = bmp.Height; byte[, ,] res = new byte[3, height, width]; for (int y = 0; y < height; ++y) < for (int x = 0; x < width; ++x) < Color color = bmp.GetPixel(x, y); res[0, y, x] = color.R; res[1, y, x] = color.G; res[2, y, x] = color.B; >> return res; >
Обратное преобразование аналогично, только перенос данных идет в другом направлении. Я не буду приводить его код здесь – желающие могут посмотреть в исходных кодах проекта по ссылке в конце статьи.
100 преобразований в изображение и обратно на моем ноутбуке с процессором I5-2520M 2.5GHz, требуют 43.90 сек. Получается, что при изображении 512*512, только на перенос данных, тратится порядка полусекунды!
Прямая работа с данными Bitmap
К счастью, класс Bitmap предоставляет более быстрый способ обратиться к своим данным. Для этого нам необходимо воспользоваться ссылками, предоставляемыми классом BitmapData и адресной арифметикой:
public unsafe static byte[, ,] BitmapToByteRgb(Bitmap bmp) < int width = bmp.Width, height = bmp.Height; byte[, ,] res = new byte[3, height, width]; BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); try < byte* curpos; for (int h = 0; h < height; h++) < curpos = ((byte*)bd.Scan0) + h * bd.Stride; for (int w = 0; w < width; w++) < res[2, h, w] = *(curpos++); res[1, h, w] = *(curpos++); res[0, h, w] = *(curpos++); >> > finally < bmp.UnlockBits(bd); >return res; >
Такой подход дает нам получить 0.533 секунды на 100 преобразований (ускорились в 82 раза)! Думаю, это уже отвечает на вопрос – а стоит ли писать более сложный код преобразования? Но можем ли мы еще ускорить процесс, оставаясь в рамках managed-кода?
Массивы vs указатели
Многомерные массивы являются не самыми быстрыми структурами данных. Здесь производятся проверки на выход за пределы индекса, сам элемент вычисляется, используя операции умножения и сложения. Поскольку адресная арифметика уже дала нам один раз существенное ускорение при работе с данными Bitmap, то может быть, попробуем её применить и для многомерных массивов? Вот код прямого преобразования:
public unsafe static byte[, ,] BitmapToByteRgbQ(Bitmap bmp) < int width = bmp.Width, height = bmp.Height; byte[, ,] res = new byte[3, height, width]; BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); try < byte* curpos; fixed (byte* _res = res) < byte* _r = _res, _g = _res + width*height, _b = _res + 2*width*height; for (int h = 0; h < height; h++) < curpos = ((byte*)bd.Scan0) + h * bd.Stride; for (int w = 0; w < width; w++) < *_b = *(curpos++); ++_b; *_g = *(curpos++); ++_g; *_r = *(curpos++); ++_r; >> > > finally < bmp.UnlockBits(bd); >return res; >
Результат? 0.162 сек на 100 преобразований. Так что ускорились еще в 3.3 раза (270 раз по сравнению с «наивной» версией). Именно подобный код и использовался мною при исследованиях алгоритмов.
Зачем вообще переносить?
Не совсем очевидно, а зачем вообще переносить данные из Bitmap. Может вообще, все преобразования осуществлять именно там? Соглашусь, что это один из возможных вариантов. Но, дело в том, что многие алгоритмы удобнее проверять на данных с плавающей запятой. Тогда нет проблем с переполнениями, потерей точности на промежуточных этапах.
Преобразовать в double/float-массив можно аналогичным способом. Обратное преобразование требует проверки при конвертации в byte. Вот простой код такой проверки:
private static byte Limit(double x) < if (x < 0) return 0; if (x >255) return 255; return (byte)x; >
Добавление таких проверок и преобразование типов замедляет наш код. Версия с адресной арифметикой на double-массивах исполняется уже 0.713 сек (на 100 преобразований). Но на фоне «наивного» варианта – она просто молния.
А если нужно быстрее?
Если нужно быстрее, то пишем перенос, обработку на C, Asm, используем SIMD-команды. Загружаем растровый формат напрямую, без обертки Bitmap. Конечно, в этом случае мы выходим за пределы Managed-кода, со всеми вытекающими плюсами и минусами. И делать это имеет смысл для уже отлаженного алгоритма.
- Порядок данных точно такой же, как и в оригинальном Bitmap. Т.е., компоненты перемешаны. Если мы хотим их отделить друг от друга — нужно будет все-равно проходиться циклом по массиву, копируя данные.
- Тип у яркости остается byte, в то же время, часто бывает удобно промежуточные вычисления выполнять с плавающей запятой.
- Marshal.Copy() работает с одномерными массивами. Да, они конечно самые быстрые и не очень сложно везде писать rgb[x+width*y], но все-таки.
Update 2016-04-25:
Пользователь Ant00 указал на ошибку в коде метода BitmapToByteRgbQ. Она не сказывалась на времени, но перекладывание осуществлялось неправильно. Была ошибка при копипасте фрагментов из работающего кода. Поправил. Спасибо за настойчивость (не с первого раза я внимательно рассмотрел код в статье, которой уже 2.5 года).
Источник: habr.com
Bitmap Image Класс
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет специальный объект BitmapSource, оптимизированный для загрузки изображений с помощью языка XAML.
public ref class BitmapImage sealed : System::Windows::Media::Imaging::BitmapSource, System::ComponentModel::ISupportInitialize, System::Windows::Markup::IUriContext
public sealed class BitmapImage : System.Windows.Media.Imaging.BitmapSource, System.ComponentModel.ISupportInitialize, System.Windows.Markup.IUriContext
type BitmapImage = class inherit BitmapSource interface ISupportInitialize interface IUriContext
Public NotInheritable Class BitmapImage Inherits BitmapSource Implements ISupportInitialize, IUriContext
Наследование
BitmapImage
Реализации
Примеры
В следующих примерах кода показано, как использовать язык разметки приложений BitmapImage (XAML) и код.
‘ Create the image element. Dim simpleImage As New Image() simpleImage.Width = 200 simpleImage.Margin = New Thickness(5) ‘ Create source. Dim bi As New BitmapImage() ‘ BitmapImage.UriSource must be in a BeginInit/EndInit block. bi.BeginInit() bi.UriSource = New Uri(«/sampleImages/cherries_larger.jpg», UriKind.RelativeOrAbsolute) bi.EndInit() ‘ Set the image source. simpleImage.Source = bi
Комментарии
BitmapImage в первую очередь существует для поддержки синтаксиса языка разметки приложений (XAML) и содержит дополнительные свойства для загрузки растровых изображений, которые не определены BitmapSource.
BitmapImageISupportInitialize реализует интерфейс для оптимизации инициализации нескольких свойств. Изменения свойств происходят только во время инициализации объекта. Вызов BeginInit сигнала о начале инициализации и сигнал о завершении инициализации EndInit . После инициализации изменения свойств игнорируются.
BitmapImage объекты, созданные с помощью конструктора BitmapImage , автоматически инициализируются, и изменения свойств игнорируются.
Конструкторы
Инициализирует новый экземпляр класса BitmapImage.
Инициализирует новый экземпляр BitmapImage, используя предоставленный Uri.
Инициализирует новый экземпляр BitmapImage с изображением, источником коего является Uri, и кэшируемого в соответствии с предоставленным RequestCachePolicy.
Поля
Идентифицирует свойство зависимостей CacheOption.
Идентифицирует свойство зависимостей CreateOptions.
Идентифицирует свойство зависимостей DecodePixelHeight.
Идентифицирует свойство зависимостей DecodePixelWidth.
Идентифицирует свойство зависимостей Rotation.
Идентифицирует свойство зависимостей SourceRect.
Идентифицирует свойство зависимостей StreamSource.
Идентифицирует свойство зависимостей UriCachePolicy.
Идентифицирует свойство зависимостей UriSource.
Свойства
Получает или задает значение, представляющее базовый Uri текущего контекста BitmapImage.
Получает или задает BitmapCacheOption для использования данным экземпляром BitmapImage.
Возвращает значение, которое указывает, можно ли сделать объект неизменяемым.
Возвращает или задает высоту декодированного изображения в пикселях.
Возвращает или задает ширину декодированного изображения в пикселях.
Возвращает объект DependencyObjectType , который заключает в оболочку тип среды CLR данного экземпляра.
Возвращает объект Dispatcher, с которым связан этот объект DispatcherObject.
Получает горизонтальные точки на дюйм (dpi) изображения.
Возвращает вертикальные точки на дюйм изображения.
Возвращает исходный формат PixelFormat данных растрового изображения.
Возвращает значение, которое указывает, сопоставлены ли один или несколько объектов AnimationClock любому из свойств зависимостей этого объекта.
Получает высоту исходного растрового изображения в независимых от устройства единицах (1/96-й дюйм на единицу).
Получает значение, указывающее, производит ли BitmapImage в данный момент загрузку содержимого.
Получает значение, указывающее, доступен ли объект для изменения в настоящее время.
Получает значение, указывающее, является ли этот экземпляр в данный момент запечатанным (доступным только для чтения).
Не поддерживается. BitmapImage не поддерживает свойство Metadata и создает исключение NotSupportedException.
Получает цветовую палитру растрового изображения, если она задана.
Получает высоту растрового изображения в пикселях.
Получает ширину растрового изображения в пикселях.
Получает или задает угол для поворота BitmapImage.
Получает или задает прямоугольник, который используется в качестве источника для BitmapImage.
Получает или задает исходный поток BitmapImage.
Получает или задает значение, представляющее текущую политику кэширования изображений из источника HTTP.
Получает или задает источник Uri для BitmapImage.
Получает ширину растрового изображения в независимых от устройства единицах (1/96-й дюйм на единицу).
Методы
Применяет AnimationClock к заданному DependencyProperty. Если свойство уже анимировано, используется эстафетное поведение SnapshotAndReplace.
Применяет AnimationClock к заданному DependencyProperty. Если свойство уже является анимированным, используется указанное поведение HandoffBehavior.
Применяет анимацию к указанному DependencyProperty. Анимация начинается при отрисовке следующего кадра. Если указанное свойство уже анимировано, используется поведение перемещения SnapshotAndReplace.
Применяет анимацию к указанному DependencyProperty. Анимация начинается при отрисовке следующего кадра. Если указанное свойство уже является анимированным, используется указанное поведение HandoffBehavior.
Сигнализирует о начале инициализации объекта BitmapImage.
Определяет, имеет ли вызывающий поток доступ к этому DispatcherObject.
Проверяет, получено ли исходное содержимое точечного рисунка из известного узла источника. Этот метод позволяет проверить безопасность операций копирования пикселей.
Очищает локальное значение свойства. Очищаемое свойство задается идентификатором DependencyProperty.
Очищает локальное значение доступного только для чтения свойства. Очищаемое свойство задается ключом DependencyPropertyKey.
Создает изменяемый клон данного объекта BitmapImage, делая глубокие копии значений этого объекта.
Делает этот экземпляр глубокой копией указанного объекта BitmapSource. При копировании свойств зависимостей этот метод копирует ссылки на ресурсы и привязки данных (которые могут уже не быть разрешимыми), но не копирует анимации и их текущие значения.
Создает модифицируемый клон данного объекта BitmapImage, делая глубокие копии текущих значений этого объекта. Ссылки на ресурсы, привязки данных и анимации не копируются, но копируются их текущие значения.
Делает этот экземпляр изменяемой глубокой копией указанной коллекции BitmapSource с использованием текущих значений свойств. Ссылки на ресурсы, привязки данных и анимации не копируются, но копируются их текущие значения.
Приводит значение указанного свойства зависимостей. Это осуществляется путем вызова какой-либо функции CoerceValueCallback, указанной в метаданных свойства зависимостей, которое существует в вызывающем объекте DependencyObject.
Копирует данные пикселей растрового изображения в массив пикселей с заданным шагом начиная с заданного смещения.
Копирует данные пикселей растрового изображения из заданного прямоугольника в массив пикселей с заданным шагом начиная с заданного смещения.
Копирует данные пикселей растрового изображения в пределах заданного прямоугольника.
Инициализирует новый экземпляр класса Freezable.
Если реализуется в производном классе, создает новый экземпляр производного класса Freezable.
Сигнализирует о завершении инициализации объекта BitmapImage.
Определяет, является ли указанный DependencyObject эквивалентом текущего DependencyObject.
Делает текущий объект неизменяемым и присваивает его свойству IsFrozen значение true .
Делает экземпляр BitmapSource или производный класс постоянным.
Возвращает не анимированное значение указанного объекта DependencyProperty.
Создает фиксированную копию объекта Freezable, используя базовые (не анимационные) значения свойств. Так как копия является фиксированной, копируются только ссылки на фиксированные вложенные объекты.
Делает этот экземпляр клоном указанного объекта BitmapSource.
Создает фиксированную копию объекта Freezable с использованием текущих значений свойств. Так как копия является фиксированной, копируются только ссылки на фиксированные вложенные объекты.
Делает этот экземпляр зафиксированным клоном указанного объекта BitmapSource. Ссылки на ресурсы, привязки данных и анимации не копируются, но копируются их текущие значения.
Возвращает хэш-код для данного объекта DependencyObject.
Создает специализированный перечислитель для определения свойств зависимостей, которые локально установили значения для данного DependencyObject.
Возвращает объект Type для текущего экземпляра.
Возвращает текущее действующее значение свойства зависимостей в этом экземпляре DependencyObject.
Повторно вычисляет действующее значение для указанного свойства зависимостей.
Создает неполную копию текущего объекта Object.
Вызывается при изменении текущего объекта Freezable.
Обеспечивает создание соответствующих указателей контекста для элемента данных типа DependencyObjectType, который был только что задан.
Этот элемент поддерживает инфраструктуру Windows Presentation Foundation (WPF) и не предназначен для использования непосредственно из кода.
Переопределяет реализацию DependencyObject для OnPropertyChanged(DependencyPropertyChangedEventArgs), чтобы также вызвать любой обработчик Changed в ответ на изменение свойства зависимостей типа Freezable.
Возвращает локальное значение свойства зависимостей, если таковое существует.
Обеспечивает доступ к Freezable из допустимого потока. Наследники объекта Freezable должны вызывать данный метод в начале любого API, который считывает элементы данных, не являющиеся свойствами зависимостей.
Задает значение свойства зависимостей, не меняя источник значения.
Задает локальное значение свойства зависимостей, указанного идентификатором этого свойства.
Задает локальное значение свойства зависимости только для чтения, определяемое идентификатором DependencyPropertyKey свойства зависимостей.
Возвращает значение, которое указывает, следует ли процессам сериализации выполнять сериализацию значения для предоставленного свойства зависимостей.
Создает строковое представление данного объекта на базе языка и региональных параметров.
Создает строковое представление данного объекта на основе переданного объекта IFormatProvider. Если значение поставщика равно null , используется CurrentCulture.
Обеспечивает наличие у вызывающего потока доступ к этому DispatcherObject.
Вызывает событие Changed для объекта Freezable и вызывает его метод OnChanged(). Классы, производные от Freezable, должны вызывать этот метод в конце любого API, который изменяет члены класса, не сохраненные в виде свойств зависимостей.
Проверяет, что объект Freezable не заморожен и доступ к нему осуществляется из допустимого контекста потока. Наследники объекта Freezable должны вызывать данный метод в начале любого API, который выполняет запись в элементах данных, не являющихся свойствами зависимостей.
События
Происходит, когда изменяется класс Freezable или объект, который входит в его состав.
Происходит при неудаче загрузки изображения вследствие повреждения его заголовка.
Происходит при полном завершении загрузки содержимого точечного рисунка.
Происходит при невозможности загрузки содержимого точечного рисунка.
Происходит при изменении состояния хода загрузки содержимого точечного рисунка.
Явные реализации интерфейса
Форматирует значение текущего экземпляра, используя указанный формат.
Применяется к
См. также раздел
- BitmapSource
- ISupportInitialize
Источник: learn.microsoft.com
.BITMAP Расширение файла
Расширение файла BITMAP связано с X Window System, компьютерной системой программного обеспечения и сетевым протоколом, который обеспечивает основу для графических пользовательских интерфейсов (GUI) и широкие возможности устройств ввода для сетевых компьютеров.
В файле .BITMAP хранится графическое изображение.
Его можно просматривать в программе для управления и редактирования изображений XnView.
Программы, открывающие .BITMAP файлы
Pierre-Emmanuel Gougelet
Как открыть файл .BITMAP?
Если у вас возникли проблемы с открытием файла BITMAP, то в большинстве случаев проблема заключается только в отсутствии установленного соответствующего приложения. Выберите одну из программ из списка и установите ее на свое устройство. Операционная система должна автоматически связать формат файла BITMAP с установленной программой. Если нет, щелкните правой кнопкой мыши файл BITMAP и выберите его в меню. «Открыть с» . Затем выберите установленную программу и подтвердите операцию. Теперь все файлы BITMAP должны автоматически открываться выбранной программой.
Похожие файлы
- .BI Расширение файла Microsoft Visual Basic For DOS Include
- .BI? Расширение файла LoseThos Binary Executable
- .BIB Расширение файла BibTeX Bibliography Database
- .BIBTEX Расширение файла BibTeX Document
- .BIC Расширение файла Civilization 3 Scenario Format
- .BID Расширение файла BidMaker
- .BIDLIST Расширение файла Bulk Image Downloader Data Format
- .BIDQUEUE Расширение файла Bulk Image Downloader Queue Format
Источник: files.support
WPF, работа с изображениями. BitmapImage, BitmapSource, BitmapFrame, и их отличия
Я запутался в них.
1. В чем разница между BitmapImage, BitmapSource, BitmapFrame в общих чертах (если языком попроще MSDN) ? Можете наглядный пример привести? Вроде понятно, но ни хрена не понятно.
Многие поля этих классов одинаковые, это тоже сбивает с толку.
2. BitmapSource — «Представляет одиночный, постоянный набор пикселей определённого размера и разрешения.» Что имеется в виду под «одиночный» ? «постоянный» ?
3. BitmapFrame — «Представляет данные изображения, возвращаемые декодером и принимаемые кодировщиками.» Какие такие «данные изображения»?
Добавлено через 33 минуты
4. В коде логичнее BitmapSource использовать? BitmapImage — вроде как «для загрузки с помощью XAML», хотя я и не очень понимаю, что имеется в виду.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Сделать скриншот рабочего стола в формате BitmapSource(BitmapImage)
Делаю скриншот c помощью WinAPI, на выходе получаю Bitmap. Если делать скриншот каждую секунду, а.
Работа с изображениями в WPF
Не совсем понимаю логику разработчиков. Нужен талчок ((( Для одной из домашек пишу пятнашки.
[WPF] Работа со ScrollViewer и изображениями
Доброго дня! Сейчас мне надо сделать что-то вроде витрины изображений, которую можно было бы.
Работа с изображениями Entity Framework и WPF
Имеется БД пациентов в SQL Server. Приложение создается в WPF с применением EF. В таблице.
4604 / 2025 / 359
Регистрация: 17.03.2012
Сообщений: 10,079
Записей в блоге: 6
BitmapSource — это просто набор пикселей.
То есть, если формируете картинку из пикселей, работаете с ним.
BitmapImage — как следует из описания, его оптимизированный для xaml наследник (я, кстати, не знал про него, полезно на будущее).
Всё это — исключительно для работы в памяти. А вот если вам надо работать с файлами, т.е. читать-писать, то тут уже в дело идут файлы, а следовательно — и их форматы (jpg, png и др.).
Для работы с ними есть специальные классы, енкодеры-декодеры, но передавать им надо BitmapFrame.
Регистрация: 11.05.2013
Сообщений: 225
BitmapSource — это просто набор пикселей.
То есть, если формируете картинку из пикселей, работаете с ним.
BitmapImage — как следует из описания, его оптимизированный для xaml наследник (я, кстати, не знал про него, полезно на будущее).
Всё это — исключительно для работы в памяти. А вот если вам надо работать с файлами, т.е. читать-писать, то тут уже в дело идут файлы, а следовательно — и их форматы (jpg, png и др.).
Для работы с ними есть специальные классы, енкодеры-декодеры, но передавать им надо BitmapFrame.
В теории вроде понятно, но на практике не очень представляю как делать.
Можете еще подсказать с организацией работы приложения?
В один контейнер загружается изображение из файла *.bmp. Изображение шифруется с помощью шифра Цезаря и выводится попиксельно во второй контейнер. Потом дешифруется и выводится в третий контейнер.
Где что использовать — не очень пойму. Раз BitmapSource — набор пикселей, значит шифровать надо, определенно его. Но с чем лучше работать при получении изображения из файла? И выводить на форму лучше BitmapSource напрямую?
4604 / 2025 / 359
Регистрация: 17.03.2012
Сообщений: 10,079
Записей в блоге: 6
У меня есть пример только для BitmapSource (динамическая генерация в программе) и показ его в контроле Image. Если нужно — запощу.
Добавлено через 25 секунд
Для BitmapFrame есть пример в хелпе, вроде там понятно всё.
Регистрация: 11.05.2013
Сообщений: 225
У меня есть пример только для BitmapSource (динамическая генерация в программе) и показ его в контроле Image. Если нужно — запощу.
Да, можете кинуть код с отображением в Image, пожалуйста? С этим тоже проблемы.
4604 / 2025 / 359
Регистрация: 17.03.2012
Сообщений: 10,079
Записей в блоге: 6
Ну, собстно, вот.
var colorarr = VisualService.service_ArrayToColorArray(adata.data, adata.fsource.regular_data); imgMain.Source = VisualService.service_ArrayToImage(colorarr);
где imgMain — это контрол Image, colorarr — массив цветов Color[,].
Функция по формированию Source:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
public static ImageSource service_ArrayToImage(Color[,] acolors) { var xcount = acolors.GetLength(0); var ycount = acolors.GetLength(1); var stride = (xcount * 3 + (xcount % 4)); byte[] pixels = new byte[ycount * stride]; for (var x = 0; x xcount; x++) for (var y = 0; y ycount; y++) { Color color = Colors.Black; // error color.R = acolors[x, y].R; //bp; // r color.G = acolors[x, y].G; ; //global color.B = acolors[x, y].B; ; // b pixels[y * stride + x * 3 + 0] = color.R; pixels[y * stride + x * 3 + 1] = color.G; pixels[y * stride + x * 3 + 2] = color.B; } var result = BitmapSource.Create(xcount, ycount, 96, 96, PixelFormats.Rgb24, BitmapPalettes.WebPalette, pixels, stride); return result; }
Добавлено через 2 минуты
И ещё вариант, уж не помню, какой там у меня в работе.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
public static ImageSource service_ArrayToImage(float[,] aarray) { var xcount = aarray.GetLength(0); var ycount = aarray.GetLength(1); var stride = (xcount * 3 + (xcount % 4)); var q = (from float v in aarray select v); float maxarr = q.Max(); byte[] pixels = new byte[ycount * stride]; for (var x = 0; x xcount; x++) for (var y = 0; y ycount; y++) { var bp = (byte)Math.Round(aarray[x, y] / maxarr * 255.0); for (var px = 0; px 3; px++) pixels[y * stride + x * 3 + px] = bp; } var result = BitmapSource.Create(xcount, ycount, 96, 96, PixelFormats.Rgb24, BitmapPalettes.WebPalette, pixels, stride); return result; }
Источник: www.cyberforum.ru