Чтение подраздела Bitmap с диска в C # - PullRequest
3 голосов
/ 15 июля 2009

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

Есть ли способ прочитать только подраздел (видимую часть) большого изображения, если вы знаете смещения и ширину x и y? Я знаю, что, возможно, это можно сделать, читая файл по байтам за раз, но я не уверен, как это сделать.

Спасибо, Нико

Ответы [ 5 ]

2 голосов
/ 15 июля 2009

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

1 голос
/ 15 июля 2009

Если это файл BMP, он не должен быть таким сложным.

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

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

Класс FileStream имеет то, что вам нужно; Read метод для чтения и Seek метод для перехода к заданной позиции.

1 голос
/ 15 июля 2009

Не могли бы вы разрезать изображение на части заранее?

Разделение его на множество изображений размером 256x256 пикселей означает, что вам нужно всего лишь загрузить пару из них и соединить их вместе на видимом холсте. Чтобы назвать одну реализацию - Google Maps использует эту технику.

1 голос
/ 15 июля 2009

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

0 голосов
/ 15 июля 2009

Это то, что я сделал с растровыми изображениями ...

public BitmapCropBitmap(BitMap fullBitmap, Rectangle rectangle)
{
  return proBitmap.clone(fullBitmap, rectangle, fullBitmap.PixelFormat);
}
...