[mono-android] Trouble with Android.Graphics
Jonathan Pryor
jonp at xamarin.com
Wed Nov 30 09:40:23 EST 2011
On Nov 24, 2011, at 7:44 AM, Narcís Calvet wrote:
> Has this been fixed? I'm having problems compressing a bitmap as shown in
> the method below. DecodeStream returns null and I wonder if it's due to:
It's a bug in your code. When you write to a stream, the Position of the stream is at end-of-stream:
> System.IO.MemoryStream stream = new System.IO.MemoryStream();
> if (bmp.Compress(Android.Graphics.Bitmap.CompressFormat.Jpeg, 100, stream))
> {
> Android.Graphics.Bitmap b = Android.Graphics.BitmapFactory.DecodeStream(stream);
Notice that you don't rewind the stream, so the stream you're passing to Java is at EOF, and thus Java reads a 0-length stream, and does the only sane thing it can: return null.
Here's an Activity that Works For Me™ (though this is also tested with what should be the next release, so if this doesn't work for you...it'll be fixed in the next release ;-)
[Activity (Label = "Scratch.Graphics", MainLauncher = true)]
public class Activity1 : Activity
{
int count = 1;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
// Get our button from the layout resource,
// and attach an event to it
Button button = FindViewById<Button> (Resource.Id.myButton);
button.Click += delegate {
button.Text = string.Format ("{0} clicks!", count++); };
var source = BitmapFactory.DecodeResource (Resources, Resource.Drawable.Icon);
Log.Info ("*jonp*", "source? {0}", source != null);
var dest = CompressToPNG (source);
Log.Info ("*jonp*", "dest? {0}", dest != null);
}
private static Android.Graphics.Bitmap CompressToPNG (Android.Graphics.Bitmap bmp)
{
try {
using (var stream = new System.IO.MemoryStream()) {
if (bmp.Compress(Android.Graphics.Bitmap.CompressFormat.Jpeg, 100, stream)) {
stream.Position = 0;
var b = Android.Graphics.BitmapFactory.DecodeStream(stream);
Log.Info ("*jonp*", "decoded stream? {0}", b != null);
return (b == null) ? bmp : b;
}
else
return bmp;
}
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e);
return null;
}
}
}
The output when I run this:
I/*jonp* (31153): source? True
I/*jonp* (31153): decoded stream? True
I/*jonp* (31153): dest? True
Notice that the "decoded stream" in CompressToPNG() is a non-null value.
- Jon
More information about the Monodroid
mailing list