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

Read PNG in C - C++

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

template+read only C++
C++ использование read
Генерация PNG (проблема) C++
C++ Конвектор png в jpg
C++ Считывание PNG
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
16.07.2011, 19:30     Read PNG in C #2
mairetham,

Вот почитайте спецификацию PNG. Все подробно описано, и даже пример приведен..)
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 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++
 Аватар для Deviaphan
1283 / 1217 / 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
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
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
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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
Еще ссылки по теме:

C++ read(); write();
C++ Read Structure From File
Чтение PNG файла C++

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

Или воспользуйтесь поиском по форуму:
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
Ответ Создать тему
Опции темы

Текущее время: 04:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru