Теория разработки графического редактора (иконок)
-
В смысле сохранение ресурсов для приложений?Из хаоса в космос
Прикольно
А в каком формате иконки?
Размер иконок произвольный?
Цвета только те, что в палитре?
Мне кажется, вместо нескольких DrawRectangle можно было бы использовать Frame из box_lib.
Если помнишь, то там можно выбрать из 5-ти вариантов border style http://board.kolibrios.org/viewtopic.ph ... 494#p66494
А в каком формате иконки?
Размер иконок произвольный?
Цвета только те, что в палитре?
Мне кажется, вместо нескольких DrawRectangle можно было бы использовать Frame из box_lib.
Если помнишь, то там можно выбрать из 5-ти вариантов border style http://board.kolibrios.org/viewtopic.ph ... 494#p66494
0CodErr
Вот только программа пока что 0.08, даже не 0.1 и не спроста. Я до этого граф редакторы не разрабатывал и тот процесс что идет сейчас я бы назвал "Разработка через переписывание".
DrawRectangle там одноцветные, просто прямоугольники для этого либы не нужны.
Я двигаюсь от создания базового функционала к расширению функций.
Пока что иконки сохраняются в BMP 32х32х16 и очень криворуким способом. Я не знал как сделать сохранение через структуру BITMAPINFOHEADER, не знал как сделать сохранение через LIBIMG. Так что я взял создал изображение BMP 32х32х16 и через HEX редактор обрезал у него хедер и использую
Если кто-то напишет мне функцию в файле /cmm/lib/obj/libimg.h которая реализует сохранение в BMP или еще круче в PNG я его расцелую))
SaveBMP(pointer_buf, width, height, bit, save_path);
SavePNG(pointer_buf, width, height, bit, save_path);
Открытие изображений идет через LIBIMG, а потому теоретически можно сделать чтобы размер был любым. Пока что захардкодено 32х32, потом возможно сделаю размер до 256х256. Потом произвольно когда дойдут руки. При больших размерах нужен будет скролл, а это муторная штука.
С палитрой планирую так:
1. Будет блок фиксированных цветов что сейчас.
2. Плюс будет блок со списком последний использованых цветов.
3. Плюс будет блок с изменением текущего цвета к светлому и темному.
Много вопросов и все хорошие и правильные.А в каком формате иконки?
Размер иконок произвольный?
Цвета только те, что в палитре?
Вот только программа пока что 0.08, даже не 0.1 и не спроста. Я до этого граф редакторы не разрабатывал и тот процесс что идет сейчас я бы назвал "Разработка через переписывание".
DrawRectangle там одноцветные, просто прямоугольники для этого либы не нужны.
Я двигаюсь от создания базового функционала к расширению функций.
Пока что иконки сохраняются в BMP 32х32х16 и очень криворуким способом. Я не знал как сделать сохранение через структуру BITMAPINFOHEADER, не знал как сделать сохранение через LIBIMG. Так что я взял создал изображение BMP 32х32х16 и через HEX редактор обрезал у него хедер и использую
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")
}
SaveBMP(pointer_buf, width, height, bit, save_path);
SavePNG(pointer_buf, width, height, bit, save_path);
Открытие изображений идет через LIBIMG, а потому теоретически можно сделать чтобы размер был любым. Пока что захардкодено 32х32, потом возможно сделаю размер до 256х256. Потом произвольно когда дойдут руки. При больших размерах нужен будет скролл, а это муторная штука.
С палитрой планирую так:
1. Будет блок фиксированных цветов что сейчас.
2. Плюс будет блок со списком последний использованых цветов.
3. Плюс будет блок с изменением текущего цвета к светлому и темному.
Из хаоса в космос
Как мне кажется, здесь сама постановка вопроса некорректна.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);
Поскольку данные сохраняются как обыкновенный файл с помощью WriteFile.
Можешь посмотреть, как в других программах. Из тех, что делал я — это imgC. Вроде в ЛС тебе скидывал, вот здесь под спойлером есть исходник imgC http://board.kolibrios.org/viewtopic.ph ... 859#p66859 там так сохраняется
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
В теме Delphi7 examples есть пример использования функции DrawImageEx http://board.kolibrios.org/viewtopic.ph ... 469#p68938 в котором происходит работа с TBitmapInfoHeader.
Чтение идёт с помощью функции ReadFile, соответственно, если сделать WriteFile, то это по сути и будет SaveBMP.
Я уже использую LIBIMG.
И сорри, я ничего не пому понять из ассмеблерного исходника на 900 строк.
И сорри, я ничего не пому понять из ассмеблерного исходника на 900 строк.
Из хаоса в космос
Спасибо, сделал, скоро залью.Проще говоря, дополнительно переворачивать изображение — лишняя, ненужная работа, достаточно изменить Height.
Из хаоса в космос
libimg пока что позволяет сохранять только 24 битные png изображения. Для других разрядностей нужно доделывать код который в брался из lib_png.
В libimg можно сохранять в bmp и png, отличие там только в одной из констант которая задает формат для сохранения.
В libimg можно сохранять в bmp и png, отличие там только в одной из констант которая задает формат для сохранения.
IgorA
Можешь написать мне функцию на С--?
Или хоть предоставить функцию для сохранения на асме?
Можешь написать мне функцию на С--?
Или хоть предоставить функцию для сохранения на асме?
Из хаоса в космос
Могу дать кусок кода на asm :
Сохранение делается в 4 основных этапа:
1) создается буфер изображения функцией img_create
2) копируется сохраняемое изображение в созданный буфер
3) вызывается само сохранение img_encode (константа LIBIMG_FORMAT_PNG задает формат)
4) удаляется буфер изображения функцией img_destroy
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
1) создается буфер изображения функцией img_create
2) копируется сохраняемое изображение в созданный буфер
3) вызывается само сохранение img_encode (константа LIBIMG_FORMAT_PNG задает формат)
4) удаляется буфер изображения функцией img_destroy
Не, дело-то хозяйское: хочется велосипед изобрести — изобретайLeency wrote:DrawRectangle там одноцветные, просто прямоугольники для этого либы не нужны.
Просто не надо говорить того, чего нет. Судя по коду и скриншоту ты явно пытался соорудить Frame. Ну вот я и предложил поэтому.
Это я удолил http://prntscr.com/icviit
Это баг http://prntscr.com/icvipb, просвет фона.
Last http://prntscr.com/icvjx2
Гуй будет измененен.
Это баг http://prntscr.com/icvipb, просвет фона.
Last http://prntscr.com/icvjx2
Гуй будет измененен.
Из хаоса в космос
Leency, тогда ладно
А что насчёт ColorDialog? Там тоже есть "блок со списком последний использованых цветов"
А что насчёт ColorDialog? Там тоже есть "блок со списком последний использованых цветов"
Попробовал перевести на C--. Код может быть примерно такой:
Возможно что потребуется сделать обертки для функций lib_img. Но эта библиотека уже используется потому возможно что обертки ко всем ее функциям уже есть.
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 - размер файла с изображением ...
}
}
Who is online
Users browsing this forum: No registered users and 1 guest