private static void waitAndProcessImage(string[] fileTypes, string[] dataPathPatterns, int maxWidth, int maxHeight, StreamLoadedCallbackMethod streamLoadedCallback) { // wait for event while (true) { IntPtr _event = IntPtr.Zero; Common.bps_get_event(ref _event, -1); // wait here for next event if (_event != IntPtr.Zero) { if (Common.bps_event_get_code(_event) == NAVIGATOR_CHILD_CARD_CLOSED) { IntPtr reasonPtr = Common.navigator_event_get_card_closed_reason(_event); string reason = Marshal.PtrToStringAnsi(reasonPtr); Debug.Log("reason: " + reason); if (reason == "save") //save - cancel { IntPtr dataPathPtr = Common.navigator_event_get_card_closed_data(_event); string dataPath = Marshal.PtrToStringAnsi(dataPathPtr); Debug.Log("Loading file from dataPath: " + dataPath); try { System.Text.RegularExpressions.MatchCollection matches = null; foreach (var pattern in dataPathPatterns) { matches = System.Text.RegularExpressions.Regex.Matches(dataPath, pattern); if (matches.Count != 0) { break; } } if (matches != null) { foreach (System.Text.RegularExpressions.Match match in matches) { if (match.Groups.Count == 3) { string path = match.Groups[1].Value; string fileName = match.Groups[2].Value; // check for valid file type bool pass = false; foreach (var type in fileTypes) { if (Path.GetExtension(fileName) == type) { pass = true; break; } } if (!pass) { throw new Exception("Invalid file ext."); } // load file MemoryStream stream = null; using (var file = new FileStream(path + fileName, FileMode.Open, FileAccess.Read)) { if (maxWidth != 0 && maxHeight != 0) { ImageTools.IO.IImageDecoder decoder = null; switch (Path.GetExtension(fileName).ToLower()) { case ".jpg": decoder = new ImageTools.IO.Jpeg.JpegDecoder(); break; case ".jpeg": decoder = new ImageTools.IO.Jpeg.JpegDecoder(); break; case ".png": decoder = new ImageTools.IO.Png.PngDecoder(); break; default: Debug.LogError("Unsuported file ext type: " + Path.GetExtension(fileName)); streamLoadedCallback(null, false); return; } var image = new ImageTools.ExtendedImage(); decoder.Decode(image, file); var newSize = MathUtilities.FitInViewIfLarger(image.PixelWidth, image.PixelHeight, maxWidth, maxHeight); var newImage = ImageTools.ExtendedImage.Resize(image, (int)newSize.x, (int)newSize.y, new ImageTools.Filtering.NearestNeighborResizer()); var encoder = new ImageTools.IO.Jpeg.JpegEncoder(); stream = new MemoryStream(); encoder.Encode(newImage, stream); stream.Position = 0; /*unsafe * { * IntPtr ilib = IntPtr.Zero; * if (img_lib_attach(&ilib) != 0) * { * Debug.LogError("Failed: img_lib_attach"); * streamLoadedCallback(null, false); * return; * } * * img_t image = new img_t(); * image.flags = 0x00000002; * image.format = 32 | 0x00000100 | 0x00001000; * img_decode_callouts_t callouts = new img_decode_callouts_t(); * if (img_load_file(ilib, "file://"+path+fileName, &callouts, &image) != 0) * { * img_t newImage = new img_t(); * if (img_resize_fs(&image, &newImage) != 0) * { * Debug.LogError("Failed: img_resize_fs"); * streamLoadedCallback(null, false); * return; * } * * Debug.Log("WIDTH: " + image.w); * Debug.Log("HEIGHT: " + image.h); * streamLoadedCallback(null, false); * return; * //byte* data = (byte*)newImage.data.ToPointer(); * //byte[] managedData = new byte[newImage.stride]; * * //stream = new MemoryStream(); * } * else * { * Debug.LogError("Failed to load image file: " + path + fileName); * streamLoadedCallback(null, false); * return; * } * * img_lib_detach(ilib); * }*/ } else { var data = new byte[file.Length]; file.Read(data, 0, data.Length); stream = new MemoryStream(data); stream.Position = 0; } } streamLoadedCallback(stream, true); return; } else { throw new Exception("Invalid dataPath."); } } } } catch (Exception e) { Debug.LogError(e.Message); } streamLoadedCallback(null, false); } else { streamLoadedCallback(null, false); } break; } } } }
private static void waitAndProcessImage(string[] fileTypes, string[] dataPathPatterns, int maxWidth, int maxHeight, StreamLoadedCallbackMethod streamLoadedCallback) { // wait for event while (true) { IntPtr _event = IntPtr.Zero; Common.bps_get_event(ref _event, -1);// wait here for next event if (_event != IntPtr.Zero) { if (Common.bps_event_get_code(_event) == NAVIGATOR_CHILD_CARD_CLOSED) { IntPtr reasonPtr = Common.navigator_event_get_card_closed_reason(_event); string reason = Marshal.PtrToStringAnsi(reasonPtr); Debug.Log("reason: " + reason); if (reason == "save")//save - cancel { IntPtr dataPathPtr = Common.navigator_event_get_card_closed_data(_event); string dataPath = Marshal.PtrToStringAnsi(dataPathPtr); Debug.Log("Loading file from dataPath: " + dataPath); try { System.Text.RegularExpressions.MatchCollection matches = null; foreach (var pattern in dataPathPatterns) { matches = System.Text.RegularExpressions.Regex.Matches(dataPath, pattern); if (matches.Count != 0) break; } if (matches != null) foreach (System.Text.RegularExpressions.Match match in matches) { if (match.Groups.Count == 3) { string path = match.Groups[1].Value; string fileName = match.Groups[2].Value; // check for valid file type bool pass = false; foreach (var type in fileTypes) { if (Path.GetExtension(fileName) == type) { pass = true; break; } } if (!pass) throw new Exception("Invalid file ext."); // load file MemoryStream stream = null; using (var file = new FileStream(path+fileName, FileMode.Open, FileAccess.Read)) { if (maxWidth != 0 && maxHeight != 0) { ImageTools.IO.IImageDecoder decoder = null; switch (Path.GetExtension(fileName).ToLower()) { case ".jpg": decoder = new ImageTools.IO.Jpeg.JpegDecoder(); break; case ".jpeg": decoder = new ImageTools.IO.Jpeg.JpegDecoder(); break; case ".png": decoder = new ImageTools.IO.Png.PngDecoder(); break; default: Debug.LogError("Unsuported file ext type: " + Path.GetExtension(fileName)); streamLoadedCallback(null, false); return; } var image = new ImageTools.ExtendedImage(); decoder.Decode(image, file); var newSize = MathUtilities.FitInViewIfLarger(image.PixelWidth, image.PixelHeight, maxWidth, maxHeight); var newImage = ImageTools.ExtendedImage.Resize(image, (int)newSize.x, (int)newSize.y, new ImageTools.Filtering.NearestNeighborResizer()); var encoder = new ImageTools.IO.Jpeg.JpegEncoder(); stream = new MemoryStream(); encoder.Encode(newImage, stream); stream.Position = 0; /*unsafe { IntPtr ilib = IntPtr.Zero; if (img_lib_attach(&ilib) != 0) { Debug.LogError("Failed: img_lib_attach"); streamLoadedCallback(null, false); return; } img_t image = new img_t(); image.flags = 0x00000002; image.format = 32 | 0x00000100 | 0x00001000; img_decode_callouts_t callouts = new img_decode_callouts_t(); if (img_load_file(ilib, "file://"+path+fileName, &callouts, &image) != 0) { img_t newImage = new img_t(); if (img_resize_fs(&image, &newImage) != 0) { Debug.LogError("Failed: img_resize_fs"); streamLoadedCallback(null, false); return; } Debug.Log("WIDTH: " + image.w); Debug.Log("HEIGHT: " + image.h); streamLoadedCallback(null, false); return; //byte* data = (byte*)newImage.data.ToPointer(); //byte[] managedData = new byte[newImage.stride]; //stream = new MemoryStream(); } else { Debug.LogError("Failed to load image file: " + path + fileName); streamLoadedCallback(null, false); return; } img_lib_detach(ilib); }*/ } else { var data = new byte[file.Length]; file.Read(data, 0, data.Length); stream = new MemoryStream(data); stream.Position = 0; } } streamLoadedCallback(stream, true); return; } else { throw new Exception("Invalid dataPath."); } } } catch (Exception e) { Debug.LogError(e.Message); } streamLoadedCallback(null, false); } else { streamLoadedCallback(null, false); } break; } } } }