1,20 → 1,20 |
; |
; ªà®á ¤«ï § £à㧪¨ ¨§®¡à ¦¥¨© ç१ äãªæ¨¨ ¡¨¡«¨®â¥ª¨ libimg. |
; ¥©áâ¢¨ï ª®â®àë¥ ¤¥« ¥â ¬ ªà®á load_image_file: |
; Макрос для загрузки изображений чрез функции библиотеки libimg. |
; Действия которые делает макрос load_image_file: |
; |
; ஢¥àï¥â à §¬¥à ¯®«ã祮£® ä ©« á ¨§®¡à ¦¥¨¥¬. |
; 뤥«ï¥â ¯®¤ ¥£® ¯ ¬ïâì ¨ § £à㦠¥â âã¤ ä ©«. |
; ¯à¥¤¥«ï¥â à §¬¥à ¯ ¬ï⨠¥®¡å®¤¨¬®© ¤«ï à ᯠª®¢ª¨ ¨§®¡à ¦¥¨ï. |
; ¥à¥¢ë¤¥«ï¥â ¯ ¬ïâì, ¨ à ᯠª®¢ë¢ ¥â ¨§®¡à ¦¥¨¥ ¨§ ä®à¬ ⮢ jpg, png, ... |
; ¢ ä®à¬ â rgb ª®â®àë© ¬®¦® ¢ë¢®¤¨âì íªà ç¥à¥§ á¨áâ. äãªæ¨î. |
; ਠ¥®¡å®¤¨¬®á⨠¬®¦® â ª¦¥ ¯®«ãç¨âì à §¬¥àë ®âªàë¢ ¥¬®£® ¨§®¡à ¦¥¨ï ¤«ï |
; ¨å ¤ «ì¥©è¥£® ¨á¯®«ì§®¢ ¨ï ¢ ¯à®£à ¬¬¥. |
; Проверяет размер полученного файла с изображением. |
; Выделяет под него память и загружает туда файл. |
; Определяет размер памяти необходимой для распаковки изображения. |
; Перевыделяет память, и распаковывает изображение из форматов jpg, png, ... |
; в формат rgb который можно выводить на экран через сист. функцию. |
; При необходимости можно также получить размеры открываемого изображения для |
; их дальнейшего использования в программе. |
; |
; ¨á¯®«ì§ãî饩 ¯à®£à ¬¬¥ ¤®«¦ ¡ëâì ¯®¤ª«îç¥ ¡¨¡«¨®â¥ª libimg, |
; ®¡ê¥ ¯¥à¥¬¥ ï file_name à §¬¥à®¬ ®ª®«® 4096 ¡ ©â, |
; â ª¦¥ áâàãªâãà run_file_70 ⨯ FileInfoBlock. |
; В использующей программе должна быть подключена библиотека libimg, |
; объявлена переменная file_name размером около 4096 байт, |
; а также структура run_file_70 типа FileInfoBlock. |
|
; ¯®¤ª«î票¥ ¥ª®â®àëå ¥®¡å®¤¨¬ëå ä ©«®¢: |
; подключение некоторых необходимых файлов: |
include 'dll.inc' |
include 'develop/libraries/box_lib/load_lib.mac' |
include 'develop/libraries/libs-dev/libio/libio.inc' |
22,38 → 22,26 |
align 4 |
open_b rb 560 |
|
txt_err_img_file: |
if lang eq ru |
db '訡ª N' |
.n: db '* ¯à¨ ®âªàë⨨ ä ©« ' |
else |
db 'Error N' |
.n: db '*. Can',39,'t open file ' |
end if |
.f: dd 0,0 |
|
; path - ¬®¦¥â ¡ëâì ¯¥à¥¬¥®© ¨«¨ áâப®¢ë¬ ¯ à ¬¥â஬ |
; buf - ¯¥à¥¬¥ ï ªã¤ ¡ã¤¥â § ¯¨á 㪠§ â¥«ì ¨§®¡à ¦¥¨¥ ¢ ä®à¬ ⥠rgb, |
; ¢ á«ãç ¥ ¥á«¨ ä ©« ¥ ®âªà®¥âáï â® ¡ã¤¥â § ¯¨á 0 |
; img_w, img_h - ¯¥à¥¬¥ë¥ ªã¤ ¡ã¤ãâ § ¯¨á ë à §¬¥àë ®âªàë¢ ¥¬®£® |
; ¨§®¡à ¦¥¨ï, ¥ ®¡ï§ ⥫ìë¥ ¯ à ¬¥âàë |
; bytes_p_p - ᪮«ìª® ¡ ©â ¯ ¬ï⨠¡à âì ¯¨ªá¥«ì, ¥ ®¡ï§ ⥫ìë© ¯ à ¬¥âà |
; ¥á«¨ ¥ 㪠§ ¡¥à¥âáï 3. ¨¨¬ «ì®¥ § 票¥ ¤®«¦® ¡ëâì ¥ ¬¥ìè¥ 3. |
; path - может быть переменной или строковым параметром |
; buf - переменная куда будет записан указатель на изображение в формате rgb, |
; в случае если файл не откроется то будет записан 0 |
; img_w, img_h - переменные куда будут записаны размеры открываемого |
; изображения, не обязательные параметры |
; bytes_p_p - сколько байт памяти брать на пиксель, не обязательный параметр |
; если не указан берется 3. Минимальное значение должно быть не меньше 3. |
macro load_image_file path, buf, img_w, img_h, bytes_p_p |
{ |
local .err_open |
local .end_open |
|
if path eqtype '' ;¯à®¢¥à塞 § ¤ «¨ áâப®© ¯ à ¬¥âà path |
if path eqtype '' ;проверяем задан ли строкой параметр path |
local .path_str |
jmp @f |
.path_str db path ;ä®à¬¨à㥬 «®ª «ìãî ¯¥à¥¬¥ãî |
.path_str db path ;формируем локальную переменную |
db 0 |
@@: |
;32 - áâ ¤ àâë© ¤à¥á ¯® ª®â®à®¬ã ¤®«¦¥ ¡ëâì ¡ãä¥à á á¨áâ¥¬ë¬ ¯ã⥬ |
;32 - стандартный адрес по которому должен быть буфер с системным путем |
copy_path .path_str,[32],file_name,0 |
else |
copy_path path,[32],file_name,0 ;ä®à¬¨à㥬 ¯®«ë© ¯ãâì ª ä ©«ã ¨§®¡à ¦¥¨ï, ¯®¤à §ã¬¥¢ ¥¬ çâ® ® ¢ ®¤®© ¯ ¯ª¥ á ¯à®£à ¬¬®© |
copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой |
end if |
mov dword[buf],0 |
|
66,10 → 54,10 |
mov dword[run_file_70.FileName], file_name |
mcall SF_FILE,run_file_70 |
or eax,eax |
jnz .err_open |
jnz .end_open |
|
mov ecx,dword[open_b+32] ;+32 qword: à §¬¥à ä ©« ¢ ¡ ©â å |
stdcall mem.Alloc,ecx ;¢ë¤¥«ï¥¬ ¯ ¬ïâì ¤«ï ¨§®¡à ¦¥¨ï |
mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах |
stdcall mem.Alloc,ecx ;выделяем память для изображения |
mov [buf],eax |
mov [run_file_70.Function], SSF_READ_FILE |
mov [run_file_70.Position], 0 |
78,15 → 66,13 |
mov [run_file_70.Buffer], eax |
mov byte[run_file_70+20], 0 |
mov [run_file_70.FileName], file_name |
mcall SF_FILE,run_file_70 ;§ £à㦠¥¬ ä ©« ¨§®¡à ¦¥¨ï |
test eax,eax |
jnz .err_open |
mcall SF_FILE,run_file_70 ;загружаем файл изображения |
cmp ebx,0xffffffff |
je .end_open |
;®¯à¥¤¥«ï¥¬ ¢¨¤ ¨§®¡à ¦¥¨ï ¨ ¯¨è¥¬ ¥£® ¯ à ¬¥âàë |
;определяем вид изображения и пишем его параметры |
stdcall [img_decode], [buf],ebx,0 |
mov ebx,eax |
;®¯à¥¤¥«ï¥¬ à §¬¥à ¤¥ª®¤¨à®¢ ®£® ¨§®¡à ¦¥¨ï |
;определяем размер декодированного изображения |
mov ecx,[eax+4] ;+4 = image width |
if img_w eq |
else |
104,25 → 90,9 |
else |
imul ecx,bytes_p_p |
end if |
stdcall mem.ReAlloc,[buf],ecx ;¨§¬¥ï¥¬ à §¬¥à ¤«ï ¡ãä¥à |
stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера |
mov [buf],eax |
stdcall [img_to_rgb2], ebx,[buf] ;¯à¥®¡à §ã¥¬ ¨§®¡à ¦¥¨¥ ª ä®à¬ âã rgb |
stdcall [img_destroy], ebx ;㤠«ï¥¬ ¢à¥¬¥ë© ¡ãä¥à á ¯ à ¬¥âà ¬¨ ¨§®¡à ¦¥¨ï |
jmp .end_open |
.err_open: |
add al,'0' |
mov byte[txt_err_img_file.n],al |
if path eqtype '' |
mov eax,dword[.path_str] |
mov dword[txt_err_img_file.f],eax |
mov eax,dword[.path_str+4] |
else |
mov eax,dword[path] |
mov dword[txt_err_img_file.f],eax |
mov eax,dword[path+4] |
end if |
mov dword[txt_err_img_file.f+4],eax |
mov byte[txt_err_img_file.f+7],0 |
notify_window_run txt_err_img_file |
stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb |
stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения |
.end_open: |
} |