Zireael |
Отправлено: 11 Июля, 2019 - 11:18:44
|
Эксперт
Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: STM_SETIMAGE
Вроде как только с бмп работает.
Цитата: картинка должна быть подогнана под этот размер.
Добавить статику этот стиль:
CODE:#define SS_REALSIZECONTROL 64
Размер статика нужно будет менять чтобы пропорции сохранялись.
Сжимает/растягивает также как visualwindow. |
|
|
Kibor |
Отправлено: 11 Июля, 2019 - 11:35:35
|
Эксперт
Покинул форум
Сообщений всего: 8224
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
https://kibor-bot.com/compression.rar
Когда то написал dll для сжатия по ширине и высоте без большой потери качества картинки. Если надо.
2 алгоритма. Включать их первым параметром 0 или 1
CODE:external(INT, "compression_image", "compression_image", "C\compression\Debug\compression.dll");//Получение указателя на функцию
//Память для источника и приемника должна быть одинаково выделена.
int P[1500][1000];//Отсюда берем исходное изображение
int S[1500][1000];//Сюда запишется сжатая картинка, которую выыедем на экран
//Загрузить изображение побольше.
//Например 1000 на 800
loadimage (#P[0][0], "C:\Image_0.bmp");//грузим с файла.
//screen (#P[0][0], 0, 0, 1000, 800, -1);//Можно так же делать просто скрин с помощью screen
int A_P=address(#P[0][0]);
int A_S=address(#S[0][0]);
/*
Параметры
1)
0 - сжатие без расчета среднего цвета (просто берется один из цветов)
могут пропадать отдельные пиксели
1 - сжатие с расчетом среднего цвета.
2) Адрес указателя на изображение источник
3) Число равное выделенной памяти по X
4) Число равное выделенной памяти по Y
5) Адрес указателя на изображение приемник
6) Процент сжатия 1-100
*/
//Сжатие 0 Выводим приемник
compression_image(0, A_P, 1500, 1000, A_S, 27);
visualwindow(0, 0, 0, imagewidth(#S[0][0]), imageheight(#S[0][0]), 10, 10 , 100, #S[0][0]);
//Сжатие 1 Выводим приемник
compression_image(1, A_P, 1500, 1000, A_S, 27);
visualwindow(1, 0, 0, imagewidth(#S[0][0]), imageheight(#S[0][0]), 220, 10 , 100, #S[0][0]);
//Сжатие Кибор Выводим источник
visualwindow(2, 0, 0, imagewidth(#P[0][0]), imageheight(#P[0][0]), 430, 10 , 27, #P[0][0]);
loop()sleep(10); |
|
|
Zireael |
Отправлено: 12 Июля, 2019 - 10:46:13
|
Эксперт
Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Поделись пожалуйста кодом
Просмотр изображений на диалоге (Отобразить)CODE:#define WS_CHILD 1073741824
#define WS_VISIBLE 268435456
#define WS_BORDER 8388608
#define WS_HSCROLL 1048576
#define WS_VSCROLL 2097152
#define LB_ADDSTRING 384
#define LB_GETCURSEL 392
#define LB_GETTEXT 393
#define LB_SETHORIZONTALEXTENT 404
#define LBS_DISABLENOSCROLL 4096
#define LBS_NOTIFY 1
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "GetTextExtentPoint32", "GetTextExtentPoint32A", "Gdi32.dll" );
external(INT, "GetDC", "GetDC", "User32.dll" );
external(INT, "compression_image", "compression_image", pathfolder()+"compression.fffff");
string path="C:\"; // путь к картинкам
int width=600; // максимальная ширина изображения, при которой оно не будет уменьшено
int height=550; // максимальная ширина изображения, при которой оно не будет уменьшено
string file[999]; // массив для имён картинок, которые ищутся через dir
int list, hdc, max_length=0; // для списка
int image[1921][1921], S[1921][1921]; // массивы для картинок
char text_item[999]; // текст выделенного пункта списка
int i;
createdialog(0);
showdialog(0, "Диалог",0, 0, 800, 600, 1, 1);
int count=list_file(path, #file[0], "bmp|png|jpg"); // посик файлов с расширением bmp, png, jpg
messagebox("Найдено файлов: "+format(count));
for (i=0; i<count; i++)add_list(file[i]); // добавление в список строк
loop()sleep(10);
function load_image(int #image2, string name_file)
{
string s;
string path2;
regexreplace(1, #path2, path, "([^\\]+)$", "$1"+"\"); // если путь к файлу не заканчивается \ то он допишется
if(regexsearch(1, #s, name_file, "bmp"))loadimage(#image2[0][0], path2+name_file); // если файл bmp
else
{
if(regexsearch(1, #s, name_file, "png"))loadimage(PNG, #image2[0][0], path2+name_file); // если файл png
else
{
if(regexsearch(1, #s, name_file, "jpg"))loadimage(JPG, #image2[0][0], path2+name_file); // если файл jpg
else
{
messagebox("Файл не bmp, png, jpg");
return;
}
}
}
if(imagewidth(#image2[0][0])<width) // если ширина картинки меньше указанной, то выводим изображение как есть
{
visualwindow(formatiw(gethwnd(0)), 0, 0, 0, imagewidth(#image2[0][0]), imageheight(#image2[0][0]), 180, 10, 100, #image[0][0]);
update(formatiw(gethwnd(0)));
}
else // иначе, сжимаем его
{
int percentX=width * 100 / imagewidth(#image2[0][0]); // высчитываем процент
int percentY=height * 100 / imageheight(#image2[0][0]); // высчитываем процент
if(percentX<percentY)compression_image(0, address(#image2[0][0]), sizearray(image), sizearray(image[]), address(#S[0][0]), percentX);
else compression_image(0, address(#image2[0][0]), sizearray(image), sizearray(image[]), address(#S[0][0]), percentY);
visualwindow(formatiw(gethwnd(0)), 0, 0, 0, imagewidth(#S[0][0]), imageheight(#S[0][0]), 180, 10, 100, #S[0][0]);
update(formatiw(gethwnd(0)));
}
}
function list_file(string path_to_images, string #image_name, string ext)
{
string ss, s[99999], R=".+\.(?:"+ext+")";;
int x=0, count_file=dir(path_to_images, #s[0], "file");
for (int i=0; i<count_file; i++)
{
if(regexsearch(1, #ss, s[i], R)){image_name[x]=ss; x++;}
}
return x;
}
function getmessage(0, WM_COMMAND)
{
if(message.lparam==list) // если выбрана строка в списке
{
// узнаём номер выбранной строки и её текст
if(sendmessage(LB_GETTEXT, sendmessage(LB_GETCURSEL, 0, 0, formatiw(list)), address(#text_item[0]), formatiw(list)))
{
load_image(#image[0][0], format(#text_item[0])); // загрузка изображения
}
}
}
function getmessage(0, WM_CREATE)
{
list=CreateWindow(0, "LISTBOX", "", LBS_NOTIFY | LBS_DISABLENOSCROLL | WS_VSCROLL | WS_HSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE, 10, 10, 150, 250, gethwnd(0), 0, 0, 0);
hdc=GetDC(list);
}
function add_list(string s)
{
int SIZE[2];
new char c[size(s)+1];
strcpy(#c[0], s);
GetTextExtentPoint32(hdc, address(#c[0]), sizearray(c), address(#SIZE[0])); // узнать длину текста в пикселях
if(max_length<SIZE[0])
{
max_length=SIZE[0]; // запомнить максимальную длину строки
sendmessage(LB_SETHORIZONTALEXTENT, SIZE[0], 0, formatiw(list)); // установить ширину прокрутки
}
sendmessage(LB_ADDSTRING, 0, address(#c[0]), formatiw(list));
delete c;
}
Длл из поста Kibor закинуть в папку с кибор.
Нет отключения вывода изображения перед закрытием диалога, так что может вылететь. Нужно чтобы баг с wm_close был исправлен. |
|
|
|