Чтение данных изображения из JFIF?
Поэтому я читаю данные JFIF (JPEG) из файла в качестве упражнения (я знаю, что есть библиотеки, которые уже делают это, я их не ищу). У меня уже есть размер файла изображения, глубина цвета и размеры. Тем не менее, я не слишком уверен, как получить фактические данные изображения. Я посмотрел на данные в шестнадцатеричном редакторе, и сравнение с реальным изображением меня ни к чему не привело. Если у кого-то есть хороший ресурс, чтобы начать с этого (я знаю, что это, вероятно, трудный и поучительный процесс, но именно поэтому я и делаю это), это было бы здорово.
Мой код пока только для контекста:
// check header data, assign header data to important fields
// Start Of Image (SOI) must be FFD8 and the next marker must be FF
if(!(this.data[0] == (byte) 0xFF && this.data[1] == (byte) 0xD8
&& this.data[2] == (byte) 0xFF))
this.isValid = false;
// check if file is not valid
if(!isValid)
log.log(Level.SEVERE,
String.format("ERROR: File %s is not registered as a JFIF!\n", this.filename),
new IllegalArgumentException());
// If the next values are correct, then the data stream starts at SOI
// If not, the data stream is raw
this.isRawDataStream = !(this.data[3] == (byte) 0xE0
&& this.data[6] == (byte) 0x4A
&& this.data[7] == (byte) 0x46
&& this.data[8] == (byte) 0x49
&& this.data[9] == (byte) 0x46
&& this.data[10] == (byte) 0x00);
// Read until SOF0 marker (0xC0)
int i = 11;
while(this.data[i] != (byte) 0xC0) {
i++;
}
System.out.println("SOF0 marker at offset " + i);
// Skip two bytes, next byte is the color depth
this.colorDepth = this.data[i+3];
// Next two bytes are the image height
String h = String.format("%02X", this.data[i+4]) + String.format("%02X", this.data[i+5]);
this.height = hexStringToInt(h);
System.out.println("Height: " + this.height);
// Next two bytes are the image width
String w = String.format("%02X", this.data[i+6]) + String.format("%02X", this.data[i+7]);
this.width = hexStringToInt(w);
System.out.println("Width: " + this.width);
System.out.println("Color depth: " + this.colorDepth);
// load pixels into an image
this.image = new BufferedImage(this.width,
this.height,
BufferedImage.TYPE_INT_RGB);
Затем мне нужно получить каждый пиксель и отправить его на изображение. Как бы я получил каждый пиксель и соответствующие ему данные RGB?
1 ответ
То, что вы пытаетесь сделать, - это не простой дневной проект. Эта книга объясняет процесс: существует много кода между сжатыми данными JPEG и значениями пикселей.
http://www.amazon.com/Compressed-Image-File-Formats-JPEG/dp/0201604434/ref=pd_bxgy_b_img_y
Прежде всего, вы должны иметь дело с двумя отдельными, но связанными методами сжатия: последовательным и прогрессивным.
Когда вы читаете битовые данные, вы должны
- Декодер Хаффмана
- Выполнить декодирование длины
- Обратное квантование
- Элемент списка
- Обратное дискретное косинусное преобразование
- До образца
- YCbCr в RGB конвертировать
Это в простом последовательном случае.
Вы не собираетесь объяснять все эти шаги на этом форуме.
Я тоже рекомендую