gacar Ответов: 2

Как читать байты из данных файла (передающий заголовок)


Я хочу передать раздел заголовка и получить байты только содержимого файла. Например, я хочу читать только RGB-байты из bmp-файла или jpg-файла; или я хочу читать только текстовое содержимое из txt-файла. Как я могу получить байты контента.

Файл.ReadAllBytes("C:\\a.jpg")

Это метод чтения с заголовками. Мне не нужен раздел заголовков.

Спасибо

Что я уже пробовал:

Способ Марсал. Но это было трудно.

F-ES Sitecore

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

gacar

Если так, то очень плохо. Знаете ли вы, как я могу получить список файловых структур. А список есть?

Eric Lynch

В случае файлов ".jpg": https://en.wikipedia.org/wiki/JPEG

F-ES Sitecore

Вы можете найти структуры популярных форматов, погуглив их.

Richard MacCutchan

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

Eric Lynch

В качестве предложения, вы открыты для другого подхода? Можно и впустить .NET делает большую часть тяжелой работы для вас, декодируя формат файла, и все еще имеет доступ к значениям RGB для пикселей, составляющих изображение. Или вы настроены на чтение изображения байт за байтом из файла?

gacar

Он может быть доступен для файлов изображений с классом Marshal в .Net

Eric Lynch

Не обязательно нужен Маршал. Следующее немного медленно, но работает.

int x = 0;
int y = 0;
var bitmap = изображение.FromFile(@"pic.jpg") как растровое изображение;
Color color = растровое изображение.GetPixel(x, y);
байт красный = color.R;
байт зеленый = цвет.G;
байт синий = цвет.B;

Немного быстрее (что действительно требует Маршала) описано здесь:

https://stackoverflow.com/questions/7373703/c-sharp-getting-the-pixel-data-efficiently-from-system-drawing-bitmap

WPF также имеет некоторые эквиваленты System.Рисунок, который может быть лучше.

2 Ответов

Рейтинг:
16

OriginalGriff

Вы не можете прочитать формат RGB непосредственно из файла JPG - он использует метод сжатия с потерями, который означает, что каждое значение пикселя в изображении непосредственно не представлено значением в файле JPG.

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


gacar

Спасибо за ваш комментарий.

OriginalGriff

Всегда пожалуйста!

Рейтинг:
11

Dave Kreskowiak

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

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

Не все файлы имеют заголовок, и никакая информация заголовка не имеет одинакового формата, одинаковой длины и одинаковой цели.

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

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


gacar

Спасибо за ваш комментарий.