84 lines
1.9 KiB
C#
84 lines
1.9 KiB
C#
using Eto.Drawing;
|
|
using Eto.Forms;
|
|
using SixLabors.ImageSharp;
|
|
using SixLabors.ImageSharp.PixelFormats;
|
|
using SixLabors.ImageSharp.Processing;
|
|
using TimelapseApi;
|
|
|
|
namespace Timelapse.Desktop;
|
|
|
|
|
|
public class PictureBox : Panel
|
|
{
|
|
LockObj lockObj=LockObj.Create();
|
|
ImageView view =new ImageView();
|
|
public PictureBox()
|
|
{
|
|
this.Content=view;
|
|
this.SizeChanged+=(sender,e)=>{
|
|
Resize();
|
|
|
|
};
|
|
}
|
|
private void SetImage(Stream strm)
|
|
{
|
|
if(view.Image != null && !view.Image.IsDisposed)
|
|
{
|
|
view.Image.Dispose();
|
|
}
|
|
view.Image = new Bitmap(strm);
|
|
}
|
|
private Image<Rgb24>? img=null;
|
|
public Image<Rgb24>? Image {get {return img;} set{ if(value !=null){SetImage(value);}}}
|
|
|
|
public void SetImage(Image<Rgb24> image)
|
|
{
|
|
lockObj.Lock(()=>{
|
|
if(img != null)
|
|
{
|
|
img.Dispose();
|
|
}
|
|
img=image;
|
|
if(img !=null)
|
|
{
|
|
using(var img2=img.Clone())
|
|
{
|
|
img2.Mutate((e)=>{
|
|
e.Resize(Width <= 0 ? 640 : Width,Height <= 0 ? 480 : Height,false);
|
|
});
|
|
MemoryStream strm=new MemoryStream();
|
|
img2.SaveAsBmp(strm);
|
|
strm.Position=0;
|
|
SetImage(strm);
|
|
}
|
|
}
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
public void Resize()
|
|
{
|
|
lockObj.Lock(()=>{
|
|
try{
|
|
if(img !=null)
|
|
{
|
|
using(var img2=img.Clone())
|
|
{
|
|
img2.Mutate((e)=>{
|
|
e.Resize(Width <= 0 ? 640 : Width,Height <= 0 ? 480 : Height,false);
|
|
});
|
|
MemoryStream strm=new MemoryStream();
|
|
img2.SaveAsBmp(strm);
|
|
strm.Position=0;
|
|
SetImage(strm);
|
|
}
|
|
}
|
|
}catch(Exception ex)
|
|
{
|
|
_=ex;
|
|
}
|
|
});
|
|
}
|
|
} |