Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Пн июн 25, 2018 3:14 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 28 сообщений ]  На страницу Пред. 1 2
Автор Сообщение
СообщениеДобавлено: Ср фев 07, 2018 8:23 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4450
В смысле сохранение ресурсов для приложений?

_________________
Через тернии к звездам


Вернуться к началу
СообщениеДобавлено: Ср фев 07, 2018 8:36 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1278
Прикольно :)

А в каком формате иконки?
Размер иконок произвольный?
Цвета только те, что в палитре?

Мне кажется, вместо нескольких DrawRectangle можно было бы использовать Frame из box_lib.
Если помнишь, то там можно выбрать из 5-ти вариантов border style viewtopic.php?f=33&t=2202&p=66494#p66494


Вернуться к началу
СообщениеДобавлено: Чт фев 08, 2018 1:24 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4450
0CodErr

Цитата:
А в каком формате иконки?
Размер иконок произвольный?
Цвета только те, что в палитре?


Много вопросов и все хорошие и правильные.
Вот только программа пока что 0.08, даже не 0.1 и не спроста. Я до этого граф редакторы не разрабатывал и тот процесс что идет сейчас я бы назвал "Разработка через переписывание".

DrawRectangle там одноцветные, просто прямоугольники для этого либы не нужны.

Я двигаюсь от создания базового функционала к расширению функций.
Пока что иконки сохраняются в BMP 32х32х16 и очень криворуким способом. Я не знал как сделать сохранение через структуру BITMAPINFOHEADER, не знал как сделать сохранение через LIBIMG. Так что я взял создал изображение BMP 32х32х16 и через HEX редактор обрезал у него хедер и использую :D
Код:
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")
}


Если кто-то напишет мне функцию в файле /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. Плюс будет блок с изменением текущего цвета к светлому и темному.

_________________
Через тернии к звездам


Вернуться к началу
СообщениеДобавлено: Пт фев 09, 2018 1:17 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1278
Leency писал(а):
Если кто-то напишет мне функцию в файле /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 viewtopic.php?f=24&t=1220&p=66859#p66859 там так сохраняется
Код:
; if converted, try to save ; |-------------------------------------- ;
        push   dword [dstpath]
        push   eax
        push   ecx
        call   file.write

Код:
 image.move(FLIP_VER); //fix an issue that BMP image is flipped vertically
Я просто напомню, уже вопрос похожий был на форуме viewtopic.php?f=38&t=2379&p=44810#p44810
0CodErr писал(а):
Heavyiron писал(а):
Почему 7-я функция выводит изображение снизу вверх справа налево, я не в курсе.
Это потому что данные изображения в файле так хранятся. Это можно определить по значению Height в структуре BITMAPINFOHEADER. Если файл с изображением содержит не зеркально отражённые данные, то в этом случае Height в BITMAPINFOHEADER записывается со знаком минус. Например, чтобы получить такое изображение в фотошопе надо при сохранении поставить флажок "flip row order".
Проще говоря, дополнительно переворачивать изображение — лишняя, ненужная работа, достаточно изменить Height.
Leency писал(а):
Я не знал как сделать сохранение через структуру BITMAPINFOHEADER
Как уже выше сказано, работаем как с обычным файлом, то есть, это как загрузка, только наоборот.
В теме Delphi7 examples есть пример использования функции DrawImageEx viewtopic.php?f=33&t=3469#p68938 в котором происходит работа с TBitmapInfoHeader.
Чтение идёт с помощью функции ReadFile, соответственно, если сделать WriteFile, то это по сути и будет SaveBMP.


Вернуться к началу
СообщениеДобавлено: Пт фев 09, 2018 2:21 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4450
Я уже использую LIBIMG.
И сорри, я ничего не пому понять из ассмеблерного исходника на 900 строк.

_________________
Через тернии к звездам


Вернуться к началу
СообщениеДобавлено: Пт фев 09, 2018 2:47 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4450
Цитата:
Проще говоря, дополнительно переворачивать изображение — лишняя, ненужная работа, достаточно изменить Height.

Спасибо, сделал, скоро залью.

_________________
Через тернии к звездам


Вернуться к началу
СообщениеДобавлено: Пт фев 09, 2018 11:47 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 765
libimg пока что позволяет сохранять только 24 битные png изображения. Для других разрядностей нужно доделывать код который в брался из lib_png.
В libimg можно сохранять в bmp и png, отличие там только в одной из констант которая задает формат для сохранения.


Вернуться к началу
СообщениеДобавлено: Сб фев 10, 2018 11:43 am 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4450
IgorA
Можешь написать мне функцию на С--?
Или хоть предоставить функцию для сохранения на асме?

_________________
Через тернии к звездам


Вернуться к началу
СообщениеДобавлено: Сб фев 10, 2018 2:55 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 765
Могу дать кусок кода на asm :
Код:
      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

Сохранение делается в 4 основных этапа:
1) создается буфер изображения функцией img_create
2) копируется сохраняемое изображение в созданный буфер
3) вызывается само сохранение img_encode (константа LIBIMG_FORMAT_PNG задает формат)
4) удаляется буфер изображения функцией img_destroy


Вернуться к началу
СообщениеДобавлено: Сб фев 10, 2018 3:42 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1278
Leency писал(а):
DrawRectangle там одноцветные, просто прямоугольники для этого либы не нужны.
Не, дело-то хозяйское: хочется велосипед изобрести — изобретай :)
Просто не надо говорить того, чего нет. Судя по коду и скриншоту ты явно пытался соорудить Frame. Ну вот я и предложил поэтому.
Вложение:
1.PNG
1.PNG [ 43.28 КБ | 390 просмотров ]


Вернуться к началу
СообщениеДобавлено: Сб фев 10, 2018 9:03 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4450
Это я удолил http://prntscr.com/icviit
Это баг http://prntscr.com/icvipb, просвет фона.

Last http://prntscr.com/icvjx2
Гуй будет измененен.

_________________
Через тернии к звездам


Вернуться к началу
СообщениеДобавлено: Сб фев 10, 2018 9:58 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1278
Leency, тогда ладно :)
А что насчёт ColorDialog? Там тоже есть "блок со списком последний использованых цветов"


Вернуться к началу
СообщениеДобавлено: Сб фев 17, 2018 11:33 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 765
Попробовал перевести на C--. Код может быть примерно такой:
Код:
// 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 - размер файла с изображением ...
   }
}

Возможно что потребуется сделать обертки для функций lib_img. Но эта библиотека уже используется потому возможно что обертки ко всем ее функциям уже есть.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 28 сообщений ]  На страницу Пред. 1 2

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB