Conrado P. L. GouvĂȘa
2015-01-06 01:16:49 UTC
I want to call the function GdipLoadImageFromStream(IStream* stream,
GpImage **image) using ctypes, and I need to create the first
parameter from a Python file (e.g. created with open). Is there a way
to do this?
I'm aware of win32com.server.util.FileStream and
win32com.server.util.wrap which can be used to create a IStream from a
file, but the resulting object (PyIStream) is not accepted by ctypes
("ArgumentError: argument 1: : Don't know how to convert parameter 1")
Cheers
Conrado
import ctypes
import pythoncom
from win32com.server import util
from ctypes import wintypes
gdiplus = ctypes.windll.gdiplus
WNDPROC = wintypes.WINFUNCTYPE(ctypes.c_long, ctypes.c_int,
ctypes.c_uint, ctypes.c_int, ctypes.c_int)
class GdiplusStartupInput(wintypes.Structure):
_fields_ = [
('GdiplusVersion', ctypes.c_uint),
('DebugEventCallback', ctypes.c_void_p),
('SuppressBackgroundThread', wintypes.BOOL),
('SuppressExternalCodecs', wintypes.BOOL),
]
def __init__(self):
wintypes.Structure.__init__(self)
self.GdiplusVersion = 1
self.DebugEventCallback = None
self.SuppressBackgroundThread = 0
self.SuppressExternalCodecs = 0
StartupInput = GdiplusStartupInput()
token = ctypes.c_ulong()
gdiplus.GdiplusStartup(ctypes.pointer(token),
ctypes.pointer(StartupInput), None)
f = open(r'test.jpg')
img = ctypes.c_void_p()
fs = util.FileStream(f)
istream = util.wrap(fs, pythoncom.IID_IStream)
r = gdiplus.GdipLoadImageFromStream(istream, ctypes.byref(img))
GpImage **image) using ctypes, and I need to create the first
parameter from a Python file (e.g. created with open). Is there a way
to do this?
I'm aware of win32com.server.util.FileStream and
win32com.server.util.wrap which can be used to create a IStream from a
file, but the resulting object (PyIStream) is not accepted by ctypes
("ArgumentError: argument 1: : Don't know how to convert parameter 1")
Cheers
Conrado
import ctypes
import pythoncom
from win32com.server import util
from ctypes import wintypes
gdiplus = ctypes.windll.gdiplus
WNDPROC = wintypes.WINFUNCTYPE(ctypes.c_long, ctypes.c_int,
ctypes.c_uint, ctypes.c_int, ctypes.c_int)
class GdiplusStartupInput(wintypes.Structure):
_fields_ = [
('GdiplusVersion', ctypes.c_uint),
('DebugEventCallback', ctypes.c_void_p),
('SuppressBackgroundThread', wintypes.BOOL),
('SuppressExternalCodecs', wintypes.BOOL),
]
def __init__(self):
wintypes.Structure.__init__(self)
self.GdiplusVersion = 1
self.DebugEventCallback = None
self.SuppressBackgroundThread = 0
self.SuppressExternalCodecs = 0
StartupInput = GdiplusStartupInput()
token = ctypes.c_ulong()
gdiplus.GdiplusStartup(ctypes.pointer(token),
ctypes.pointer(StartupInput), None)
f = open(r'test.jpg')
img = ctypes.c_void_p()
fs = util.FileStream(f)
istream = util.wrap(fs, pythoncom.IID_IStream)
r = gdiplus.GdipLoadImageFromStream(istream, ctypes.byref(img))