image_png.c
来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 198 行
C
198 行
/*************************************************************************** begin : Wed Oct 6 2004 copyright : (C) 2004 - 2005 by Alper Akcan email : distchx@yahoo.com ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 2.1 of the * * License, or (at your option) any later version. * * * ***************************************************************************/#include "xynth_.h"#if defined(IMAGE_PNG)#include <png.h>int s_image_png_is (char *file){ FILE *fp; int ret = -1; char magic[8]; if ((fp = fopen(file, "rb")) == NULL) { debugf(DCLI | DFAT, "Could not open file (%s) for reading", file); } fread(magic, 1, sizeof(magic), fp); ret = png_sig_cmp((png_bytep) magic, (png_size_t) 0, 8); fclose(fp); return ret;}int s_image_png (char *file, s_image_t *img){ int x; int y; FILE *fp; int width; int height; char header[8]; unsigned int *tmp; png_byte bit_depth; png_infop info_ptr; png_structp png_ptr; png_byte color_type; int number_of_passes; png_bytep *row_pointers; fp = fopen(file, "rb"); if (!fp) { debugf(DFAT, "Could not open file %s", file); } fread(header, 1, 8, fp); if (png_sig_cmp((png_bytep) header, 0, 8)) { debugf(DFAT, "File is not a PNG file %s", file); } png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { debugf(DFAT, "png_create_read_struct failed"); } info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { debugf(DFAT, "png_create_info_struct failed"); } if (setjmp(png_jmpbuf(png_ptr))) { debugf(DFAT, "setjmp failed"); } png_init_io(png_ptr, fp); png_set_sig_bytes(png_ptr, 8); png_read_info(png_ptr, info_ptr); width = info_ptr->width; height = info_ptr->height; color_type = info_ptr->color_type; bit_depth = info_ptr->bit_depth; number_of_passes = png_set_interlace_handling(png_ptr); png_read_update_info(png_ptr, info_ptr); if (setjmp(png_jmpbuf(png_ptr))) { debugf(DFAT, "Error during read_image"); } row_pointers = (png_bytep *) s_malloc(sizeof(png_bytep) * height); for (y = 0; y < height; y++) { row_pointers[y] = (png_byte* ) s_malloc(info_ptr->rowbytes); } png_read_image(png_ptr, row_pointers); img->w = width; img->h = height; img->rgba = (unsigned int *) s_calloc(1, img->w * img->h * sizeof(unsigned int)); tmp = img->rgba; if (info_ptr->color_type == PNG_COLOR_TYPE_RGBA) { for (y = 0; y < height; y++) { png_byte *row = row_pointers[y]; for (x = 0; x < width; x++) { png_byte *ptr = &(row[x * 4]); *tmp |= (ptr[0] << 0x18); *tmp |= (ptr[1] << 0x10); *tmp |= (ptr[2] << 0x08); *tmp |= (~(ptr[3] << 0x00)) & 0xFF; ptr[0] = 0; ptr[1] = ptr[2]; tmp++; } } } else if (info_ptr->color_type == PNG_COLOR_TYPE_RGB) { for (y = 0; y < height; y++) { png_byte *row = row_pointers[y]; for (x = 0; x < width; x++) { png_byte *ptr = &(row[x * 3]); *tmp |= (ptr[0] << 0x18); *tmp |= (ptr[1] << 0x10); *tmp |= (ptr[2] << 0x08); *tmp |= 0x0; ptr[0] = 0; ptr[1] = ptr[2]; tmp++; } } } else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { int i; struct Palette { int r; int g; int b; }; struct Palette *pal; pal = (struct Palette *) s_malloc(256 * sizeof(struct Palette)); for (i = 0; i < info_ptr->num_palette; i++) { pal[i].r = info_ptr->palette[i].red; pal[i].g = info_ptr->palette[i].green; pal[i].b = info_ptr->palette[i].blue; } for (; i < 256; i++) { pal[i].r = 0; pal[i].g = 0; pal[i].b = 0; } for (y = 0; y < height; y++) { png_byte *row = row_pointers[y]; for (x = 0; x < width; x++) { png_byte *ptr = &(row[x]); *tmp |= (pal[ptr[0]].r << 0x18); *tmp |= (pal[ptr[0]].g << 0x10); *tmp |= (pal[ptr[0]].b << 0x08); *tmp |= 0x0; tmp++; } } s_free(pal); } else { debugf(DFAT, "Unknown color_type : %d (%s)", info_ptr->color_type, file); } for (y = 0; y < height; y++) { s_free(row_pointers[y]); } s_free(row_pointers); png_destroy_info_struct(png_ptr, &info_ptr); png_destroy_read_struct(&png_ptr, NULL, NULL); fclose(fp); return 0;}#elseint s_image_png_is (char *file){ return -1;}int s_image_png (char *file, s_image_t *img){ return -1;}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?