Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

JPEG взгляд изнутри

20K
26 сентября 2009 года
DeVOLT
39 / / 28.09.2008
Всем доброго времени суток!
Есть задача написать программу. Программа принимает на вход jpeg файл(для начала, потом всё усложнится до захвата изображения в веб-камеры) и анализирует его, а именно должна выдавать цвет каждого пикселя в RGB.
Есть ряд вопросов: Как jpeg выглядит изнутри? Как его разобрать посредствам С++?(Когда разберусь с внутренней архитектурой типа, разобрать не будет сложно, больше интересует, как посредствам кода вытащить из файла все "патраха").

На выходе должна получиться матрица, каждый её элемент есть структура в которой прописан цвет каждого пикселя в RGB.

Заранее всем огромное спасибо)))
20K
26 сентября 2009 года
DeVOLT
39 / / 28.09.2008
Забыл добавить, что на вход пойдёт не сжатое изображение, т.е. никаких алгоритмов Хафмона и т.д. Останится ли при этом внутри файла матрица, или она всё равно будет просканированна зигзагообразно и записана линейно? И ещё вопрос: алгоритм Run Length Encoding всё-равно будет применён независимо от того, отказался я от сжатия или нет?

Может не запариваться с разбором файла "на запчасти" а вместо этого существует какой компонент для билдера, пригодный для моих целей?
20K
26 сентября 2009 года
DeVOLT
39 / / 28.09.2008
И очень сильно попрашу Админа переместить тему в раздел "Графика" :)
Раздельчиком промахнулся мальца :eek:
3.7K
26 сентября 2009 года
0nni
326 / / 24.06.2008
Например вот:
http://sources.codenet.ru/?cid=20

Но тема довольно слжная, я считаю.
20K
26 сентября 2009 года
DeVOLT
39 / / 28.09.2008
Вот тут есть библиотека: http://sources.codenet.ru/download/146/jpeg-40.html
Под что она? Под студию или под билдер? Как её установить?
6
26 сентября 2009 года
George
4.1K / / 05.01.2007
ну скачай да глянь ))) нам то откуда знать. или майку напиши - его ж исходники =)
51K
26 сентября 2009 года
DarkLord-1985
13 / / 02.09.2009
Когда то занимался подобным вопросом, использовал Intel JPEG Library (IJL), нареканий не было. если интересует, набери в яндексе и скачай, распространяется она по моему свободно.
20K
26 сентября 2009 года
DeVOLT
39 / / 28.09.2008
Почитал всякую инфу...действительно, есть над чем подумать... А если вместо jpeg на вход программе подать bmp, там ведь, на сколько я знаю, никакого сжатия, да и структура внутренняя довольно простая, верно?
20K
26 сентября 2009 года
DeVOLT
39 / / 28.09.2008
Цитата: DarkLord-1985
Intel JPEG Library (IJL)



IJL это конечно хорошо, ток вот что-то там мудрено всё... Разобраться конечно можно, но ведь должен быть способ проще или библиотеки не такие навароченные)))

6
26 сентября 2009 года
George
4.1K / / 05.01.2007
если бмп то очень легко, вот например на дельфи:
[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]
536
26 сентября 2009 года
alex-kniaz
382 / / 07.08.2008
По-моему автору нужен непосредственный парсинг файла.
А так, предложенный Washingtonom метод подходит для любых форматов, опознаваемых прямо или косвенно классом TImage в Delphi и C++ Bulider
Или я чего-то не понял?
51K
27 сентября 2009 года
DarkLord-1985
13 / / 02.09.2009
Насчет bmp то там все легко обычно его можно загрузить средствами той среды где ты пишешь (если конечно ты не пишеш на Borland Turbo C 3.0 под DOS :)). Если даже таких средств нет то можно и самому написать ибо структра bmp-файла достаточна проста, я даже в качестве эксперимента как то писал.
Насчет использования встроенных средств для работы с JPG-файлами в C++ Bulider, Delphi и прочее. Да можно и так, но есть мнение что это будет несколько медленнее чем с использованием левой библиотеки, да и возможностей явно меньше, хотя если скорость не критична возможно это оптимальный выбор.
А вот про IJL это ты зря ничего проще для моих целей я тогда когда иследовал этот вопрос не нашел (может конечно плохо искал). Там всего 4 файлика, из которых одна dll-ка и один заголовочный файл. Просто объявляешь их у себя в проге и работаешь. На си это будет выглядеть примерно так:
 
Код:
#include "IJL\ijl.h"
#pragma comment( lib, "IJL\\ijl15.lib" )

Вот накопал мою пробную прогу на это библиотеке. Она переписывает 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); // Освобождаем сжатые данные
    }
}

ЗЫ встречал эту библиотеку в кишках некоторых игр, т.е. ИМХО библиотека достаточно хороша для использования в игровых движках.
9
27 сентября 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: DarkLord-1985

ЗЫ встречал эту библиотеку в кишках некоторых игр, т.е. ИМХО библиотека достаточно хороша для использования в игровых движках.


Чаще, в кишках игрульков, обнаруживается это. Читает почти все форматы, пишет - немного меньше.

20K
27 сентября 2009 года
DeVOLT
39 / / 28.09.2008
[COLOR="Red"][SIZE="5"]DarkLord-1985[/SIZE][/COLOR] Спасибо огромное за пример кода! Библиотечка действительно стоящая и шустренькая))) Ща буду разбераться))) То что надо)))
20K
27 сентября 2009 года
DeVOLT
39 / / 28.09.2008
Разобрался как сделать, написал Console Aplication. Теперь хочу перетащить проект на Win32 WindowsForm Aplication, но сталкнулся с дурацкой проблеммой (((( Использую новомодный Visual Studio 2008. Первоначально в проекте нет форм, создаю форму, помещаю на неё элементы управления, но когда компелю проект формы этой не видно, вместо этого вылетает форма непонятного происхождения азаглавленая именем моего проекта... Куда делась форма, которую я создал? Почему её не видно и что это за шняга вместо неё вылетает?

Понимаю, вопрос наверное тупой, но это моё первое знакомство с VS 2008 :(
6
27 сентября 2009 года
George
4.1K / / 05.01.2007
так. давайте не городить огород. отдельный вопрос - отдельная тема.
20K
28 сентября 2009 года
DeVOLT
39 / / 28.09.2008
Ёлки-палки :) Я пытался изобрести велосипед :)
Сегодня наткнулся на OpenCV... Эта штука решает все мои проблеммы))) лол
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог