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? img=null; public Image? Image {get {return img;} set{ if(value !=null){SetImage(value);}}} public void SetImage(Image image) { lockObj.Lock(()=>{ 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; } }); } }