timelapsenow/Timelapse/PictureBox.cs

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;
}
});
}
}