private void Save(Image image) { if (image == null) { return; } using (PredixContext context = new PredixContext()) { Commentary.Print($"Saving Base64", true); context.ImageContents.AddRange(image.Entry.Contents); context.Images.Add(image); //context.Images.AddOrUpdate(x => x.ImageAssetUid, image); context.SaveChanges(); } }
public void MediaOnDemand(ParkingEvent parkingEvent, string imageAssetUid, string timestamp, Customer customer) { var media = GetMedia(imageAssetUid, timestamp); Image image = new Image { PropertyId = parkingEvent.Properties.Id }; var i = 1; TimeSpan startTime = DateTime.Now.TimeOfDay; while (i < 6 && (image?.Entry == null || !image.Entry.Contents.Any(x => x.Status.Equals("SUCCESS", StringComparison.OrdinalIgnoreCase)))) { i++; if (!string.IsNullOrWhiteSpace(media?.PollUrl)) { Dictionary <string, string> additionalHeaders = new Dictionary <string, string> { { "predix-zone-id", Endpoint.PredixZoneIdForImage } }; var response = _predixHttpClient.GetAllAsync(media.PollUrl, additionalHeaders); if (!string.IsNullOrWhiteSpace(response.Result)) { try { var jsonRespone = JsonConvert.DeserializeObject <JObject>(response.Result); image = jsonRespone != null ? (jsonRespone).ToObject <Image>() : new Image(); } catch (Exception e) { Commentary.Print(e.Message); Commentary.Print(response.Result); } } } if (image?.Entry == null || !image.Entry.Contents.Any(x => x.Status.Equals("SUCCESS", StringComparison.OrdinalIgnoreCase))) { Commentary.Print( $"Polling for Media Data {i} time after {DateTime.Now.TimeOfDay.Subtract(startTime).TotalMinutes} minutes: {media.PollUrl}", true); //Thread.Sleep(1000 * 60); if (i < 6) { Task.Delay(1000 * 60).Wait(1000 * 60); } continue; } var imageBinary = (from content in image.Entry.Contents let additionalHeaders = new Dictionary <string, string> { { "predix-zone-id", Endpoint.PredixZoneIdForImage } } select _predixHttpClient.GetFile(content.Url, additionalHeaders) into response select response.Result).FirstOrDefault(); image.Base64 = imageBinary; image = MarkPixelCoordinates(parkingEvent: parkingEvent, image: image, customer: customer); } if (image == null) { return; } image.PropertyId = parkingEvent.Properties.Id; image.ImageAssetUid = imageAssetUid; image.OriginalBase64 = null; image.Base64 = null; Save(image); //return image.Base64; }
public Image MarkPixelCoordinates(ParkingEvent parkingEvent, Image image, Customer customer) { try { image.OriginalBase64 = image.Base64; if (!string.IsNullOrWhiteSpace(parkingEvent.Properties.PixelCoordinates)) { //IsBase64(image.Base64); string selectedBase64 = image.Base64.Split(',').ToList <string>()[1]; var bitMapImage = Base64StringToBitmap(selectedBase64.Trim()); var coordinates = parkingEvent.Properties.PixelCoordinates.Split(',').ToList(); using (var graphics = Graphics.FromImage(bitMapImage)) { Pen yellowPen = new Pen(Color.Yellow, 3); try { var a1 = coordinates[0].Split(':').Select(float.Parse).ToList()[0]; var a2 = coordinates[0].Split(':').Select(float.Parse).ToList()[1]; var b1 = coordinates[1].Split(':').Select(float.Parse).ToList()[0]; var b2 = coordinates[1].Split(':').Select(float.Parse).ToList()[1]; var c1 = coordinates[2].Split(':').Select(float.Parse).ToList()[0]; var c2 = coordinates[2].Split(':').Select(float.Parse).ToList()[1]; var d1 = coordinates[3].Split(':').Select(float.Parse).ToList()[0]; var d2 = coordinates[3].Split(':').Select(float.Parse).ToList()[1]; graphics.DrawPolygon(yellowPen, new PointF[] { new PointF(a1, a2), new PointF(b1, b2), new PointF(c1, c2), new PointF(d1, d2) }); // Create font and brush. Font drawFont = new Font("Arial", 26); SolidBrush drawBrush = new SolidBrush(Color.White); // Create point for upper-left corner of drawing. PointF drawPoint = new PointF(150.0F, 110.0F); //StringFormat stringFormat = new StringFormat //{ // LineAlignment = StringAlignment.Center, // Alignment = StringAlignment.Center //}; //graphics.DrawString($"Event Id: {parkingEvent.Id}, Asset Uid: {parkingEvent.AssetUid}, Pixel Coordinates {parkingEvent.Properties.PixelCoordinates}", // drawFont, drawBrush, drawPoint); List <string> writings = new List <string> { $"Event Id: {parkingEvent.Id}", $"In or Out: {parkingEvent.EventType}", $"Local Time: {parkingEvent.Timestamp.ToUtcDateTimeOrNull().ToTimeZone(customer.TimezoneId)} {parkingEvent.EventTime?.ToString("F")}" //$"Location Uid: {parkingEvent.LocationUid}", //$"Asset Uid: {parkingEvent.AssetUid}", //$"Pixel Coordinates {parkingEvent.Properties.PixelCoordinates}" }; foreach (var writing in writings) { drawPoint.Y = drawPoint.Y + 40; graphics.DrawString(writing, drawFont, drawBrush, drawPoint); } } catch (Exception e) { Commentary.Print( $"Failed to mark pixel coordinates {parkingEvent.Properties.PixelCoordinates} PropertyId {parkingEvent.Properties.Id}"); Commentary.Print(e.Message); } } using (MemoryStream memoryStream = new MemoryStream()) { string randomTempFileName = Path.GetTempPath(); if (!Directory.Exists($"{randomTempFileName}CivicSmart\\{DateTime.Now:yyyy-MM-dd}")) { Directory.CreateDirectory($"{randomTempFileName}CivicSmart\\{DateTime.Now:yyyy-MM-dd}"); } var fileName = $"{randomTempFileName}CivicSmart\\{DateTime.Now:yyyy-MM-dd}\\geviolation{DateTime.Now.Ticks}.jpg"; using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite)) { Commentary.Print($"Image: {fileName}", true); bitMapImage.Save(memoryStream, ImageFormat.Jpeg); byte[] bytes = memoryStream.ToArray(); fs.Write(bytes, 0, bytes.Length); image.Base64 = image.Base64.Split(',').ToList <string>()[0] + "," + Convert.ToBase64String(bytes); image.ImagePath = fileName.Replace($"{randomTempFileName}CivicSmart", ""); } } } } catch (Exception e) { Commentary.Print( $"Failed to convert base64 to Image {image.Base64} PropertyId {parkingEvent.Properties.Id}"); Commentary.Print(e.Message); return(image); } return(image); }