123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- using FastReport;
- using FastReport.Utils;
- using InABox.Core;
- using NPOI.SS.Formula.Functions;
- using Syncfusion.Windows.PdfViewer;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Drawing.Drawing2D;
- using System.Windows;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Media;
- using Microsoft.VisualBasic.Logging;
- using System.Windows.Media.Media3D;
- using System.Drawing;
- namespace InABox.Wpf.Reports.CustomObjects
- {
- public class MultiImageObject : MultiItemObject
- {
- private List<byte[]>? imageData { get; set; }
- [Category("Data")]
- public string? DataColumn { get; set; }
- [Category("Data")]
- public List<Image>? Images { get; set; }
- public override void GetData()
- {
- base.GetData();
- if (!string.IsNullOrEmpty(DataColumn))
- {
- // reset the image
- Images = null;
- imageData = null;
- object data = Report.GetColumnValueNullable(DataColumn);
- if (data is List<byte[]> list)
- {
- SetImageData(list);
- }
- else if (data is IEnumerable<byte[]> enumerable)
- {
- SetImageData(enumerable);
- }
- }
- }
- private void SetImageData(IEnumerable<byte[]> imageData)
- {
- this.imageData = imageData.ToList();
- }
- private void SetImageData(List<byte[]> imageData)
- {
- this.imageData = imageData.ToList();
- }
- private class ImageItem : Item
- {
- public Image Image;
- public float Width => Image.Width;
- public float Height => Image.Height;
- public ImageItem(Image image)
- {
- Image = image;
- }
- }
- #region Serialization
- public override void Serialize(FRWriter writer)
- {
- base.Serialize(writer);
- if(writer.DiffObject is MultiImageObject c)
- {
- if (DataColumn != c.DataColumn)
- writer.WriteValue("DataColumn", DataColumn);
- if (writer.SerializeTo != SerializeTo.SourcePages)
- {
- if (writer.SerializeTo == SerializeTo.Preview || String.IsNullOrEmpty(DataColumn))
- {
- if (Images == null && imageData != null)
- writer.WriteStr("Images", Serialization.Serialize(imageData));
- else if (!writer.AreEqual(Images, c.Images))
- writer.WriteValue("Images", Images);
- }
- }
- }
- }
- public override void Deserialize(FRReader reader)
- {
- base.Deserialize(reader);
- if (reader.HasProperty("Images"))
- {
- SetImageData(Serialization.Deserialize<List<byte[]>>(reader.ReadStr("Images")));
- }
- }
- #endregion
- public override void Assign(Base source)
- {
- base.Assign(source);
- if (source is MultiImageObject src)
- {
- DataColumn = src.DataColumn;
- Images = src.Images == null ? null : src.Images.Select(x => x.Clone() as Image).ToList();
- if(src.Images == null && src.imageData != null)
- {
- imageData = src.imageData;
- }
- }
- }
- #region Drawing
- public static Image? Load(byte[] bytes)
- {
- if (bytes != null && bytes.Length > 0)
- {
- try
- {
- #if CROSSPLATFORM
- // TODO memory leaks image converter
- return Image.FromStream(new MemoryStream(bytes));
- #else
- return new ImageConverter().ConvertFrom(bytes) as Image;
- #endif
- }
- catch
- {
- Bitmap errorBmp = new Bitmap(10, 10);
- using (Graphics g = Graphics.FromImage(errorBmp))
- {
- g.DrawLine(Pens.Red, 0, 0, 10, 10);
- g.DrawLine(Pens.Red, 0, 10, 10, 0);
- }
- return errorBmp;
- }
- }
- return null;
- }
- private void LoadImages()
- {
- if (imageData == null) return;
- Images = new();
- for(int i = 0; i < imageData.Count; i++) {
- var saveImageData = imageData[i];
- // FImageData will be reset after this line, keep it
- var newImage = Load(imageData[i]);
- if(newImage != null)
- {
- Images.Add(newImage);
- }
- imageData[i] = saveImageData;
- }
- }
- protected override void DrawItem(FRPaintEventArgs e, Item item, float x, float y, float w, float h)
- {
- if(item is ImageItem image)
- {
- e.Graphics.DrawImage(image.Image, x * e.ScaleX, y * e.ScaleY, w * e.ScaleX, h * e.ScaleY);
- }
- }
- protected override IList<Item>? LoadItems()
- {
- if (Images == null)
- {
- LoadImages();
- }
- if (Images == null)
- {
- return null;
- }
- return Images.Select(x => new ImageItem(x) as Item).ToList();
- }
- #endregion
- }
- }
|