LINUX.ORG.RU

Чтение png


0

0

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

Заранее спасибо!!!

★★★★★
Ответ на: комментарий от grustnoe

Ну а можно не посылать в маны, а привести реальный пример. Ну в конце концов киньте ссылку на этот пример!!!

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

RE

писал давно, точно уже не поню что там к чему, ну надеюсь разберешься.
Пишется все в эту структуру 
typedef struct 
{
int rows;
int cols;
float* cell;
}matrix;
одномерный массив думаю выдерешь, а так - смотреть в /usr/share/doc/libpng-xxx/ - там хороший пример.


#include<stdio.h>
#include<stdlib.h>
#include<png.h>
#include<math.h>
#include"uTypes.h"
#include"pngload.h"

#define BYTES_TO_CHECK 8
 
matrix* pngLoad(char* path)
{
png_structp ps=NULL;
png_infop is=NULL;
FILE* fp;
byte check_buffer[BYTES_TO_CHECK];
png_bytep* row_pointers=NULL;
matrix* m=NULL;
png_uint_32 w,h;
int r,c,depth,ct,it;

if(fp=fopen(path,"rb"))
    {
    fread(check_buffer,1,BYTES_TO_CHECK,fp);
    if(png_sig_cmp(check_buffer,(png_size_t)0,BYTES_TO_CHECK)==0)
	{
	if(ps=png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL))
	    {
	    if(is=png_create_info_struct(ps))
		{
		png_init_io(ps,fp);
		png_set_sig_bytes(ps,BYTES_TO_CHECK);
		
		png_read_info(ps,is);
		png_get_IHDR(ps,is,&w,&h,&depth,&ct,&it,NULL,NULL);
		
		png_set_strip_16(ps);
		png_set_strip_alpha(ps);
		png_set_packing(ps);
		if(ct==PNG_COLOR_TYPE_PALETTE)
    		    png_set_palette_to_rgb(ps);
		if((ct==PNG_COLOR_TYPE_GRAY) && (depth < 8))
    		    png_set_gray_1_2_4_to_8(ps);
		png_read_update_info(ps,is);
		
		if(row_pointers=malloc(sizeof(png_bytep)*h))
		    for(r=0;r<h;r++)
			row_pointers[r]=png_malloc(ps,png_get_rowbytes(ps,is));
		png_read_image(ps,row_pointers);
		png_read_end(ps,is);
		
//		printf("%d \n",depth);
		if(m=MatrixNew(1,h*w))
		    {
		    for(r=0;r<h;r++)
			for(c=0;c<w;c++)
			    {
//тута сам втыкай че надо
			    m->cell[r*w+c]=0;
			    m->cell[r*w+c]=m->cell[r*w+c]+
				(float)row_pointers[r][c*3];
			    m->cell[r*w+c]=m->cell[r*w+c]+
				(float)row_pointers[r][c*3+1];
			    m->cell[r*w+c]=m->cell[r*w+c]+
				(float)row_pointers[r][c*3+2];
			    m->cell[r*w+c]=floorf((m->cell[r*w+c]/3)/255);
			    }
		    }
		
		png_destroy_read_struct(&ps,&is,NULL);
		}
	    else
		{ 
		printf("cannot create info struct\n");
		png_destroy_read_struct(&ps,NULL,NULL);
		}
	    }
	else
	    printf("cannot create read struct\n");
	}
    else
	printf("not a png\n");
    fclose(fp);
    }
else
    printf("cannot open file\n");
return(m);
}

int pngCheck(char* path,int rw,int rh,int rdepth)
{
png_structp ps=NULL;
png_infop is=NULL;
FILE* fp;
byte check_buffer[BYTES_TO_CHECK];
png_uint_32 w,h;
int depth,ct,it;
int r=0;

if(fp=fopen(path,"rb"))
    {
    fread(check_buffer,1,BYTES_TO_CHECK,fp);
    if(png_sig_cmp(check_buffer,(png_size_t)0,BYTES_TO_CHECK)==0)
	{
	if(ps=png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL))
	    {
	    if(is=png_create_info_struct(ps))
		{
		png_init_io(ps,fp);
		png_set_sig_bytes(ps,BYTES_TO_CHECK);
		
		png_read_info(ps,is);
		png_get_IHDR(ps,is,&w,&h,&depth,&ct,&it,NULL,NULL);
		
		if((rw<=0)||(w==rw))
		    if((rh<=0)||(h==rh))
			if((rdepth<=0)||(rdepth==depth))
			    r=1;
			else
			    printf("warning, png %s depth is %d\n",path,depth);
		    else
			printf("warning, png %s height is %d\n",path,h);
		else
		    printf("warning, png %s width is %d\n",path,w);

		png_destroy_read_struct(&ps,&is,NULL);
		}
	    else
		{ 
		printf("cannot create info struct\n");
		png_destroy_read_struct(&ps,NULL,NULL);
		}
	    }
	else
	    printf("cannot create read struct\n");
	}
    else
	printf("not a png\n");
    fclose(fp);
    }
else
    printf("cannot open file %s\n",path);
return(r);
}

hooj ★★
()
Ответ на: RE от hooj

Спасибо!!! буду пробовать.

cyclon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.