Encode image in memory without saving to file [Save image to stream]

Recommended Posts

_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)$hBrush = _GDIPlus_BrushCreateSolid(0xFF000000)
_GDIPlus_GraphicsFillRect($hGraphic, 0, 0,$iWidth, $iHeight,$hBrush)
$hFormat = _GDIPlus_StringFormatCreate()$hFamily = _GDIPlus_FontFamilyCreate("OCR A Extended")
$hFont = _GDIPlus_FontCreate($hFamily, $FontSize, 0)$tLayout = _GDIPlus_RectFCreate(10, 10, 0, 0)
$aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sString,$hFont, $tLayout,$hFormat)
$hBrush = _GDIPlus_BrushCreateSolid(0xFF37FF00) _GDIPlus_GraphicsDrawStringEx($hGraphic, $sString,$hFont, $aInfo[0],$hFormat, $hBrush)$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) _WinAPI_DeleteObject($hBitmap)
_GDIPlus_FontDispose($hFont) _GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_StringFormatDispose($hFormat) _GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_GraphicsDispose($hGraphic)
$TempImg = _TempFile(@ScriptDir, "", ".png") _GDIPlus_ImageSaveToFile($hImage, $TempImg)$NewImage = FileRead($TempImage) I'd like to get rid of this $TempImg = _TempFile(@ScriptDir, "", ".png")
_GDIPlus_ImageSaveToFile($hImage,$TempImg)
$NewImage = FileRead($TempImage)

For example, I'm looking to encode the image object from bmp (as I think it is) to PNG, jpg, jpeg, tiff etc without actually having to save the image to the hard drive and then re-reading it to memory.

I've failed to locate anything like this on the forums...

Edited by FlutterShy

Share on other sites

Select what you want to get rid of, and hit the delete key.

use $hImage however you see fit. Monkey's are, like, natures humans. Share this post Link to post Share on other sites Select what you want to get rid of, and hit the delete key. use$hImage however you see fit.

Ok.

My point is I'd like to figure out how to convert an image in memory from bmp to Jpg, png or gif, any would work fine, so far I only know how to do it by saving the file.

On a side note, the other day you asked why you haven't become an MVP, maybe look at some of your posts to get some insight.

Edited by FlutterShy

:C

bump...

Share on other sites

What have you "figured out" so far?

Monkey's are, like, natures humans.

Share on other sites

What have you "figured out" so far?

I've been looking at some C++ function that did this by saving an image to a stream and doing it in memory, lead me to a post by the one and only UEZ, modified the function I found and surprisingly enough, it's exactly what I needed.

Func _GDIPlus_SaveImageToStream($hBitmap,$iQuality = 50, $Encoder = "jpg") ;coded by Andreik, modified by UEZ, FS Local$tParams
Local $tData Local$pData
Local $pParams Local$sImgCLSID = _GDIPlus_EncodersGetCLSID($Encoder) Local$tGUID = _WinAPI_GUIDFromString($sImgCLSID) Local$pEncoder = DllStructGetPtr($tGUID) If$Encoder == "jpg" Or $Encoder == "jpeg" Then$tParams = _GDIPlus_ParamInit(1)
$tData = DllStructCreate("int Quality") DllStructSetData($tData, "Quality", $iQuality) ;quality 0-100$pData = DllStructGetPtr($tData) _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1,$GDIP_EPTLONG, $pData)$pParams = DllStructGetPtr($tParams) Else$pParams = 0
EndIf

Local $hStream = DllCall("ole32.dll", "uint", "CreateStreamOnHGlobal", "ptr", 0, "bool", True, "ptr*", 0) If @error Then Return SetError(1, 0, 0)$hStream = $hStream[3] DllCall($ghGDIPDll, "uint", "GdipSaveImageToStream", "ptr", $hBitmap, "ptr",$hStream, "ptr", $pEncoder, "ptr",$pParams)
_GDIPlus_BitmapDispose($hBitmap) Local$hMemory = DllCall("ole32.dll", "uint", "GetHGlobalFromStream", "ptr", $hStream, "ptr*", 0) If @error Then Return SetError(2, 0, 0)$hMemory = $hMemory[2] Local$iMemSize = _MemGlobalSize($hMemory) Local$pMem = _MemGlobalLock($hMemory)$tData = DllStructCreate("byte[" & $iMemSize & "]",$pMem)
Local $bData = DllStructGetData($tData, 1)
Local $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data;ptr") DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr",$hStream, "dword", 8 + 8 * @AutoItX64, "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT)) ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms221473(v=vs.85).aspx _MemGlobalFree($hMemory)

Return $bData EndFunc ;==>_GDIPlus_SaveImageToStream P.S. Thanks for the "help". Edited by FlutterShy Share this post Link to post Share on other sites Create an account or sign in to comment You need to be a member in order to leave a comment Create an account Sign up for a new account in our community. It's easy! Register a new account Sign in Already have an account? Sign in here. Sign In Now • Similar Content • By misioooo Hi! I am writing some GUI and i need to use images as buttons, but with text on them (text is from INI file). Part with button looks like this:$ankieta1 = GUICtrlCreateButton($txtAnk1, 100,350,765,164) GUICtrlSetFont(-1, 22, 800, -1, "Arial") ;GUICtrlSetColor(-1,0xffffff)$hImageBtn_1 = _GUIImageList_Create(765, 164) _GUIImageList_AddBitmap($hImageBtn_1, "c:\path\to\ankieta_clean.bmp") _GUICtrlButton_SetImageList($ankieta1, \$hImageBtn_1, 4) GUICtrlSetOnEvent(-1, "On_Ankieta1") The problem - if i uncomment GUICtrlSetColor, color of text changes, but button is just plain gray (no image). How i can change text color not touching image on a button here?
• By ManualIT
Guys, i need help on creating a script that restarts a program once it starts using more than 1GB of memory.
No idea how to start on the script, i don't know which functions i should use for process memory reading.

My mind is in total blank at the moment, so i need a kick start
• By Xandy
NOTE: TOPIC HAS BEEN MERGED TO HERE: MapIt Quest

Special thanks: AdmiralAlkex, Melba23, MrCrearoR, Dragon Warrior 3, SDL
MapIt is a tile world editor.  MapIt was built around the concept of reversing Dragon Warrior map images.  MapIt can take image input and produce a tile and world array.
Changing and replacing tile / world data is easy.  B/c tile world editor.

CTRL+R in image above to signal replace tile action and I use "G" to Get the tile under mouse.
A full list of hotkeys can be assigned in the: Help Menu\Hotkeys

MapParser is a C++ project that scans images for unique tiles.
MapIt can be downloaded without MapParser. MapParser can be toggled off in the Scan_Image dialog. Without MapParser, MapIt will use the Scan_Tiles() function written in AutoIt ; which is 100 * slower Idk. If MapParser.exe will not run for you:      Installing Visual C++ Redistributable for Visual Studio 2015 should fix it: https://www.microsoft.com/en-us/download/details.aspx?id=48145
Example world was made following these steps:
Started with a tile map image of DragonWarrior3 town of: Reeve From MapIt World Menu \ New \ Scan_Image dialog, I set the area to exclude the key legend to the far right of image. After scanning the map image to world and tile array.  I removed a few of the map artifacts.  More work could be done on this world; removing unwanted tiles, but it is fine for now. I saved my world to disk.  This creates folder: Worldname: Containing folder of Tiles and a Worldname.txt. Using The Gimp, I edited some tiles to have a transparent color: Stairs, Trees, Desk Tables, Chest-of-drawers, Chairs, Signs, Doors, Beds. I changed the world layers to 2: World Menu \ Properties. F9 Finds all selected tile on current layer and changes to a new selected tile on new layer. I used F9 to change all Trees on layer: 0 to Trees on layer: 1. Then I used F9 to change all Trees on layer: 0 to Grass on layer: 0
In this video you can see how I used the Tile Menu \ Replace From Disk option to remap tile images to my custom tiles.  Conveniently my tiles already have a transparent pixel.
See video for how that was done:
To use the example world:
First unzip the world save file: http://songersoft.com/programming/mapit/worlds/Reeve_Swapped.zip From the World Menu: choose \Load Navigate to the Reeve_Swapped.txt located in the extracted zip. Or you can scan any image.
The map images I used are here: http://www.realmofdarkness.net/dq/games/nes/dw3/maps/world
• By dejhost
Happy New Year everyone!
I would like to extract the color values of certain pixels in an image.  This is how I picture the workflow:
User opens an image of his choice. Image is shown on the screen. User draws a line into the image. This happens by marking the startpixel and the endpixel of the line The line is drawn, so the user can check visually if he is happy with the line.  The following pixel based properties belonging to the line are stored in Excel: X-Coordinate Y-Coordinate Color Value Additional operations: Extracting for max- and min. color values; Statistical operations.   Browsing through the helpfile of AutoIt I find plenty of functions for treating images (e.g. GDIPlus), but I am completely unsure if Autoit will get me there. Should I read the entire image into an array? Should I rather attempt to script an external image software (e.g. IrfanView, Gimp)?
I would be very thankful if someone could give some recommendations and maybe list a couple of the most important commands to use.
Thank you very much.
Dejhost

• hello Im wondering if it is possible to process image in autoit like this
1. firstly there is colorfull wallpaper
2. Fill all colors (exception rose color) - with white
3. Fill rose color with black color
I see Gdi functions have things to manipulate images
https://imgur.com/a/lFdY26g
×
×
• Create New...