Romcik077
09.08.2010, 23:30
Здравствуйте! Решил начать программировать на ЗЫЗе. Но вот уже на первой программе возникли трудность. Цель состоит в том чтоб показать на экране рисунок на полный экран. Поискав в нете решил использовать библиотеку для рисунков PNG. Привожу код ниже:
#include <pspdisplay.h>
#include <pspctrl.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspgu.h>
#include <png.h>
#include <stdio.h>
#include "graphics.h"
#include "callback.h"
#define printf pspDebugScreenPrintf
PSP_MODULE_INFO("Cursor Example", 0, 1, 1);
int main() {
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
SceCtrlData pad;
pspDebugScreenInit();
SetupCallbacks();
initGraphics();
char buffer[200];
Image* image;
image = loadImage("./picture/5.png");
if (!image) {
printf("Image load failed!\n");
} else {
blitAlphaImageToScreen(0, 0, 480, 272, image, 0, 0);
flipScreen();
}
sceKernelSleepThread();
return 0;
} // main
Но оказалось что рисуки с большим размером не грузятся(больше размера 32х32), пишет "Image load failed!". В чём может быть проблема? Если это особенность этой библиотеки то какую библиотеку можно использовать вместо этой, желательно с примером кода. Спасибо заранее!!!
Попробуй больше памяти под приложение выделить, например.
Ридми библиотеки уже изучено, полагаю.
Romcik077
11.08.2010, 13:38
Спасибо Yoti!!! Заставил меня опять сесть за поиски библиотеки и мануала для рисунков PNG, и я нашёл вот это (http://psp.jim.sh/svn/filedetails.php?repname=psp&path=%2Ftrunk%2Flibpng%2Fscreenshot%2Fmain.c&rev=986&peg=986). Что-ж попробовал, скомпилил вроде всё получилось. Присмотревшись в этот код я увидел что-то знакомое и вспомнил что приблизительно такой код я видел и в graphics.c для функций "loadImagе". Сравнив я заметил что в graphics.c присуствует (выделено жирным):
Image* loadImage(const char* filename)
{
png_structp png_ptr;
png_infop info_ptr;
unsigned int sig_read = 0;
png_uint_32 width, height;
int bit_depth, color_type, interlace_type, x, y;
u32* line;
FILE *fp;
Image* image = (Image*) malloc(sizeof(Image));
if (!image) return NULL;
if ((fp = fopen(filename, "rb")) == NULL) return NULL;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL) {
free(image);
fclose(fp);
return NULL;;
}
png_set_error_fn(png_ptr, (png_voidp) NULL, (png_error_ptr) NULL, user_warning_fn);
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
free(image);
fclose(fp);
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return NULL;
}
png_init_io(png_ptr, fp);
png_set_sig_bytes(png_ptr, sig_read);
png_read_info(png_ptr, info_ptr);
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, int_p_NULL, int_p_NULL);
if (width > 512 || height > 512) {
free(image);
fclose(fp);
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return NULL;
}
image->imageWidth = width;
image->imageHeight = height;
image->textureWidth = getNextPower2(width);
image->textureHeight = getNextPower2(height);
png_set_strip_16(png_ptr);
png_set_packing(png_ptr);
if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr);
if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) png_set_gray_1_2_4_to_8(png_ptr);
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr);
png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
image->data = (Color*) memalign(16, image->textureWidth * image->textureHeight * sizeof(Color));
if (!image->data) {
free(image);
fclose(fp);
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return NULL;
}
line = (u32*) malloc(width * 4);
if (!line) {
free(image->data);
free(image);
fclose(fp);
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return NULL;
}
for (y = 0; y < height; y++) {
png_read_row(png_ptr, (u8*) line, png_bytep_NULL);
for (x = 0; x < width; x++) {
u32 color = line[x];
image->data[x + y * image->textureWidth] = color;
}
}
free(line);
png_read_end(png_ptr, info_ptr);
png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
fclose(fp);
return image;
}
Я ещё новичок в С++ програмированиё, но как я нашел в интернете это выделение память для картинки. ну я взял да удалил: if (!image) return NULL;, и всё запустилось. Спасибо ещё раз за помощь.
vBulletin® v3.8.7, Copyright ©2000-2025, vBulletin Solutions, Inc. Перевод: zCarot