From 81fc529ef4616dca4e86d994afce29f9f17c38e7 Mon Sep 17 00:00:00 2001 From: Hendrik Langer Date: Mon, 23 Jul 2018 16:24:17 +0200 Subject: [PATCH] import savejpeg example --- windows-snapshot-tool/CMakeLists.txt | 15 +++- windows-snapshot-tool/bin/freeze.exe | Bin 398830 -> 406889 bytes windows-snapshot-tool/cmake/FindGDIPLUS.cmake | 64 ++++++++++++++++++ windows-snapshot-tool/src/main.cpp | 60 +++++++++++++++- 4 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 windows-snapshot-tool/cmake/FindGDIPLUS.cmake diff --git a/windows-snapshot-tool/CMakeLists.txt b/windows-snapshot-tool/CMakeLists.txt index ab4f41c..deb8c85 100644 --- a/windows-snapshot-tool/CMakeLists.txt +++ b/windows-snapshot-tool/CMakeLists.txt @@ -1,6 +1,7 @@ cmake_minimum_required (VERSION 2.4) project (freeze) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin) set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}) set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}) @@ -8,10 +9,22 @@ set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}) add_definitions(-DUNICODE -D_UNICODE) SET( CMAKE_EXE_LINKER_FLAGS "-mwindows" ) -include_directories("${PROJECT_SOURCE_DIR}") +find_package( GDIPLUS ) +set(CMAKE_REQUIRED_DEFINITIONS -DGDIPLUS_LOWERCASE=${GDIPLUS_LOWERCASE}) +set(CMAKE_REQUIRED_INCLUDES ${GDIPLUS_INCLUDE_DIR}) +set(CMAKE_REQUIRED_LIBRARIES ${GDIPLUS_LIBRARY}) + +#find_library(GDIPLUS gdiplus) +#add_library(gdiplus SHARED) +add_definitions(${GDIPLUS_DEFINITIONS}) +link_directories(${GDIPLUS_INCLUDE_DIR}) +link_libraries(${GDIPLUS_LIBRARIES}) + +include_directories("${PROJECT_SOURCE_DIR} ${GDIPLUS_INCLUDE_DIR}") add_executable (freeze src/main.cpp src/resource.rc) +target_link_libraries(freeze ${GDIPLUS}) # mkdir build && cd build # rm -r CMakeCache.txt CMakeFiles/ # cmake -DCMAKE_TOOLCHAIN_FILE=../Toolchain-cross-mingw32-linux.cmake ../ diff --git a/windows-snapshot-tool/bin/freeze.exe b/windows-snapshot-tool/bin/freeze.exe index 6bca1dc06ca93fca854376c62a9e74f7f8a486e0..0a96b2cf7eac67da865d5af8367e7fc7967635cd 100755 GIT binary patch delta 27909 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ȿc}*#5BKpm*Gt<}aa(N$$$CpeE`BQz+Uz~19>^iA{_Nf32#``$@oxh; zrfPuCoa}TvA;0)B?;pibvnyU8%T#s1;XoQyK^P509oQ5gyHsW70I5U{GE!SZ~i2W)!-R#pJF?@XFWT4v#x$1;?;bjKe?2!(3 zLgIlGsNyimiIZstWW6;nH{xADGF5@N7f8D*5Dx)4phBJnLjBzC&@mtdD$WN$#;YuM z4#eaz9-8+4@heE@RB8k94%A$g+HfEjRmemj`&7t0Ahg*X$_Ik8$6*w&2yj{))PRJT zIjGf>8XCYpKeYhqRCT$(1F^ov4d1bS3uLaU8rOi(COedsMT;;*`l701^uxPOMwQxN zAZ;pSBoIA(Bsb}zFl%*g)_u}P%XJb$h0Gqrw3l#pECjb+L1o7Zfq1AQbsvy(Do#BR z>kG-U);mB>sJ!?Lh#|rnmaOu^WyLu~+%8pZy3HUZ+6u!rB&2iUkc#v(IO=OU4PL8B zw`svMZU7M4?2Q@jgy8S!xP>aMj6j%Ht1SR2hDa>x3jQ$a0m+KDgWbo703CZMUywLP z2hLF-6c)QTtw8crWq%BW9u>-sL{8AlLTgkZ^fY7gG}_d%a+Z{oRp7c<6`mmalTB>) z!s38**|bPD4af=P}3oFl4onqtn!MoVys&?t6FN5la|p5Sp+0Q6^24H zpiWi8Yyo0aAx}CPdJ#wmT(pPkBPUL`6T$^c^>V0~r+iz)v93cwTBs^M5lD{;nGd8> zRgdLPrdI>OYQ|w~w*ayJT?;vm6=yKkOU7`v^WRv{yae$!mC<*BsIQDVfY4@dnqPnz zR9fQD-kf1h$XFnGsw&Mj1L{&ixj;&7rm5A7@{74`s#Y&|GJQV~Uz--W!hkg6bO0zd z7{@&WMYWP$hUp$(`6u#0+pczAoaFtWJz}nab=`(dL}qD zG~u7((7ho}XJZven{9@``JeQ!yEDseG5o{%9CS2sLF_!!Z``#tcvq@ zARQ{?7a-~>!6g(!xhkOjeE{uKd7BW*mi{V+PMrb?ZT1k&2U4fvRscB%&+IkZ0K{Z- z!xGA|AAb`EHl6)dWV|`+&Y5HAD{%O>WJdgGd_An97@sgxKCzaHC4qxHVf56LX{IcE z%FC27Z%$gqq^WbVQl`x@WlXxG7c)Mo_lGZ2moGQXoRbxwD19$%3OC2d@rsZ?uvRL8o;yySWKN=kCciW1}3-e63-eVdqe@_qoCevrorkCa~GmTZg z#hH}_#tKgUKV=Lz_!8F*CDJ#%6p8&KXXXm}^p_JXe=W=zrVorcqxLV8Im@I^nmNPL zXV3uSqh&b;yE_&1=`?3HeQnJdrB9(Ls1iQw7v0oouTR0Lgyyn2_7BOaBxSbGV6 zXY14=>(}noXs_?&sfAOfl-R$r*GpvoJYO$CuaEmR`CJv>*7mn{A)DGOAL~~0hClfx zqV4mB>{dZ{a-h{fFZ0Y>qx&@yAD0-FkcD66&pNYmvhaODeD*ENq4m%`m`{@%BgJ^> zzLHLg|LKFA%+p)31L9*L<);(bBk^C7%b%ZPxz>lX8>+ delta 21628 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 diff --git a/windows-snapshot-tool/cmake/FindGDIPLUS.cmake b/windows-snapshot-tool/cmake/FindGDIPLUS.cmake new file mode 100644 index 0000000..a172cfe --- /dev/null +++ b/windows-snapshot-tool/cmake/FindGDIPLUS.cmake @@ -0,0 +1,64 @@ +# - Find GDI+ +# Find the GDI+ includes and libraries +# +# GDIPLUS_INCLUDE_DIR - where to find gdiplus.h +# GDIPLUS_LIBRARIES - List of libraries when using GDI+. +# GDIPLUS_FOUND - True if GDI+ found. + +if(GDIPLUS_INCLUDE_DIR) + # Already in cache, be silent + set(GDIPLUS_FIND_QUIETLY TRUE) +endif(GDIPLUS_INCLUDE_DIR) + +macro(check_winsdk_root_dir key) + get_filename_component(CANDIDATE ${key} ABSOLUTE) + if (EXISTS ${CANDIDATE}) + set(WINSDK_ROOT_DIR ${CANDIDATE}) + endif() +endmacro() + +check_winsdk_root_dir("[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Microsoft SDKs\\\\Windows\\\\v7.0;InstallationFolder]") +check_winsdk_root_dir("[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Microsoft SDKs\\\\Windows\\\\v7.0A;InstallationFolder]") +check_winsdk_root_dir("[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Microsoft SDKs\\\\Windows\\\\v7.1;InstallationFolder]") +check_winsdk_root_dir("[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Microsoft SDKs\\\\Windows\\\\v7.1A;InstallationFolder]") +check_winsdk_root_dir("[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Windows Kits\\\\Installed Roots;KitsRoot]") +check_winsdk_root_dir("[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Windows Kits\\\\Installed Roots;KitsRoot81]") + +find_path(GDIPLUS_INCLUDE_DIR + NAMES + GdiPlus.h + gdiplus.h + PATH_SUFFIXES + Include + Include/um + Include/shared + PATHS + "${WINSDK_ROOT_DIR}" + ) +if(EXISTS ${GDIPLUS_INCLUDE_DIR}/GdiPlus.h) + set(GDIPLUS_LOWERCASE 0 CACHE INTERNAL "Is GdiPlus.h spelt with lowercase?") +else() + set(GDIPLUS_LOWERCASE 1 CACHE INTERNAL "Is GdiPlus.h spelt with lowercase?") +endif() + +if (MINGW) + find_library(GDIPLUS_LIBRARY NAMES libgdiplus gdiplus) +else(MINGW) + set(GDIPLUS_LIBRARY gdiplus) +endif(MINGW) + + +# Handle the QUIETLY and REQUIRED arguments and set GDIPLUS_FOUND to TRUE if +# all listed variables are TRUE. +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(GDIPLUS DEFAULT_MSG + GDIPLUS_INCLUDE_DIR GDIPLUS_LIBRARY) + +if(GDIPLUS_FOUND) + set(GDIPLUS_LIBRARIES ${GDIPLUS_LIBRARY}) +else(GDIPLUS_FOUND) + set(GDIPLUS_LIBRARIES) +endif(GDIPLUS_FOUND) + +mark_as_advanced(GDIPLUS_INCLUDE_DIR GDIPLUS_LIBRARY GDIPLUS_LOWERCASE) + diff --git a/windows-snapshot-tool/src/main.cpp b/windows-snapshot-tool/src/main.cpp index 44d5326..2ec8a3c 100644 --- a/windows-snapshot-tool/src/main.cpp +++ b/windows-snapshot-tool/src/main.cpp @@ -1,5 +1,7 @@ #include "resource.h" -#include "LimitSingleInstance.h" +#include +//#include "LimitSingleInstance.h" + /*variables*/ UINT WM_TASKBAR = 0; @@ -478,3 +480,59 @@ int CaptureImage(HWND hWnd, const wchar_t* filename) { return 0; } +int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) +{ + using namespace Gdiplus; + UINT num = 0; // number of image encoders + UINT size = 0; // size of the image encoder array in bytes + + ImageCodecInfo* pImageCodecInfo = NULL; + + GetImageEncodersSize(&num, &size); + if(size == 0) + return -1; // Failure + + pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); + if(pImageCodecInfo == NULL) + return -1; // Failure + + GetImageEncoders(num, size, pImageCodecInfo); + + for(UINT j = 0; j < num; ++j) + { + if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 ) + { + *pClsid = pImageCodecInfo[j].Clsid; + free(pImageCodecInfo); + return j; // Success + } + } + + free(pImageCodecInfo); + return -1; // Failure +} + + +/** Save compressed picture + * + * https://stackoverflow.com/questions/997175/how-can-i-take-a-screenshot-and-save-it-as-jpeg-on-windows + */ +void SaveJpeg(HBITMAP hBmp, LPCWSTR lpszFilename, ULONG uQuality) +{ + //using namespace Gdiplus; + Gdiplus::GpBitmap* pBitmap; + Gdiplus::DllExports::GdipCreateBitmapFromHBITMAP(hBmp, NULL, &pBitmap); + + CLSID imageCLSID; + GetEncoderClsid(L"image/jpeg", &imageCLSID); + + Gdiplus::EncoderParameters encoderParams; + encoderParams.Count = 1; + encoderParams.Parameter[0].NumberOfValues = 1; + encoderParams.Parameter[0].Guid = Gdiplus::EncoderQuality; + encoderParams.Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong; + encoderParams.Parameter[0].Value = &uQuality; + + Gdiplus::DllExports::GdipSaveImageToFile(pBitmap, lpszFilename, &imageCLSID, &encoderParams); +} +