Re: AHK: графика
Точнее, это лучше для решения задачи чем 97?
Win10x64 AhkSpy, Hotkey, ClockGui
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Точнее, это лучше для решения задачи чем 97?
Ну тут уже, наверное, тебе решать, какой удобнее.
Через GdipCreateBitmapFromScan0 можно поиграться со значениями PixelFormat:
https://docs.microsoft.com/en-us/dotnet … work-4.7.2
Проще, я имел ввиду - что из двух вариантов может быть теоретически производительнее.
Точнее, это лучше для решения задачи чем 97?
По-моему, это вообще лишнее:
DllCall("Gdiplus.dll\GdipCreateBitmapFromScan0", "uint", W, "uint", H, "uint", Stride, "uint", 0x26200A, "ptr", Bits, "ptr*", pBitmap2)
Здесь мы получаем Bitmap2, которая та же, что предыдущая pBitmap, из которой получен hBitmap.
А какие предложишь еще вариаты?
Я засек время мой пример и serzh82saratov работает практически одновременно (мой чуть-чуть быстрее).
Твой вариант из 93 медленнее.
File = D:\Downloads\Иконки\LOWs6vLjqH0.jpg
Gdip_Startup()
pBitmapFile := Gdip_CreateBitmapFromFile(File)
Gdip_GetImageDimensions(pBitmapFile, W, H)
pBitmap := Gdip_CreateBitmap(W, H)
G := Gdip_GraphicsFromImage(pBitmap)
pBrush := Gdip_BrushCreateSolid(0x88FBD986)
Gdip_FillRoundedRectangle(G, pBrush, 0, 0, W, H, 0)
Gdip_DeleteBrush(pBrush)
Matrix = 0.5
Gdip_DrawImage(G, pBitmapFile, 0, 0, W, H, 0, 0, W, H, Matrix)
;~ Gui, -Caption +E0x80000 +HWNDhGui +AlwaysOnTop +ToolWindow
;~ Gui, Show, Na
;~ hDCBuf := CreateCompatibleDC()
;~ hBitmap := Gdip_CreateHBITMAPFromBitmap(pBitmap, 0x00000000)
;~ SelectObject(hDCBuf, hBitmap)
;~ UpdateLayeredWindow(hGui, hDCBuf, 0, 0, W, H)
Gdip_SaveBitmapToFile(pBitmap, A_Desktop . "\FinalImage.png")
Run % A_Desktop . "\FinalImage.png"
Так тут гуи нету.
В смысле, нету? Оно закомментировано, раскомментируй — будет.
Если я расскоментирую, то мой пример будет чуть быстрее.
Приведи полный код.
setbatchlines -1
File = C:\Untitled-1.jpg
a := a_tickcount
loop 1000
{
Gdip_Startup()
pBitmapFile := Gdip_CreateBitmapFromFile(File)
Gdip_GetImageDimensions(pBitmapFile, W, H)
pBitmap := Gdip_CreateBitmap(W, H)
G := Gdip_GraphicsFromImage(pBitmap)
pBrush := Gdip_BrushCreateSolid(0x88FBD986)
Gdip_FillRoundedRectangle(G, pBrush, 0, 0, W, H, 0)
Gdip_DeleteBrush(pBrush)
Matrix = 0.5
Gdip_DrawImage(G, pBitmapFile, 0, 0, W, H, 0, 0, W, H, Matrix)
Gui, -Caption +E0x80000 +HWNDhGui +AlwaysOnTop +ToolWindow
Gui, Show, Na
hDCBuf := CreateCompatibleDC()
hBitmap := Gdip_CreateHBITMAPFromBitmap(pBitmap, 0x00000000)
SelectObject(hDCBuf, hBitmap)
UpdateLayeredWindow(hGui, hDCBuf, 0, 0, W, H)
Gdip_SaveBitmapToFile(pBitmap, "FinalImage.png")
}
time := a_tickcount - a
a := a_tickcount
loop 1000
{
Gdip_Startup()
pBitmap := Gdip_CreateBitmapFromFile(File)
Gdip_GetImageDimensions(pBitmap, W, H)
hBitmap := CreateDIBSection(W, H)
hDC := CreateCompatibleDC()
SelectObject(hDC, hBitmap)
G := Gdip_GraphicsFromHDC(hDC)
pBrush := Gdip_BrushCreateSolid(0x88FBD986)
Gdip_FillRoundedRectangle(G, pBrush, 0, 0, W, H, 0)
Gdip_DeleteBrush(pBrush)
Matrix = 0.5
Gdip_DrawImage(G, pBitmap, 0, 0, W, H, 0, 0, W, H, Matrix)
Gui, -Caption +E0x80000 +HWNDhGui +AlwaysOnTop +ToolWindow +OwnDialogs +E0x08000000
Gui, Show, Na
UpdateLayeredWindow(hGui, hDC, 0, 0, W, H)
VarSetCapacity(dib, 104, 0)
DllCall("GetObject", Ptr, hBitmap, "int", A_PtrSize = 8 ? 104 : 84, Ptr, &dib)
Stride := NumGet(dib, 12, "Int")
Bits := NumGet(dib, 20 + (A_PtrSize = 8 ? 4 : 0))
DllCall("Gdiplus.dll\GdipCreateBitmapFromScan0", "uint", W, "uint", H, "uint", Stride, "uint", 0x26200A, "ptr", Bits, "ptr*", pBitmap2)
Gdip_SaveBitmapToFile(pBitmap2, "FinalImage.png")
}
msgbox % time "`n" a_tickcount - a
Да, действительно немного быстрее. Но вряд ли есть какая-то выгода от этого, если нужно показать окно.
В 97 в Gdip_CreateHBITMAPFromBitmap передаётся ARGB. По сути если альфа ноль, то остальное не должно быть важно, но 0x00ffffff так же "забеливает" как и 0xffffffff, почему 0x00000000 не "чернит"?
Потому что 0x00000000 это полностью прозрачный черный?
This parameter is ignored if the bitmap is totally opaque.
Очень жирный шрифт, ничего на русском, нет ссылок.
Выплюньте ... и расскажите на русском.
И такое связанное лично с вами, как будто ввязываетесь в чужой разговор, когда никто не просил.
Я не вдавался в подробности, но если посмотреть на функцию UpdateLayeredWindow:
https://docs.microsoft.com/en-us/window … eredwindow
то там описывается алгоритм наложения:
https://docs.microsoft.com/en-us/window … ndfunction
Как я понял работает по типу как screen в фотошопе.
Спасибо. Вообщем всё не просто.
Очень жирный шрифт, ничего на русском, нет ссылок.
Шрифт жирным делает элемент цитирования, документация msdn действительно нерусская, но ссылка на нее оставлена.
Если же у вас личные обиды за конкретную критику, то и выяснять надо было там или в личке.
Со своей стороны сплевывать просить не собираюсь, это на ваше усмотрение.
Кстати, вызов alphablend тут демонстрируется:
https://www.autoitscript.com/forum/topi … om-autoit/
Для запуска надо установить старую версию автоит.
Сама библиотека GDI тут:
https://github.com/Kelturio/Misc/tree/m … GDI%20UDFs
Так а есть смысл, разве простое наложение рисунка с прозрачными областями не так же работает?
С alphablend можно накладывать через GDI.
По производительности не сравнивал.
С alphablend можно накладывать через GDI.
Так я и имел ввиду GDI, на битмап сверху накладываем другой битмап с прозрачностью.
GDI или GDI+?
GDI+ наверное, если DrawImage.
Чтобы отправить ответ, вы должны войти или зарегистрироваться