Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.95
mairetham
0 / 0 / 0
Регистрация: 16.07.2011
Сообщений: 4
#1

Read PNG in C - C++

16.07.2011, 19:15. Просмотров 2834. Ответов 9
Метки нет (Все метки)

Всем привет.
Подскажите как на С (без привлечения сторонних библиотек) прочитать PNG файл.
В конечном итоге хотелось бы получить двумерный массив, где номер элемента - это положения пикселя, а сам элемент - это цвет.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2011, 19:15     Read PNG in C
Посмотрите здесь:

Считывание PNG - C++
Здравствуйте,форумчане) Пытаюсь прочитать PNG файл,вообще убейте не понимаю почему не работает.Даже длину и ширину нормально не...

Чтение PNG файла - C++
описал структуру заголовка чанка struct _PNG_ChunkHead { unsigned int _length; char _type; }; после чтения чанка IHDR...

Генерация PNG (проблема) - C++
//test3.cpp //---------------------------------------------------------- // #pragma pack(1) #include <stdio.h> #include...

Конвектор png в jpg - C++
Хочу написать прогу для конвертирования png формата изображения в jpg формат изображения. Можете объяснить как это реализуется, дать ссылки...

Вывод png изображения на экран - C++
Здравствуйте уважаемые программисты! Подскажите как вывести png изображение на экран. Потом еще нужно будет вращать его на произвольный...

Спрятать сообщение в png файл - C++
Работал с BMP файлом - там всё просто. Но с png возникли трудности - формат сжатый, а именно zlib. Что делать? Как спрятать текст в png...

Вставить картинку png (Glut) С++ - C++
Вообщем написал змейку с помощью glut. Все работает прекрасно. Решил заменить квадраты (которые ест змейка) на картинки яблок. Начал...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nameless
Эксперт C++
334 / 298 / 14
Регистрация: 16.06.2009
Сообщений: 486
16.07.2011, 19:30     Read PNG in C #2
mairetham,

Вот почитайте спецификацию PNG. Все подробно описано, и даже пример приведен..)
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.07.2011, 20:17     Read PNG in C #3
Цитата Сообщение от mairetham Посмотреть сообщение
(без привлечения сторонних библиотек)
Никак.
*или писать туеву хучу кода по распаковке-декодированию

Используй libpng и не парься.
BadBaddak
87 / 14 / 3
Регистрация: 09.06.2010
Сообщений: 100
17.07.2011, 18:14     Read PNG in C #4
Можно пример функции, в которую передают имя файла, она ищет его, и делает массив нужных размеров? Используя libpng как тут посоветовали.
mairetham
0 / 0 / 0
Регистрация: 16.07.2011
Сообщений: 4
17.07.2011, 19:20  [ТС]     Read PNG in C #5
Поробовал libpng. Спасибо помогло.
Цитата Сообщение от BadBaddak Посмотреть сообщение
Можно пример функции, в которую передают имя файла, она ищет его, и делает массив нужных размеров? Используя libpng как тут посоветовали.
Вот хороший пример http://zarb.org/~gc/html/libpng.html

Добавлено через 56 минут
Что-то здесь не так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    int array[height][width][2];
    double c;
    for (y=0; y<height; y++) {
      png_byte* row = row_pointers[y];
      for (x=0; x<width; x++) {
        png_byte* ptr = &(row[x*4]);
        for (v=0; v<3; v++) {
          c = ptr[v];//68*(1.0-ptr[3]/256.0)+ptr[v]*ptr[3]/256.0;
          array[y][x][v] = c;
        }
      printf("Pixel at position [ %d - %d ] has RGB values: %x - %x - %x\n", x, y, array[y][x][0], array[y][x][1], array[y][x][2]);
      }                          
    } 
    for (y=0; y<height; y++)
      for (x=0; x<width; x++)
        printf("Pixel at position [ %d - %d ] has RGB values: %x - %x - %x\n", x, y, array[y][x][0], array[y][x][1], array[y][x][2]);
Вывод функции printf в строке 11 отличается от вывода функции в строке 16. Первый вывод - все ок. Второй вывод - синий цвет (array[y][x][2]) неожиданно равен красному (array[y][x][0]), красный и зеленый - ок.
Почему так?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.07.2011, 19:29     Read PNG in C #6
Цитата Сообщение от mairetham Посмотреть сообщение
png_byte* ptr = &(row[x*4])
Убедился, что именно по 4 байта записано, а не по три?
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
17.07.2011, 19:40     Read PNG in C #7
Цитата Сообщение от mairetham Посмотреть сообщение
C
1
int array[height][width][2];
Вообще-то в таком массиве последнее значение третьего инднкса равно 1, так как последнее измерение имеет размер 2.
mairetham
0 / 0 / 0
Регистрация: 16.07.2011
Сообщений: 4
17.07.2011, 19:58  [ТС]     Read PNG in C #8
Цитата Сообщение от Deviaphan Посмотреть сообщение
Убедился, что именно по 4 байта записано, а не по три?
Здесь все ок. В первом выводе цвета правильные.

Добавлено через 44 секунды
Цитата Сообщение от grizlik78 Посмотреть сообщение
Вообще-то в таком массиве последнее значение третьего инднкса равно 1, так как последнее измерение имеет размер 2.
Спасибо.
easybudda
Эксперт CЭксперт С++
9466 / 5479 / 927
Регистрация: 25.07.2009
Сообщений: 10,503
17.07.2011, 20:01     Read PNG in C #9
mairetham, немного не по теме: цвет RGB обычно удобнее в одну переменную типа int упаковывать. Например:
C
1
2
3
4
5
6
uint32_t color;
/*...*/
color & 0xff; /* red */
color & 0xff00; /* green */
color & 0xff0000; /* blue */
color & 0xff000000; /* alpha channel - если нужен */
тогда двухмерного массива вполне хватит...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2011, 20:16     Read PNG in C
Еще ссылки по теме:

ActiveX для просмотра PNG - C++
Подскажите, где можно взять ActiveX для просмотра PNG?

использование read - C++
как ввести строку символов из консоли используя read? Добавлено через 38 секунд в языке си

template+read only - C++
Доброго времени суток, уважаемые форумчане! Суть проблемы такая: Есть некий класс: template&lt;typename T&gt; class Tree { public: ...

read(); write(); - C++
Вот такая вот небольшая программка fstream myFileReader(&quot;hardware.dat&quot;, ios::in | ios::out); int example = 1; ...

Нужно сохранить результат в png, a не в bmp - C++
Вот мой код, сохраняющий рисунок(фиолетовый квадрат) в bmp#include &lt;string&gt; #include &lt;vector&gt; #include &lt;cmath&gt; #include &lt;limits&gt; ...


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

Или воспользуйтесь поиском по форуму:
mairetham
0 / 0 / 0
Регистрация: 16.07.2011
Сообщений: 4
17.07.2011, 20:16  [ТС]     Read PNG in C #10
Цитата Сообщение от easybudda Посмотреть сообщение
немного не по теме: цвет RGB обычно удобнее в одну переменную типа int упаковывать.
Спасибо, так действительно удобнее.
Yandex
Объявления
17.07.2011, 20:16     Read PNG in C
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru