Browse Source

Render image on Xamarin Forms demo using native Android ImageView.

pull/703/head
Canming Huang 4 years ago
parent
commit
d85f440091
  1. 34
      Emgu.CV.Example/XamarinForms/Core/ButtonTextImagePage.cs
  2. 98
      Emgu.CV.Platform/Android/MatAndroid.cs

34
Emgu.CV.Example/XamarinForms/Core/ButtonTextImagePage.cs

@ -5,7 +5,6 @@ using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Xamarin.Forms;
using Emgu.CV;
using Emgu.CV.Util;
@ -21,6 +20,11 @@ using Xamarin.Forms.Platform.MacOS;
using UIKit;
using CoreGraphics;
using Xamarin.Forms.Platform.iOS;
#elif __ANDROID__
using Android.Graphics;
using Android.Views;
using Android.Widget;
using Xamarin.Forms.Platform.Android;
#elif NETFX_CORE
using Xamarin.Forms.Platform.UWP;
#endif
@ -41,8 +45,8 @@ namespace Emgu.CV.XamarinForms
get { return _picker; }
}
private Button _topButton = new Button();
public Button TopButton
private Xamarin.Forms.Button _topButton = new Xamarin.Forms.Button();
public Xamarin.Forms.Button TopButton
{
get { return _topButton; }
}
@ -69,11 +73,11 @@ namespace Emgu.CV.XamarinForms
}
#if __MACOS__
public NSImageView NSImageView { get; set; }
#elif __IOS__
public UIImageView UIImageView { get; set; }
#elif __ANDROID__
public ImageView ImageView { get; set; }
#elif NETFX_CORE
public Windows.UI.Xaml.Controls.Image ImageView { get; set; }
#endif
@ -112,6 +116,9 @@ namespace Emgu.CV.XamarinForms
UIImageView = new UIImageView ();
UIImageView.ContentMode = UIViewContentMode.ScaleAspectFit;
_mainLayout.Children.Add (UIImageView.ToView ());
#elif __ANDROID__
ImageView = new ImageView(Android.App.Application.Context);
_mainLayout.Children.Add(ImageView.ToView());
#elif NETFX_CORE
this.ImageView = new Windows.UI.Xaml.Controls.Image();
_mainLayout.Children.Add(this.ImageView.ToView());
@ -122,7 +129,7 @@ namespace Emgu.CV.XamarinForms
//_mainLayout.Children.Add(MessageLabel);
_mainLayout.Padding = new Thickness(10, 10, 10, 10);
Content = new ScrollView()
Content = new Xamarin.Forms.ScrollView()
{
Content = _mainLayout
};
@ -281,6 +288,19 @@ namespace Emgu.CV.XamarinForms
UIImageView.Hidden = false;
DisplayImage.IsVisible = false;
});
#elif __ANDROID__
Android.Graphics.Bitmap bitmap;
if (image == null)
bitmap = null;
else
bitmap = image.ToBitmap();
Xamarin.Forms.Device.BeginInvokeOnMainThread(
() =>
{
ImageView.SetImageBitmap(bitmap);
ImageView.Visibility = ViewStates.Visible;
DisplayImage.IsVisible = false;
});
#elif __MACOS__
NSImage nsimage;
@ -387,7 +407,7 @@ namespace Emgu.CV.XamarinForms
);
}
public Button GetButton()
public Xamarin.Forms.Button GetButton()
{
//return null;
return this.TopButton;

98
Emgu.CV.Platform/Android/MatAndroid.cs

@ -83,75 +83,77 @@ namespace Emgu.CV
/// <summary>
/// Convert the Mat to Bitmap
/// Convert the image to Bitmap
/// </summary>
/// <param name="mat">The Mat to convert to Bitmap</param>
/// <param name="image">The image to convert to Bitmap</param>
/// <param name="config">The bitmap config type. If null, Argb8888 will be used</param>
/// <returns>The Bitmap</returns>
public static Android.Graphics.Bitmap ToBitmap(this Mat mat, Android.Graphics.Bitmap.Config config = null)
public static Android.Graphics.Bitmap ToBitmap(this IInputArray image, Android.Graphics.Bitmap.Config config = null)
{
System.Drawing.Size size = mat.Size;
using (InputArray iaImage = image.GetInputArray())
{
System.Drawing.Size size = iaImage.GetSize();
if (config == null)
config = Android.Graphics.Bitmap.Config.Argb8888;
if (config == null)
config = Android.Graphics.Bitmap.Config.Argb8888;
Android.Graphics.Bitmap result = Android.Graphics.Bitmap.CreateBitmap(size.Width, size.Height, config);
mat.ToBitmap(result);
return result;
Android.Graphics.Bitmap result = Android.Graphics.Bitmap.CreateBitmap(size.Width, size.Height, config);
image.ToBitmap(result);
return result;
}
}
/// <summary>
/// Convert the Mat to Bitmap
/// Convert the image to Bitmap
/// </summary>
/// <param name="mat">The Mat to convert to Bitmap</param>
/// <param name="image">The image to convert to Bitmap</param>
/// <param name="bitmap">The bitmap, must be of the same size and has bitmap config type of either Argb888 or Rgb565</param>
/// <returns>The Bitmap</returns>
public static void ToBitmap(this Mat mat, Android.Graphics.Bitmap bitmap)
public static void ToBitmap(this IInputArray image, Android.Graphics.Bitmap bitmap)
{
System.Drawing.Size size = mat.Size;
if (!(size.Width == bitmap.Width && size.Height == bitmap.Height))
using (InputArray iaImage = image.GetInputArray())
{
throw new Exception("Bitmap size doesn't match the Mat size");
}
System.Drawing.Size size = iaImage.GetSize();
if (!(size.Width == bitmap.Width && size.Height == bitmap.Height))
{
throw new Exception("Bitmap size doesn't match the Mat size");
}
Android.Graphics.Bitmap.Config config = bitmap.GetConfig();
if (config == Android.Graphics.Bitmap.Config.Argb8888)
{
int channels = mat.NumberOfChannels;
using (BitmapArgb8888Image bi = new BitmapArgb8888Image(bitmap))
Android.Graphics.Bitmap.Config config = bitmap.GetConfig();
if (config == Android.Graphics.Bitmap.Config.Argb8888)
{
if (channels == 1)
int channels = iaImage.GetChannels();
using (BitmapArgb8888Image bi = new BitmapArgb8888Image(bitmap))
{
CvInvoke.CvtColor(mat, bi.Mat, ColorConversion.Gray2Rgba);
}
else if (channels == 3)
{
CvInvoke.CvtColor(mat, bi, ColorConversion.Bgr2Rgba);
}
else if (channels == 4)
{
CvInvoke.CvtColor(mat, bi, ColorConversion.Bgra2Rgba);
}
else
{
using (Image<Rgba, Byte> tmp = mat.ToImage<Rgba, Byte>())
if (channels == 1)
{
tmp.Copy(bi, null);
CvInvoke.CvtColor(image, bi.Mat, ColorConversion.Gray2Rgba);
}
else if (channels == 3)
{
CvInvoke.CvtColor(image, bi, ColorConversion.Bgr2Rgba);
}
else if (channels == 4)
{
CvInvoke.CvtColor(image, bi, ColorConversion.Bgra2Rgba);
}
else
{
throw new NotImplementedException(
String.Format("InputArray of {0} channels is supported.", channels));
}
}
}
}
else if (config == Android.Graphics.Bitmap.Config.Rgb565)
{
using (BitmapRgb565Image bi = new BitmapRgb565Image(bitmap))
using (Image<Bgr, Byte> tmp = mat.ToImage<Bgr, Byte>())
bi.ConvertFrom(tmp);
}
else
{
throw new NotImplementedException("Only Bitmap config of Argb888 or Rgb565 is supported.");
}
else if (config == Android.Graphics.Bitmap.Config.Rgb565)
{
using (BitmapRgb565Image bi = new BitmapRgb565Image(bitmap))
bi.ConvertFrom(image);
}
else
{
throw new NotImplementedException("Only Bitmap config of Argb888 or Rgb565 is supported.");
}
}
}
}

Loading…
Cancel
Save