Как я могу читать и записывать данные JPEG для каждого пикселя? - PullRequest
5 голосов
/ 07 июля 2010

Название в значительной степени объясняет мой вопрос. Я хотел бы иметь возможность читать и записывать данные JPEG для каждого пикселя на основе C #.

Я думаю о чем-то вроде CreateJPEG(x, y), который установит в памяти пустое изображение JPEG и даст мне объект JPEG, а затем что-то вроде SetPixel(x, y, Color) и GetPixel(x, y), последний из которых будет вернуть Color или что-то подобное. Затем можно вызвать метод Apply() или Save(), например, чтобы сохранить изображение в стандартном формате, читаемом в формате JPEG (желательно с параметрами сжатия, но в этом нет необходимости).

И я предполагаю, что некоторая библиотека C # или пространство имен делают все это очень простым процессом, я просто хотел бы узнать, как лучше всего это сделать.

Ответы [ 2 ]

9 голосов
/ 07 июля 2010

Посмотрите на класс Bitmap.Для продвинутого рисования, кроме манипулирования одним пикселем, вам придется использовать класс Graphics.

var image = new Bitmap("foo.jpg");

var color = image.GetPixel(1, 2);
image.SetPixel(42, 42, Color.White);

image.Save("bar.jpg", ImageFormat.Jpeg);

Как упоминает Лассе В. Карлсен в своем ответе, это не будет реально манипулировать файлом JPEG,Файл JPEG будет распакован, эти данные изображения будут изменены, и при сохранении будет создан новый файл JPEG из измененных данных изображения.

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

Существуют некоторые операции, которые можно выполнять с файлами JPEG, не распаковывая и не сжимая их повторно - например, поворачивая на 90 ° - манипуляции с отдельными пикселями не подходят для этой категории.

8 голосов
/ 07 июля 2010

JPEG - это не формат обработки, это формат хранения.

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

Поэтому я считаю, что вы ищете класс Bitmap в .NET.

...