/// <summary> /// Gets the object collection. /// </summary> /// <param name="xmlData"> /// The XML data. /// </param> /// <returns> /// </returns> private async Task <HLinkMediaModelCollection> GetObjectCollection(XElement xmlData) { HLinkMediaModelCollection t = new HLinkMediaModelCollection(); var theORElement = from _ORElementEl in xmlData.Elements(ns + "objref") select _ORElementEl; if (theORElement.Any()) { // load media object references foreach (XElement theLoadORElement in theORElement) { // save the MediaObject reference HLinkMediaModel t2 = new HLinkMediaModel { HLinkKey = GetAttribute(theLoadORElement.Attribute("hlink")), }; // Get region XElement regionDetails = theLoadORElement.Element(ns + "region"); if (regionDetails != null) { HLinkLoadImageModel t3 = new HLinkLoadImageModel { HLinkKey = t2.HLinkKey, HomeImageType = CommonEnums.HomeImageType.ThumbNail, GCorner1X = (int)regionDetails.Attribute("corner1_x"), GCorner1Y = (int)regionDetails.Attribute("corner1_y"), GCorner2X = (int)regionDetails.Attribute("corner2_x"), GCorner2Y = (int)regionDetails.Attribute("corner2_y"), }; t2 = await CreateClippedMediaModel(t3).ConfigureAwait(false); } // Get remaining fields t2.GAttributeRefCollection = GetAttributeCollection(theLoadORElement); t2.GCitationRefCollection = GetCitationCollection(theLoadORElement); t2.GNoteRefCollection = GetNoteCollection(theLoadORElement); // TODO !ELEMENT objref (region?, attribute*, citationref*, noteref*)> // !ATTLIST objref hlink IDREF #REQUIRED priv (0|1) #IMPLIED t.Add(t2); } } // Return sorted by the default text t.SortAndSetFirst(); return(t); }
public static async Task <HLinkMediaModel> CreateClippedMediaModel(HLinkLoadImageModel argHLinkLoadImageModel) { if (argHLinkLoadImageModel is null) { throw new ArgumentNullException(nameof(argHLinkLoadImageModel)); } if (!argHLinkLoadImageModel.DeRef.Valid) { throw new ArgumentException("CreateClippedMediaModel argument is invalid", nameof(argHLinkLoadImageModel)); } IMediaModel returnMediaModel = await MainThread.InvokeOnMainThreadAsync(() => { // TODO cleanup code. Multiple copies of things in use IMediaModel theMediaModel = argHLinkLoadImageModel.DeRef; SKBitmap resourceBitmap = new SKBitmap(); IMediaModel newMediaModel = new MediaModel(); string newHLinkKey = argHLinkLoadImageModel.HLinkKey + "-" + argHLinkLoadImageModel.GCorner1X + argHLinkLoadImageModel.GCorner1Y + argHLinkLoadImageModel.GCorner2X + argHLinkLoadImageModel.GCorner2Y; string outFileName = Path.Combine("Cropped", newHLinkKey + ".png"); string outFilePath = Path.Combine(DataStore.AD.CurrentDataFolder.FullName, outFileName); Debug.WriteLine(argHLinkLoadImageModel.DeRef.MediaStorageFilePath); // Check if already exists IMediaModel fileExists = DV.MediaDV.GetModelFromHLinkString(newHLinkKey); if ((!fileExists.Valid) && (theMediaModel.IsMediaStorageFileValid)) { // Needs clipping using (StreamReader stream = new StreamReader(theMediaModel.MediaStorageFilePath)) { resourceBitmap = SKBitmap.Decode(stream.BaseStream); } // Check for too large a bitmap Debug.WriteLine("Image ResourceBitmap size: " + resourceBitmap.ByteCount); if (resourceBitmap.ByteCount > int.MaxValue - 1000) { // TODO Handle this better. Perhaps resize? Delete for now resourceBitmap = new SKBitmap(); } float crleft = (float)(argHLinkLoadImageModel.GCorner1X / 100d * theMediaModel.MetaDataWidth); float crright = (float)(argHLinkLoadImageModel.GCorner2X / 100d * theMediaModel.MetaDataWidth); float crtop = (float)(argHLinkLoadImageModel.GCorner1Y / 100d * theMediaModel.MetaDataHeight); float crbottom = (float)(argHLinkLoadImageModel.GCorner2Y / 100d * theMediaModel.MetaDataHeight); SKRect cropRect = new SKRect(crleft, crtop, crright, crbottom); SKBitmap croppedBitmap = new SKBitmap( (int)cropRect.Width, (int)cropRect.Height ); SKRect dest = new SKRect( 0, 0, cropRect.Width, cropRect.Height ); SKRect source = new SKRect( cropRect.Left, cropRect.Top, cropRect.Right, cropRect.Bottom); using (SKCanvas canvas = new SKCanvas(croppedBitmap)) { canvas.DrawBitmap(resourceBitmap, source, dest); } // create an image COPY SKImage image = SKImage.FromBitmap(croppedBitmap); // encode the image (defaults to PNG) SKData encoded = image.Encode(); // get a stream over the encoded data using (Stream stream = File.Open(outFilePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite)) { encoded.SaveTo(stream); } croppedBitmap.Dispose(); // ------------ Save new MediaObject newMediaModel = theMediaModel.Copy(); newMediaModel.HLinkKey = newHLinkKey; newMediaModel.OriginalFilePath = outFileName; newMediaModel.MediaStorageFile = StoreFolder.FolderGetFile(DataStore.AD.CurrentDataFolder, outFileName);; newMediaModel.IsClippedFile = true; newMediaModel.MetaDataHeight = cropRect.Height; newMediaModel.MetaDataWidth = cropRect.Width; newMediaModel = SetHomeImage(newMediaModel); DataStore.DS.MediaData.Add((MediaModel)newMediaModel); } else { Dictionary <string, string> argErrorDetail = new Dictionary <string, string> { { "Original ID", theMediaModel.Id }, { "Original File", theMediaModel.MediaStorageFilePath }, { "Clipped Id", argHLinkLoadImageModel.DeRef.Id } }; DataStore.CN.NotifyError("File not found when Region specified in ClipMedia", argErrorDetail); } resourceBitmap.Dispose(); return(newMediaModel); }).ConfigureAwait(false); return(returnMediaModel.HLink); }
public static async Task <HLinkMediaModel> CreateClippedMediaModel(HLinkLoadImageModel argHLinkLoadImageModel) { if (argHLinkLoadImageModel is null) { throw new ArgumentNullException(nameof(argHLinkLoadImageModel)); } if (!argHLinkLoadImageModel.DeRef.Valid) { throw new ArgumentException("CreateClippedMediaModel argument is invalid", nameof(argHLinkLoadImageModel)); } // TODO cleanup code. Multiple copies of things in use MediaModel theMediaModel = argHLinkLoadImageModel.DeRef; SKBitmap resourceBitmap = new SKBitmap(); MediaModel newMediaModel = new MediaModel(); string newHLinkKey = argHLinkLoadImageModel.HLinkKey + "-" + argHLinkLoadImageModel.GCorner1X + argHLinkLoadImageModel.GCorner1Y + argHLinkLoadImageModel.GCorner2X + argHLinkLoadImageModel.GCorner2Y; string outFileName = Path.Combine("Cropped", newHLinkKey + ".png"); string outFilePath = Path.Combine(DataStore.AD.CurrentDataFolder.FullName, outFileName); Debug.WriteLine(argHLinkLoadImageModel.DeRef.MediaStorageFilePath); // Check if already exists MediaModel fileExists = DV.MediaDV.GetModelFromHLinkString(newHLinkKey); if (!fileExists.Valid) { // Needs clipping using (StreamReader stream = new StreamReader(theMediaModel.MediaStorageFilePath)) { resourceBitmap = SKBitmap.Decode(stream.BaseStream); } // Check for too large a bitmap Debug.WriteLine("Image ResourceBitmap size: " + resourceBitmap.ByteCount); if (resourceBitmap.ByteCount > int.MaxValue - 1000) { // TODO Handle this better. Perhaps resize? Delete for now resourceBitmap = new SKBitmap(); } float crleft = (float)(argHLinkLoadImageModel.GCorner1X / 100d * theMediaModel.MetaDataWidth); float crright = (float)(argHLinkLoadImageModel.GCorner2X / 100d * theMediaModel.MetaDataWidth); float crtop = (float)(argHLinkLoadImageModel.GCorner1Y / 100d * theMediaModel.MetaDataHeight); float crbottom = (float)(argHLinkLoadImageModel.GCorner2Y / 100d * theMediaModel.MetaDataHeight); SKRect cropRect = new SKRect(crleft, crtop, crright, crbottom); SKBitmap croppedBitmap = new SKBitmap( (int)cropRect.Width, (int)cropRect.Height ); SKRect dest = new SKRect( 0, 0, cropRect.Width, cropRect.Height ); SKRect source = new SKRect( cropRect.Left, cropRect.Top, cropRect.Right, cropRect.Bottom); using (SKCanvas canvas = new SKCanvas(croppedBitmap)) { canvas.DrawBitmap(resourceBitmap, source, dest); } // create an image COPY SKImage image = SKImage.FromBitmap(croppedBitmap); // encode the image (defaults to PNG) SKData encoded = image.Encode(); // get a stream over the encoded data using (Stream stream = File.Open(outFilePath, FileMode.OpenOrCreate, System.IO.FileAccess.Write, FileShare.ReadWrite)) { encoded.SaveTo(stream); } croppedBitmap.Dispose(); // ------------ Save new MediaObject newMediaModel = theMediaModel.Copy(); newMediaModel.HLinkKey = newHLinkKey; newMediaModel.HomeImageHLink.HLinkKey = newHLinkKey; newMediaModel.HomeImageHLink.HomeImageType = CommonConstants.HomeImageTypeThumbNail; newMediaModel.HomeImageHLink.HomeSymbol = CommonConstants.IconMedia; newMediaModel.OriginalFilePath = outFileName; newMediaModel.MediaStorageFile = await StoreFolder.FolderGetFileAsync(DataStore.AD.CurrentDataFolder, outFileName).ConfigureAwait(false); newMediaModel.HomeImageHLink.HomeImageType = CommonConstants.HomeImageTypeThumbNail; newMediaModel.IsClippedFile = true; newMediaModel.MetaDataHeight = cropRect.Height; newMediaModel.MetaDataWidth = cropRect.Width; DataStore.DS.MediaData.Add(newMediaModel); //await StorePostLoad.fixMediaFile(newMediaModel).ConfigureAwait(false); } resourceBitmap.Dispose(); return(newMediaModel.HLink); }