algorithmic modeling for Rhino
Hi Giulio
I have the below class in a GH Python component. After running it for the first time it locks the image. I can only release it by closing Rhino.I do not keep any global references in the GH component. Usage is similar to the test() example. I tried invoking garbage collection and setting is = None but the problem persists.
Do you have any idea how I could work around this problem or how it is caused? I need to edit the image in Photoshop while GH is running.
Thanks,
Silvan
class ImageSampler(object):
"""
Bitmap sampling class that uses the .NET frameworks System.Drawing object
"""
def __init__(self, path):
self.img = System.Drawing.Bitmap(path)
def sample_relative(self, u, v):
ua = int(self.img.Width * u)
va = int(self.img.Height * v)
return self.img.GetPixel(ua, va)
def test():
is = ImageSampler(some_path)
test()
Tags:
Hi Silvan,
Try calling the Dispose function on self.img
Hi Steve
Dispose() seems to work. Thanks. For everybody reading this thread, you have to call Dispose() from outside the class that wraps System.Drawing.Bitmap(), in the above example like this: is.img.Dispose(). I first wrapped Dispose() in the class and called the wrapping method. This did not release the resource and resulted in a memory corruption error in GH.
Best,
Silvan
Hi Silvan
if the class design truly expresses the underlying concept, then you should probably implement a close() method that freezes the resources used by the class.
One way could be adding a "def close(self):" with self.img.Dispose() inside to more properly expose a method that clears resources and closes the file.
I hope this helps,
- Giulio
________________
giulio@mcneel.com
Hi Giulio
Thanks for your answer. This is what I did first and what for some strange reason did not work, but in the below test code it does. Maybe the component was still calculating while I tried to save the image. It is pretty slow.
Anyway I'm fine. Thanks a lot for your help!
Cheers,
Silvan
import clr
clr.AddReference('System.Drawing')
import os
import rhinoscriptsyntax as rs
class ImageSampler(object):
"""
Bitmap sampling class that uses the .NET frameworks System.Drawing object
"""
def __init__(self, path):
self.img = System.Drawing.Bitmap(path)
def sample_relative(self, u, v):
ua = int(self.img.Width * u)
va = int(self.img.Height * v)
return self.img.GetPixel(ua, va)
def dispose(self):
self.img.Dispose()
def test(img_name):
if not img_name: return
folder = rs.WorkingFolder()
image_path = '{0}/{1}'.format(folder, img_name)
img_sampler = ImageSampler(image_path)
#img_sampler.img.Dispose()
img_sampler.dispose()
test('TestMap.jpg')
Welcome to
Grasshopper
Added by Parametric House 0 Comments 0 Likes
Added by Parametric House 0 Comments 0 Likes
Added by Parametric House 0 Comments 0 Likes
Added by Parametric House 0 Comments 0 Likes
Added by Parametric House 0 Comments 0 Likes
© 2024 Created by Scott Davidson. Powered by