#include "IJL\ijl.h"
#pragma comment( lib, "IJL\\ijl15.lib" )
JPEG взгляд изнутри
Есть задача написать программу. Программа принимает на вход jpeg файл(для начала, потом всё усложнится до захвата изображения в веб-камеры) и анализирует его, а именно должна выдавать цвет каждого пикселя в RGB.
Есть ряд вопросов: Как jpeg выглядит изнутри? Как его разобрать посредствам С++?(Когда разберусь с внутренней архитектурой типа, разобрать не будет сложно, больше интересует, как посредствам кода вытащить из файла все "патраха").
На выходе должна получиться матрица, каждый её элемент есть структура в которой прописан цвет каждого пикселя в RGB.
Заранее всем огромное спасибо)))
Может не запариваться с разбором файла "на запчасти" а вместо этого существует какой компонент для билдера, пригодный для моих целей?
Раздельчиком промахнулся мальца :eek:
Например вот:
http://sources.codenet.ru/download/146/jpeg-40.html
Под что она? Под студию или под билдер? Как её установить?
Вот тут есть библиотека:
Под что она? Под студию или под билдер? Как её установить?
ну скачай да глянь ))) нам то откуда знать. или майку напиши - его ж исходники =)
Когда то занимался подобным вопросом, использовал Intel JPEG Library (IJL), нареканий не было. если интересует, набери в яндексе и скачай, распространяется она по моему свободно.
Почитал всякую инфу...действительно, есть над чем подумать... А если вместо jpeg на вход программе подать bmp, там ведь, на сколько я знаю, никакого сжатия, да и структура внутренняя довольно простая, верно?
Цитата: DarkLord-1985
Intel JPEG Library (IJL)
IJL это конечно хорошо, ток вот что-то там мудрено всё... Разобраться конечно можно, но ведь должен быть способ проще или библиотеки не такие навароченные)))
[highlight=delphi]
for X := 0 to Image.Width - 1
begin
for Y := 0 to Image.Height - 1
begin
Writeln('Пиксель (' + IntToStr(X) + ', ' + IntToStr(Y) + '): ' + ColorToStr(Image.Canvas.Pixels[X, Y]));
end;
end;[/highlight]
А так, предложенный Washingtonom метод подходит для любых форматов, опознаваемых прямо или косвенно классом TImage в Delphi и C++ Bulider
Или я чего-то не понял?
Насчет использования встроенных средств для работы с JPG-файлами в C++ Bulider, Delphi и прочее. Да можно и так, но есть мнение что это будет несколько медленнее чем с использованием левой библиотеки, да и возможностей явно меньше, хотя если скорость не критична возможно это оптимальный выбор.
А вот про IJL это ты зря ничего проще для моих целей я тогда когда иследовал этот вопрос не нашел (может конечно плохо искал). Там всего 4 файлика, из которых одна dll-ка и один заголовочный файл. Просто объявляешь их у себя в проге и работаешь. На си это будет выглядеть примерно так:
Код:
Вот накопал мою пробную прогу на это библиотеке. Она переписывает jpg файл в текстовый файл побайтово, тройками в формате RGB
Код:
#include <stdio.h>
#include "IJL\ijl.h"
#pragma comment( lib, "IJL\\ijl15.lib" )
struct COLOR
{
float r;
float g;
float b;
};
void main()
{
int Bpp8; // Байт на пиксель
int RetVal; // Возращаемое IJL значение
int Height, Width;
unsigned int ImageSize;
JPEG_CORE_PROPERTIES image;
//ZeroMemory( &image, sizeof( JPEG_CORE_PROPERTIES ) );
if( ijlInit( &image ) != IJL_OK )
{
// Неудачно, возращаем False
return;
}
image.JPGFile = "sabrina.JPG";
if ((RetVal = ijlRead(&image,IJL_JFILE_READPARAMS)) == IJL_OK)
{
// Сохраняем Ширину
Height = image.JPGHeight;
// Сохраняем Высоту
Width = image.JPGWidth;
// Байт на пиксель
Bpp8 = 3;
// Размер текстуры
ImageSize=Height*Width*Bpp8*8;
// Выделаем память под текстуру
//Data.resize(ImageSize);
// создаем массив изображения
unsigned char *img= new unsigned char[ImageSize];
// Если память выделена
if(img)
{
// Указываем буффер с данными
image.DIBBytes = img;
// Формат RGB
image.DIBColor = IJL_RGB;
// Ширина
image.DIBHeight = Height;
// Высота
image.DIBWidth = Width;
// Байт на пиксель
image.DIBChannels = Bpp8;
// декодируем jpg файл в массив пикселей
if ((RetVal = ijlRead(&image,IJL_JFILE_READWHOLEIMAGE)) == IJL_OK)
{
// ну а дальше все ясно
// Выбираем формат текстуры
if(Bpp8==3) // 24 бита на пиксель
{
FILE *F=fopen("bitmap.0", "w");
long n=0;
for(int i=0; i<Height; i++)
{
for(int j=0; j<Width; j++)
{
fprintf(F, "%i %i %i ",img[n], img[n+1], img[n+2]);
n+=3;
}
fprintf(F, "\n");
}
fclose(F);
}
}
delete img; // Удаляем временный буффер
}
ijlFree(&image); // Освобождаем сжатые данные
}
}
#include "IJL\ijl.h"
#pragma comment( lib, "IJL\\ijl15.lib" )
struct COLOR
{
float r;
float g;
float b;
};
void main()
{
int Bpp8; // Байт на пиксель
int RetVal; // Возращаемое IJL значение
int Height, Width;
unsigned int ImageSize;
JPEG_CORE_PROPERTIES image;
//ZeroMemory( &image, sizeof( JPEG_CORE_PROPERTIES ) );
if( ijlInit( &image ) != IJL_OK )
{
// Неудачно, возращаем False
return;
}
image.JPGFile = "sabrina.JPG";
if ((RetVal = ijlRead(&image,IJL_JFILE_READPARAMS)) == IJL_OK)
{
// Сохраняем Ширину
Height = image.JPGHeight;
// Сохраняем Высоту
Width = image.JPGWidth;
// Байт на пиксель
Bpp8 = 3;
// Размер текстуры
ImageSize=Height*Width*Bpp8*8;
// Выделаем память под текстуру
//Data.resize(ImageSize);
// создаем массив изображения
unsigned char *img= new unsigned char[ImageSize];
// Если память выделена
if(img)
{
// Указываем буффер с данными
image.DIBBytes = img;
// Формат RGB
image.DIBColor = IJL_RGB;
// Ширина
image.DIBHeight = Height;
// Высота
image.DIBWidth = Width;
// Байт на пиксель
image.DIBChannels = Bpp8;
// декодируем jpg файл в массив пикселей
if ((RetVal = ijlRead(&image,IJL_JFILE_READWHOLEIMAGE)) == IJL_OK)
{
// ну а дальше все ясно
// Выбираем формат текстуры
if(Bpp8==3) // 24 бита на пиксель
{
FILE *F=fopen("bitmap.0", "w");
long n=0;
for(int i=0; i<Height; i++)
{
for(int j=0; j<Width; j++)
{
fprintf(F, "%i %i %i ",img[n], img[n+1], img[n+2]);
n+=3;
}
fprintf(F, "\n");
}
fclose(F);
}
}
delete img; // Удаляем временный буффер
}
ijlFree(&image); // Освобождаем сжатые данные
}
}
ЗЫ встречал эту библиотеку в кишках некоторых игр, т.е. ИМХО библиотека достаточно хороша для использования в игровых движках.
Цитата: DarkLord-1985
ЗЫ встречал эту библиотеку в кишках некоторых игр, т.е. ИМХО библиотека достаточно хороша для использования в игровых движках.
Чаще, в кишках игрульков, обнаруживается это. Читает почти все форматы, пишет - немного меньше.
[COLOR="Red"][SIZE="5"]DarkLord-1985[/SIZE][/COLOR] Спасибо огромное за пример кода! Библиотечка действительно стоящая и шустренькая))) Ща буду разбераться))) То что надо)))
Понимаю, вопрос наверное тупой, но это моё первое знакомство с VS 2008 :(
так. давайте не городить огород. отдельный вопрос - отдельная тема.
Сегодня наткнулся на OpenCV... Эта штука решает все мои проблеммы))) лол