Тема: AHK : Информация о файле
Хочется узнать можно ли определить размер картинки, в пикселях.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Хочется узнать можно ли определить размер картинки, в пикселях.
Проще всего так:
filePath := "D:\Images\MyPicture.png"
oSize := GetImageSize(filePath)
MsgBox, % oSize.W . "`n" oSize.H
ExitApp
GetImageSize(imageFilePath) {
Gui, New
Gui, Add, Pic,, % imageFilePath
GuiControlGet, Pic, Pos, Static1
Gui, Destroy
Return { W: PicW, H: PicH }
}
Я бы таким способом не пользовался, так как картинка может в гуи не загрузиться (например из-за битого кодека).
Надёжней и быстрее так:
pToken := Gdip_StartUp()
pBitmap := Gdip_CreateBitmapFromFile("c:\myImage.jpg")
Gdip_GetImageDimensions(pBitmap, w, h)
Gdip_DisposeImage(pBitmap)
Gdip_ShutDown(pToken)
MsgBox, % "Width: " w " Height: " h
Ну, если уж по-умному, и как быстрее, то лучше так:
filePath := "D:\Images\MyPicture.png"
if oSize := GetImageSize(filePath)
MsgBox, % oSize.W . "`n" oSize.H
GetImageSize(imageFilePath) {
if !hBitmap := LoadPicture(imageFilePath) {
MsgBox, Не удалось получить hBitmap
Return
}
VarSetCapacity(BITMAP, size := 4*4 + A_PtrSize*2, 0)
DllCall("GetObject", Ptr, hBitmap, Int, size, Ptr, &BITMAP)
DllCall("DeleteObject", Ptr, hBitmap)
Return { W: NumGet(BITMAP, 4, "UInt"), H: NumGet(BITMAP, 8, "UInt") }
}
Неа, LoadPicture с битыми файлами не работает.
Да и ну их, эти битые файлы, кому они нужны.
А битый файл зрительно можно и не отличить.
Например битый jpg без видимых битых пикселов может прекрасно открываться в пейнте.
Кстати, с опцией GDI+ открывает.
hBitmap := LoadPicture(imageFilePath, "GDI+")
У меня даже не на чем попробовать.
Ну, если уж по-умному, и как быстрее,
Замерил скорости (13 mb небитый jpg):
LoadPicture(imageFilePath, "GDI+") - 200 ms
LoadPicture(imageFilePath) - 700 ms
Gdip_CreateBitmapFromFile("c:\myImage.jpg") - 30 ms
Да, действительно, через GDI+ быстрее. Но мой вариант зато без сторонних библиотек.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться