Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
81 / 40 / 22
Регистрация: 03.05.2013
Сообщений: 713
1

Png из resource файла в память, для чтения LodePNG

20.05.2015, 10:14. Показов 3383. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребята, как прочитать resource файл изображение png , что бы его можно было декодировать через LodePNG
Подгрузил картинку
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
    HRSRC png1 = ::FindResource((HMODULE)NULL, MAKEINTRESOURCE(IDR_PNG1), RT_RCDATA);
    unsigned int pngsize1 = ::SizeofResource((HMODULE)NULL, png1);
    HGLOBAL pngdata1 = ::LoadResource((HMODULE)NULL, png1);
    //void* fontbin1 = ::LockResource(pngdata1);
    unsigned char* data = NULL;
    data = (unsigned char*)LockResource(png1);
 
    //std::cout << pngsize1 << std::endl;
 
    unsigned width = 600;
    unsigned height = 600;
    unsigned error1 = lodepng_decode32(image, &width, &height, data, pngsize1);
 
    if(error1 != 0)
        std::cout << "error " << error1 << ": " << lodepng_error_text(error1) << std::endl;


Размер получаю.
Далее есть функция в библиотеке
C++
1
2
3
/*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/
unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h,
                          const unsigned char* in, size_t insize);
Почему unsigned char** out?

Автор мне ответил
Кликните здесь для просмотра всего текста
LodePNG can decode a compressed PNG image, to raw RGB pixels. The PNG image may be given as a memory buffer. There is no need for it to be a file on disk.
So as long as you can read those resource files as bytes into memory, then yes, LodePNG can decode it for you.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.05.2015, 10:14
Ответы с готовыми решениями:

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

Unable to locate resource …img/contact_big.png. в CodeIgniter
Сжал картинку, как советовала гугловская система анализа сайта, удалил её из папки и с таким же...

Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена
При добавлении dataGridView(Visual Studio 2010) выдает ошибку &quot;Попытка чтения или записи в...

Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена
При нажатии на пробелы выскакивает ошибка ( Application.Run(new Form5()); - Попытка чтения или...

9
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
20.05.2015, 12:09 2
Судя по всему функция просто возвращает указатель таким образом.
C++
1
2
unsigned char * out;
lodepng_decode32( &out, ...
0
81 / 40 / 22
Регистрация: 03.05.2013
Сообщений: 713
20.05.2015, 12:23  [ТС] 3
Так, вроде как получилось передать память, но в результате всё равно ошибка,
error 28: incorrect PNG signature, it's no PNG or corrupted
Хотя если просмотреть char переменные в ресурс файле , там заголовок правильный.
а╨♥ и→ Hы♥ }☺ ЙPNG

IHDR ☻X ☻♠ ╛fШ▄ pHYs ♂‼ ♂‼☺ ЪЬ↑
В итоге что получилось и не работает.
C++
1
2
3
4
5
6
7
8
9
10
    HRSRC png1 = ::FindResource((HMODULE)NULL, MAKEINTRESOURCE(IDR_PNG1), RT_RCDATA);
    unsigned int pngsize1 = ::SizeofResource((HMODULE)NULL, png1);
    HGLOBAL pngdata1 = ::LoadResource((HMODULE)NULL, png1);
    unsigned char* data = NULL;
    data = (unsigned char*)LockResource(png1);
 
    unsigned w = 600;
    unsigned h = 600;
    unsigned char* data_array = new unsigned char[pngsize1];
    unsigned error1 = lodepng_decode_memory( &data_array , &w, &h, data, pngsize1, LCT_RGBA, 32);
Название: Безымянный.png
Просмотров: 50

Размер: 2.6 Кб
0
81 / 40 / 22
Регистрация: 03.05.2013
Сообщений: 713
20.05.2015, 12:29  [ТС] 4
Кликните здесь для просмотра всего текста

Are you using C or C++? If you use C++, you can use functions with std::vector (just browse through the header file to see all the functions, there are many called "load", some output the result to an std::vector)

The one with unsigned char** out is for C, not for C++, so you don't have to use it, but it is a pointer to a pointer because it dynamically allocates memory, one pointer is because it's an array, the other because it needs to output that pointer to that array.

There are several examples for LodePNG, you can find them on the website or on github, maybe those can help show the usage?

Feel free to ask if you have any further questions

Regards,
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
20.05.2015, 12:30 5
Если пишет что сигнатура неправильная, значит так и есть.
Как запихивал PNG в ресурс?
1
81 / 40 / 22
Регистрация: 03.05.2013
Сообщений: 713
20.05.2015, 12:32  [ТС] 6
файл resource.h

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by smooth.rc
//
#define IDR_PNG1                     101
 
// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif


Файл rc
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//
IDR_PNG1             RCDATA                  "./images/234567.png"


в коде
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    HRSRC png1 = ::FindResource((HMODULE)NULL, MAKEINTRESOURCE(IDR_PNG1), RT_RCDATA);
    unsigned int pngsize1 = ::SizeofResource((HMODULE)NULL, png1);
    HGLOBAL pngdata1 = ::LoadResource((HMODULE)NULL, png1);
    unsigned char* data = NULL;
    data = (unsigned char*)LockResource(png1);
 
    unsigned w = 600;
    unsigned h = 600;
    unsigned char* data_array = new unsigned char[pngsize1]{};
    unsigned error1 = lodepng_decode_memory( &data_array , &w, &h, data, pngsize1, LCT_RGBA, 32);
 
    //for(unsigned i = 0; i < 100; i++)
        //std::cout << data[i];
 
 
    if(error1 != 0)
        std::cout << "error " << error1 << ": " << lodepng_error_text(error1) << std::endl;
 
    getchar();

Вроде всё.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
20.05.2015, 12:41 7
Вроде правильно.
Смогу проверить только вечером.
0
81 / 40 / 22
Регистрация: 03.05.2013
Сообщений: 713
20.05.2015, 12:47  [ТС] 8
Да, сам удивлён, автор написал мол на c++ используйте вектора, заменил на вектора, таже ошибка, у него на гитхабе есть пример. По нему делал, не катит. Открытие из файла на прямую без проблем.
castaway если не затруднит, буду признателен.
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    HRSRC png1 = ::FindResource((HMODULE)NULL, MAKEINTRESOURCE(IDR_PNG1), RT_RCDATA);
    unsigned int pngsize1 = ::SizeofResource((HMODULE)NULL, png1);
    HGLOBAL pngdata1 = ::LoadResource((HMODULE)NULL, png1);
    unsigned char* data = NULL;
    data = (unsigned char*)LockResource(png1);
 
    std::vector<unsigned char> png;
    for(int i = 0; i < pngsize1; i++)       
        png.push_back (data[i]);
 
    std::vector<unsigned char> image3; //the raw pixels
    unsigned width3, height3;
 
    //load and decode
    unsigned error1 = lodepng::decode(image3, width3, height3, png);
 
    //if there's an error, display it
    if(error1) std::cout << "decoder error " << error1 << ": " << lodepng_error_text(error1) << std::endl;
 
    getchar();
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
20.05.2015, 12:49 9
zasadadada, вечером. Сейчас на работе..
0
81 / 40 / 22
Регистрация: 03.05.2013
Сообщений: 713
20.05.2015, 14:01  [ТС] 10
castaway спасибо за участие.
Починил. Если кому потребуется картинку PNG преобразовать в RAW(RGBA или RGB)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    HRSRC png1 = ::FindResource((HMODULE)NULL, MAKEINTRESOURCE(IDR_PNG1), RT_RCDATA);
    unsigned int pngsize1 = ::SizeofResource((HMODULE)NULL, png1);
    HGLOBAL pngdata1 = ::LoadResource((HMODULE)NULL, png1);
    unsigned char* data = NULL;
    data = (unsigned char*)LockResource(png1);
 
    std::vector<unsigned char> png;
    for(unsigned i = 32; i < pngsize1+32; i++){
        png.push_back (data[i]);
    }   
 
    std::vector<unsigned char> image; //the raw pixels
    unsigned width;
    unsigned height;
 
    //load and decode
    unsigned error = lodepng::decode(image, width, height, png);
    if(error){
        std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl;
        getchar();
    }
 
    std::cout <<  pngsize1 << std::endl;
    std::cout <<  width << std::endl;
    std::cout <<  height << std::endl;
 
    unsigned char* image2 = new unsigned char[width * height * 4]{};
    for(unsigned int y = 0; y < height; y++)
    for(unsigned int x = 0; x < width; x++)
    for(unsigned int c = 0; c < 4; c++){
        image2[4 * width * y + 4 * x + c] = image[4 * width * y + 4 * x + c];
    }
Там проблема была в отступе 32 . Понятие не имею почему, посмотрел через hex, сделал отступ, работает.
1
20.05.2015, 14:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2015, 14:01
Помогаю со студенческими работами здесь

Как создать диалог выбора файла для чтения и сохранения файла?
Добрый день! Написал простейший текстовый редактор для Windows. Все работает, текст читает из...

Вращение TImage c PNG. Нужна переделка решения для BMP под PNG
Здравствуйте. Очень нужна помощь с вращением. Есть решение данной проблемы для формата bmp :...

Функции CreateFile и для ReadFileEx для чтения несколькими процессами из текстового файла
Привет, просьба подсказать одну вещь. Чтобы было ясно где используется, кратко опишу: мне...

Реализуйте класс, для которого [] перегружено для реализации случайного чтения символов из файла
Здравствуйте, прошу помочь с таким вот заданием : &quot; Реализуйте класс, для которого перегружено для...

Открытие страницы fon.png.php вместо файла fon.png
видел сайт где на все файлы(например fon.png) стоят файлы-страницы(например fon.png.php), в итоге,...

Разделители для чтения из файла
По условию задачи в .txt файл вводится одномерный массив и нужно его считать, но у меня считывание...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru