Libs-dev/libimg/ru
Jump to navigation
Jump to search
libimg.obj - это библиотека с помощью которой можно выводить на экран файлы в форматах bmp, jpg, png. Для вывода изображений на экран можно использовать системную ф. 7. Перед выводом изображение нужно перевести в формат rgb.
Пример вывода файла *.png на экран
Для компиляции в include нужно указать полный путь к папке svn. Программа выводит на экран файл some_file.png размером 200 на 100 пикселей. Для вывода другой картинки нужно указать ее имя и размеры в коде. Подразумевается, что картинка лежит в одной папке с программой.
use32
org 0x0
db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
dd 0x1
dd start
dd i_end ;размер приложения
dd mem
dd stacktop
dd 0x0
dd sys_path
include 'svn/programs/macros.inc'
include 'svn/programs/proc32.inc'
include 'svn/programs/develop/libraries/box_lib/load_lib.mac'
include 'svn/programs/dll.inc'
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load
struct FileInfoBlock
Function dd ?
Position dd ?
Flags dd ?
Count dd ?
Buffer dd ?
db ?
FileName dd ?
ends
IMAGE_FILE_SIZE equ 200*100*3 ;размер файла с изображением 200 x 100
fn_icon1 db 'some_file.png',0 ;имя файла с изображением
align 4
start:
load_libraries l_libs_start,load_lib_end
;проверка на сколько удачно загузилась наша либа
mov ebp,lib1
cmp dword [ebp+ll_struc_size-4],0
jz @f
mcall -1 ;exit not correct
@@:
stdcall mem.Alloc, dword IMAGE_FILE_SIZE ;выделяем память для изображения
mov [image_data_rgb],eax
copy_path fn_icon1,sys_path,file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
mov eax,70 ;70-я функция работа с файлами
mov [run_file_70.Function], 0
mov [run_file_70.Position], 0
mov [run_file_70.Flags], 0
mov [run_file_70.Count], dword IMAGE_FILE_SIZE
m2m [run_file_70.Buffer], [image_data_rgb]
mov byte[run_file_70+20], 0
mov [run_file_70.FileName], file_name
mov ebx,run_file_70
int 0x40 ;загружаем файл изображения
cmp ebx,0xffffffff
je @f
;определяем вид изображения и переводим его во временный буфер image_data
stdcall dword[img_decode], dword[image_data_rgb],ebx,0
mov dword[image_data],eax
;преобразуем изображение к формату rgb
stdcall dword[img_to_rgb2], dword[image_data],dword[image_data_rgb]
;удаляем временный буфер image_data
stdcall dword[img_destroy], dword[image_data]
@@:
mcall 40,0x27
mcall 48,3,sc,sizeof.system_colors ;получаем системные цвета
align 4
red_win:
call draw_window
align 4
still: ;главный цикл
mov eax,10
mcall
cmp al,0x1 ;изменилось положение окна
jz red_win
cmp al,0x2
jz key
cmp al,0x3
jz button
jmp still
align 4
key:
push eax ebx
mcall 2
;...
pop ebx eax
jmp still
align 4
draw_window:
pushad
mcall 12,1
xor eax,eax
mov ebx,20*65536+320
mov ecx,20*65536+240
mov edx,[sc.work]
or edx,0x33000000
mov edi,hed
mcall ;создание окна
mov ecx,(200 shl 16)+100 ;размеры изображения 200 x 100
mov edx,(10 shl 16)+10 ;отступы слева и сверху по 10 пикселей
mcall 7,[image_data_rgb] ;вывод изображения на экран
mcall 12,2
popad
ret
head_f_i:
head_f_l db 'Системная ошибка',0
err_message_found_lib1 db 'Не удалось найти библиотеку libimg.obj',0
err_message_import1 db 'Ошибка при импорте библиотеки libimg.obj',0
system_dir1 db '/sys/lib/'
libimg_name db 'libimg.obj',0
;library structures
l_libs_start:
lib1 l_libs libimg_name, sys_path, file_name, system_dir1, err_message_found_lib1, head_f_l, libimg_import, err_message_import1, head_f_i
load_lib_end:
align 4
button:
mcall 17 ;получить код нажатой кнопки
cmp ah,1
jne still
.exit:
stdcall mem.Free,[image_data_rgb] ;освобождаем память
mcall -1 ;выход из программы
image_data dd 0 ;память для преобразования картинки функциями libimg
image_data_rgb dd 0 ;память с преобразованным изображением в формате rgb
run_file_70 FileInfoBlock
hed db 'Draw image 30.06.10',0 ;подпись окна
sc system_colors ;системные цвета
align 4
libimg_import:
dd alib_init1
img_is_img dd aimg_is_img
img_info dd aimg_info
img_from_file dd aimg_from_file
img_to_file dd aimg_to_file
img_from_rgb dd aimg_from_rgb
img_to_rgb dd aimg_to_rgb
img_to_rgb2 dd aimg_to_rgb2
img_decode dd aimg_decode
img_encode dd aimg_encode
img_create dd aimg_create
img_destroy dd aimg_destroy
img_destroy_layer dd aimg_destroy_layer
img_count dd aimg_count
img_lock_bits dd aimg_lock_bits
img_unlock_bits dd aimg_unlock_bits
img_flip dd aimg_flip
img_flip_layer dd aimg_flip_layer
img_rotate dd aimg_rotate
img_rotate_layer dd aimg_rotate_layer
img_draw dd aimg_draw
dd 0,0
alib_init1 db 'lib_init',0
aimg_is_img db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
aimg_info db 'img_info',0
aimg_from_file db 'img_from_file',0
aimg_to_file db 'img_to_file',0
aimg_from_rgb db 'img_from_rgb',0
aimg_to_rgb db 'img_to_rgb',0 ;преобразование изображения в данные RGB
aimg_to_rgb2 db 'img_to_rgb2',0
aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных
aimg_encode db 'img_encode',0
aimg_create db 'img_create',0
aimg_destroy db 'img_destroy',0
aimg_destroy_layer db 'img_destroy_layer',0
aimg_count db 'img_count',0
aimg_lock_bits db 'img_lock_bits',0
aimg_unlock_bits db 'img_unlock_bits',0
aimg_flip db 'img_flip',0
aimg_flip_layer db 'img_flip_layer',0
aimg_rotate db 'img_rotate',0
aimg_rotate_layer db 'img_rotate_layer',0
aimg_draw db 'img_draw',0
i_end:
rb 1024
stacktop:
sys_path rb 4096
file_name:
rb 4096
plugin_path:
rb 4096
openfile_path:
rb 4096
filename_area:
rb 256
mem: