Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

Read PNG in C - C++

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

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

Объединение нескольких png файлов в один png-файл - C++
В общем надо написать програмулину, которая объединяет несколько png файлов (ширина и высота одинаковы у изображений) в один png-файл. ...

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

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

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

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

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

9
nameless
Эксперт С++
334 / 298 / 14
Регистрация: 16.06.2009
Сообщений: 486
16.07.2011, 19:30 #2
mairetham,

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

Используй libpng и не парься.
1
BadBaddak
89 / 16 / 3
Регистрация: 09.06.2010
Сообщений: 100
17.07.2011, 18:14 #4
Можно пример функции, в которую передают имя файла, она ищет его, и делает массив нужных размеров? Используя libpng как тут посоветовали.
0
mairetham
0 / 0 / 0
Регистрация: 16.07.2011
Сообщений: 4
17.07.2011, 19:20  [ТС] #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]), красный и зеленый - ок.
Почему так?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.07.2011, 19:29 #6
Цитата Сообщение от mairetham Посмотреть сообщение
png_byte* ptr = &(row[x*4])
Убедился, что именно по 4 байта записано, а не по три?
0
grizlik78
Эксперт С++
1974 / 1467 / 122
Регистрация: 29.05.2011
Сообщений: 3,034
17.07.2011, 19:40 #7
Цитата Сообщение от mairetham Посмотреть сообщение
C
1
int array[height][width][2];
Вообще-то в таком массиве последнее значение третьего инднкса равно 1, так как последнее измерение имеет размер 2.
1
mairetham
0 / 0 / 0
Регистрация: 16.07.2011
Сообщений: 4
17.07.2011, 19:58  [ТС] #8
Цитата Сообщение от Deviaphan Посмотреть сообщение
Убедился, что именно по 4 байта записано, а не по три?
Здесь все ок. В первом выводе цвета правильные.

Добавлено через 44 секунды
Цитата Сообщение от grizlik78 Посмотреть сообщение
Вообще-то в таком массиве последнее значение третьего инднкса равно 1, так как последнее измерение имеет размер 2.
Спасибо.
0
easybudda
Модератор
Эксперт CЭксперт С++
9722 / 5673 / 972
Регистрация: 25.07.2009
Сообщений: 10,916
17.07.2011, 20:01 #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 - если нужен */
тогда двухмерного массива вполне хватит...
2
mairetham
0 / 0 / 0
Регистрация: 16.07.2011
Сообщений: 4
17.07.2011, 20:16  [ТС] #10
Цитата Сообщение от easybudda Посмотреть сообщение
немного не по теме: цвет RGB обычно удобнее в одну переменную типа int упаковывать.
Спасибо, так действительно удобнее.
0
17.07.2011, 20:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2011, 20:16
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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