Re: Теория разработки графического редактора (иконок)
Posted: Wed Feb 07, 2018 8:23 pm
В смысле сохранение ресурсов для приложений?
Official KolibriOS board
http://board.kolibrios.org/
Много вопросов и все хорошие и правильные.А в каком формате иконки?
Размер иконок произвольный?
Цвета только те, что в палитре?
Code: Select all
dword bmp_32x32x16_header[] = FROM "bmp32x32header";
void EventSave()
{
char save_buf[3126];
memmov(#save_buf, #bmp_32x32x16_header, sizeof(bmp_32x32x16_header));
memmov(#save_buf+sizeof(bmp_32x32x16_header), image.get_image(), sizeof(save_buf)-sizeof(bmp_32x32x16_header));
WriteFile(sizeof(save_buf), #save_buf, "/rd/1/saved_image.bmp")
}
Как мне кажется, здесь сама постановка вопроса некорректна.Leency wrote:Если кто-то напишет мне функцию в файле /cmm/lib/obj/libimg.h которая реализует сохранение в BMP или еще круче в PNG я его расцелую))
SaveBMP(pointer_buf, width, height, bit, save_path);
SavePNG(pointer_buf, width, height, bit, save_path);
Code: Select all
; if converted, try to save ; |-------------------------------------- ;
push dword [dstpath]
push eax
push ecx
call file.write
Code: Select all
image.move(FLIP_VER); //fix an issue that BMP image is flipped vertically
Проще говоря, дополнительно переворачивать изображение — лишняя, ненужная работа, достаточно изменить Height.0CodErr wrote:Это потому что данные изображения в файле так хранятся. Это можно определить по значению Height в структуре BITMAPINFOHEADER. Если файл с изображением содержит не зеркально отражённые данные, то в этом случае Height в BITMAPINFOHEADER записывается со знаком минус. Например, чтобы получить такое изображение в фотошопе надо при сохранении поставить флажок "flip row order".Heavyiron wrote:Почему 7-я функция выводит изображение снизу вверх справа налево, я не в курсе.
Как уже выше сказано, работаем как с обычным файлом, то есть, это как загрузка, только наоборот.Leency wrote: Я не знал как сделать сохранение через структуру BITMAPINFOHEADER
Спасибо, сделал, скоро залью.Проще говоря, дополнительно переворачивать изображение — лишняя, ненужная работа, достаточно изменить Height.
Code: Select all
mov dword[png_data],0
;(1) create image struct
stdcall [img_create], [buf_png.w], [buf_png.h], Image.bpp24
mov ebx,eax
test eax,eax
jz @f
;(2) copy foto to image buffer
mov edi,[eax+Image.Data]
mov esi,[buf_png]
mov ecx,[buf_png.w]
mov edx,[buf_png.h]
imul ecx,edx
imul ecx,3
shr ecx,2 ;OpenGL buffer align to 4
rep movsd
;(3) encode image
stdcall [img_encode], eax, LIBIMG_FORMAT_PNG, 0
test eax,eax
jz @f
mov [png_data],eax
mov [png_size],ecx
@@:
;(4)
stdcall [img_destroy],ebx
Не, дело-то хозяйское: хочется велосипед изобрести — изобретайLeency wrote:DrawRectangle там одноцветные, просто прямоугольники для этого либы не нужны.
Code: Select all
// list of format id's
#define LIBIMG_FORMAT_BMP 1
#define LIBIMG_FORMAT_ICO 2
#define LIBIMG_FORMAT_CUR 3
#define LIBIMG_FORMAT_GIF 4
#define LIBIMG_FORMAT_PNG 5
#define LIBIMG_FORMAT_JPEG 6
#define LIBIMG_FORMAT_TGA 7
#define LIBIMG_FORMAT_PCX 8
#define LIBIMG_FORMAT_XCF 9
#define LIBIMG_FORMAT_TIFF 10
#define LIBIMG_FORMAT_PNM 11
#define LIBIMG_FORMAT_WBMP 12
#define LIBIMG_FORMAT_XBM 13
#define LIBIMG_FORMAT_Z80 14
struct Image
{
DWORD Checksum; // ((Width ROL 16) OR Height) XOR Data[0] ; ignored so far
DWORD Width;
DWORD Height;
DWORD Next;
DWORD Previous;
DWORD Type; // one of Image.bppN
DWORD Data;
DWORD Palette; // used iff Type eq Image.bpp1, Image.bpp2, Image.bpp4 or Image.bpp8i
DWORD Extended;
DWORD Flags; // bitfield
DWORD Delay; // used iff Image.IsAnimated is set in Flags
};
// values for Image.Type
// must be consecutive to allow fast switch on Image.Type in support functions
#define Image.bpp8i 1 // indexed
#define Image.bpp24 2
#define Image.bpp32 3
#define Image.bpp15 4
#define Image.bpp16 5
#define Image.bpp1 6
#define Image.bpp8g 7 // grayscale
#define Image.bpp2i 8
#define Image.bpp4i 9
#define Image.bpp8a 10 // grayscale with alpha channel; application layer only!!! kernel doesn't handle this image type, libimg can only create and destroy such images
...
void SaveImage(DWORD* pointer_buf, DWORD width, DWORD height, DWORD bit)
{
DWORD* png_data=0;
DWORD png_size=0;
if(bit!=24)
{
... not support ...
return;
}
//(1) create image struct
Image* h_img = img_create(buf_png.w, buf_png.h, Image.bpp24);
if(h_img)
{
//(2) copy foto to image buffer
memcpy(h_img->Data, pointer_buf, width*height*3);
//(3) encode image
png_data = img_encode(eax, LIBIMG_FORMAT_PNG, 0);
if(png_data) png_size = ECX;
}
//(4)
img_destroy(h_img);
if(png_size)
{
... save image to file (use function 70) ...
... png_data - данные файла с изображением ...
... png_size - размер файла с изображением ...
}
}