[MacRuby-devel] NSBitmapImageRep representationUsingType

Kenny Lovrin kenny at ustwo.se
Wed Aug 11 13:43:19 PDT 2010


Sure, here's the parts that I think is of value:

Heres how my queue is defined:

class MetadataDownloader

@@queue = Dispatch::Queue.new("se.kennylovrin.test")

class << self

def fetch(id)
downloader = new(id)
@@queue.async do
downloader.start
end
end

end

<more code here.....>
end

I use this by looping an array of integers, calling
MetadataDownloader.fetch(var), hoping it will instantiate a new downloader
and start it in the queue. :)

Then, it does some work, connecting to some API's and downloading som data
which contains a url to an image, that url is later passed into this
instance method:

def save_poster(url)
stamp = Time.now.to_i
save_path = File.join CoreDataManager.instance.app_support_dir, "posters",
"#{stamp}.jpg"
save_path_small = File.join CoreDataManager.instance.app_support_dir,
"posters", "#{stamp}_small.jpg"
 fm = NSFileManager.defaultManager
unless fm.fileExistsAtPath save_path
error = Pointer.new_with_type "@"
unless fm.createDirectoryAtPath save_path.stringByDeletingLastPathComponent,
withIntermediateDirectories:true, attributes:nil, error:error
NSLog "Failed to create dir for poster"
return nil
end
 img_data = NSData.dataWithContentsOfURL NSURL.URLWithString(url)
 if img_data && fm.createFileAtPath(save_path, contents:img_data,
attributes:nil)
NSLog "Fullsize poster saved"
jpeg_data = rescaled_image img_data
unless jpeg_data && jpeg_data.writeToFile(save_path_small, atomically:true)
 NSLog "Failed to scale down poster at #{save_path_small}"
 return nil
end
NSLog "Small poster saved"
else
NSLog "Failed to save poster at #{save_path}"
return nil
end
 img_data = nil
end
 save_path_small
end

which uses this instance method to do the scaling (this seems to be where
the problem is):

def rescaled_image(img_data)
NSLog "Rescaling poster"
NSLog "Calculating dimensions"
img = CIImage.imageWithData img_data
y_scale = 300 / img.extent.size.height
x_scale = 200 / img.extent.size.width
scale = [y_scale, x_scale].min
 NSLog "Setting up filter"
scale_filter = CIFilter.filterWithName "CILanczosScaleTransform"
scale_filter.setValue(NSNumber.numberWithFloat(scale), forKey:"inputScale")
scale_filter.setValue(NSNumber.numberWithFloat(1.0),
forKey:"inputAspectRatio")
scale_filter.setValue(img, forKey:"inputImage")
 NSLog "Getting scaled image from filter"
img = scale_filter.valueForKey "outputImage"
 NSLog "Create bitmap rep from image"
rep = NSBitmapImageRep.alloc.initWithCIImage img
NSLog "#{rep}"
options = NSMutableDictionary.dictionaryWithObject
NSNumber.numberWithFloat(0.85), forKey:NSImageCompressionFactor
options.setValue(NSNumber.numberWithBool(true), forKey:NSImageProgressive)
 NSLog "Getting jpeg data from bitmap rep"
jpeg_data = rep.representationUsingType NSJPEGFileType, properties:options
 NSLog "Rescale done, returning data"
jpeg_data
end

As I said, it crashes randomly, but always at the line where it's trying t
get the jpeg representation.. I'm pretty new to Cocoa so I there might be
something stupod going on here.. ;) Everything works as expected if I do not
try to do the image scaling..

I think I am on MacRuby rev. 4407, but there is a risk I have done an update
to rev 4407 but never built it.. I think that is what I have installed
though.

What do I need to do to get a proper crash log? :)

Thanks a lot!
Kenny

On 11 August 2010 22:28, Thibault Martin-Lagardette
<thibault.ml at gmail.com>wrote:

> If it's small enough, and if you can, could you probably share the code
> with us? It might help us debug de problem.
> If you can't, we may need a little more than just that:
> - What version of MacRuby are you running?
> - Can you attach a crashlog?
>
> The more info, the better :-)
>
> --
> Thibault Martin-Lagardette
>
>
>
> On Aug 11, 2010, at 12:55, Kenny Lovrin wrote:
>
> > Hey guys
> >
> > I have a piece of code that runs in a background thread, and it crashes
> randomly. I can't see any structure to the crashing, other than it always
> seem to crash at the following line:
> >
> > jpeg_data = rep.representationUsingType NSJPEGFileType,
> properties:options
> >
> > Are there any known issues with this and macruby, or am I wrong somewhere
> else? I tried running it both on the main thread and also by using sync
> instead of async when i dispatch the thread to the queue, but it still
> crashes randomly.
> >
> > I'm not entierly sure how to debug this, all I get in the log is an
> EXC_BAD_ACCESS and then it stops in my editor at objc_msgSend.
> > Any ideas? :)
> >
> > PS. I need to rescale an image, if anyone know any other way that works
> in a background thread please share. :)
> >
> > Thanks!
> > Kenny
> > _______________________________________________
> > MacRuby-devel mailing list
> > MacRuby-devel at lists.macosforge.org
> > http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>
> _______________________________________________
> MacRuby-devel mailing list
> MacRuby-devel at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-devel/attachments/20100811/9b53e38c/attachment-0001.html>


More information about the MacRuby-devel mailing list