private string GetWidthAndHeight(string p_identifier, string p_returnType) { try { Extractor kdu = new Extractor(); string xmlMetadata = kdu.GetMetadata(p_identifier.EndsWith(".jp2") ? p_identifier : p_identifier + ".jp2"); XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlMetadata); Metadata data = new Metadata(); data.profile = "http://library.stanford.edu/iiif/image-api/compliance.html#level2"; data.identifier = p_identifier; data.width = int.Parse(doc.GetElementsByTagName("Width")[0].InnerText); data.height = int.Parse(doc.GetElementsByTagName("Height")[0].InnerText); scale_factors scaleFactors = new scale_factors(); for (int i = 0; i < int.Parse(doc.GetElementsByTagName("Jp2levels")[0].InnerText); i++) { scaleFactors.Add(Convert.ToInt32(Math.Pow(2, i))); } data.scale_factors = scaleFactors; formats formats = new formats(); formats.Add("jpg"); formats.Add("png"); formats.Add("gif"); data.formats = formats; qualities qualities = new qualities(); qualities.Add("native"); qualities.Add("grey"); qualities.Add("bitonal"); data.qualities = qualities; data.tile_width = int.Parse(doc.GetElementsByTagName("TileWidth")[0].InnerText); data.tile_height = int.Parse(doc.GetElementsByTagName("TileHeight")[0].InnerText); if (p_returnType.Equals("json")) { JavaScriptSerializer serializer = new JavaScriptSerializer(); return(serializer.Serialize(data)); } else { return(getSerializedXML(data)); } } catch (Exception e) { err = new error(); try { err.parameter = "identifier"; XmlDocument doc = new XmlDocument(); doc.LoadXml(e.Message); err.text = doc.GetElementsByTagName("Message")[0].InnerText; err.statusCode = System.Net.HttpStatusCode.NotFound; } catch { err.statusCode = System.Net.HttpStatusCode.BadRequest; err.parameter = "unknown"; err.text = e.Message; } return(getSerializedXML(err)); } }
private string GetWidthAndHeight(string p_identifier, string p_returnType) { try { Extractor kdu = new Extractor(); string xmlMetadata = kdu.GetMetadata(p_identifier.EndsWith(".jp2") ? p_identifier : p_identifier + ".jp2"); XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlMetadata); Metadata data = new Metadata(); data.profile = "http://library.stanford.edu/iiif/image-api/compliance.html#level2"; data.identifier = p_identifier; data.width = int.Parse(doc.GetElementsByTagName("Width")[0].InnerText); data.height = int.Parse(doc.GetElementsByTagName("Height")[0].InnerText); scale_factors scaleFactors = new scale_factors(); for (int i = 0; i < int.Parse(doc.GetElementsByTagName("Jp2levels")[0].InnerText); i++) { scaleFactors.Add(Convert.ToInt32(Math.Pow(2, i))); } data.scale_factors = scaleFactors; formats formats = new formats(); formats.Add("jpg"); formats.Add("png"); formats.Add("gif"); data.formats = formats; qualities qualities = new qualities(); qualities.Add("native"); qualities.Add("grey"); qualities.Add("bitonal"); data.qualities = qualities; data.tile_width = int.Parse(doc.GetElementsByTagName("TileWidth")[0].InnerText); data.tile_height = int.Parse(doc.GetElementsByTagName("TileHeight")[0].InnerText); if (p_returnType.Equals("json")) { JavaScriptSerializer serializer = new JavaScriptSerializer(); return serializer.Serialize(data); } else { return getSerializedXML(data); } } catch (Exception e) { err = new error(); try { err.parameter = "identifier"; XmlDocument doc = new XmlDocument(); doc.LoadXml(e.Message); err.text = doc.GetElementsByTagName("Message")[0].InnerText; err.statusCode = System.Net.HttpStatusCode.NotFound; } catch { err.statusCode = System.Net.HttpStatusCode.BadRequest; err.parameter = "unknown"; err.text = e.Message; } return getSerializedXML(err); } }
private void GetImage(IAsyncResult p_res) { ImageRequestState state = (ImageRequestState)p_res.AsyncState; if (state.err != null) { asynch.CompleteCall(); } else { lock (lockobj) { try { Extractor kdu = new Extractor(); State kdu_state = new State(); kdu_state.File = state.identifier.EndsWith(".jp2") ? state.identifier : state.identifier + ".jp2"; kdu_state.SizeType = state.sizeType; kdu_state.Size = string.IsNullOrEmpty(state.size) ? 0 : float.Parse(state.size); kdu_state.Width = string.IsNullOrEmpty(state.width) ? 0 : int.Parse(state.width); kdu_state.Height = string.IsNullOrEmpty(state.height) ? 0 : int.Parse(state.height); kdu_state.Region = state.region; kdu_state.Format = state.format; kdu_state.Quality = state.quality; Stream stream = kdu.GetImage(kdu_state); Image img = Image.FromStream(stream); if (state.sizeType.Equals("resize")) { int sizeWidth = img.Width; int sizeHeight = img.Height; if (!string.IsNullOrEmpty(state.width) && !string.IsNullOrEmpty(state.height)) { sizeWidth = Convert.ToInt32(state.width); sizeHeight = Convert.ToInt32(state.height); } else if (!string.IsNullOrEmpty(state.width)) { sizeWidth = Convert.ToInt32(state.width); sizeHeight = (int)(((float)sizeWidth / img.Width) * sizeHeight); } else if (!string.IsNullOrEmpty(state.height)) { sizeHeight = Convert.ToInt32(state.height); sizeWidth = (int)(((float)sizeHeight / img.Height) * sizeWidth); } img = ResizeImage(img, sizeWidth, sizeHeight); } else if (state.sizeType.Equals("best")) { int sizeWidth = Convert.ToInt32(state.width); int sizeHeight = Convert.ToInt32(state.height); double regionWidth = img.Width; if (!string.IsNullOrEmpty(state.regionWidth)) { regionWidth = Convert.ToDouble(state.regionWidth); } double regionHeight = img.Height; if (!string.IsNullOrEmpty(state.regionHeight)) { regionHeight = Convert.ToDouble(state.regionHeight); } double scalex = sizeWidth / regionWidth; double scaley = sizeHeight / regionHeight; if (scalex < scaley) { img = ResizeImage(img, (int)(regionWidth * scalex), (int)(regionHeight * scalex)); } else { img = ResizeImage(img, (int)(regionWidth * scaley), (int)(regionHeight * scaley)); } } else if (state.sizeType.Equals("proportion")) { double regionWidth = 0; double regionHeight = 0; if (state.region.Equals("all")) { XmlDocument doc = new XmlDocument(); doc.LoadXml(kdu.GetMetadata(state.identifier.EndsWith(".jp2") ? state.identifier : state.identifier + ".jp2")); regionWidth = Convert.ToInt32(doc.GetElementsByTagName("Width")[0].InnerText); regionHeight = Convert.ToInt32(doc.GetElementsByTagName("Height")[0].InnerText); } else if (state.region.StartsWith("%")) { XmlDocument doc = new XmlDocument(); doc.LoadXml(kdu.GetMetadata(state.identifier.EndsWith(".jp2") ? state.identifier : state.identifier + ".jp2")); regionWidth = Convert.ToDouble(state.regionWidth) * Convert.ToInt32(doc.GetElementsByTagName("Width")[0].InnerText); regionHeight = Convert.ToDouble(state.regionHeight) * Convert.ToInt32(doc.GetElementsByTagName("Height")[0].InnerText); } else { regionWidth = Convert.ToInt32(state.regionWidth); regionHeight = Convert.ToInt32(state.regionHeight); } regionWidth *= Convert.ToDouble(state.size); regionHeight *= Convert.ToDouble(state.size); if (regionWidth < 1 || regionHeight < 1) { state.err = new error(); state.err.parameter = "region / size"; state.err.text = "Invalid region /size specified"; state.err.statusCode = System.Net.HttpStatusCode.BadRequest; } else { img = ResizeImage(img, (int)regionWidth, (int)regionHeight); } } if (state.err == null) { if (!string.IsNullOrEmpty(state.quality)) { if (state.quality.Equals("grey")) { img = MakeGrayscale(new Bitmap(img)); } else if (state.quality.Equals("bitonal")) { img = MakeBitonal(new Bitmap(img)); } } switch (state.rotation) { case "90": img.RotateFlip(RotateFlipType.Rotate90FlipNone); break; case "180": img.RotateFlip(RotateFlipType.Rotate180FlipNone); break; case "270": img.RotateFlip(RotateFlipType.Rotate270FlipNone); break; } _bitmap = new Bitmap(img); } } catch (IIIFException e) { state.err = new error(); try { XmlDocument doc = new XmlDocument(); doc.LoadXml(e.Message); if (doc.GetElementsByTagName("Code")[0].InnerText.Contains("i3f_200")) { state.err.parameter = "identifier"; state.err.text = doc.GetElementsByTagName("Message")[0].InnerText; state.err.statusCode = System.Net.HttpStatusCode.NotFound; } else if (doc.GetElementsByTagName("Code")[0].InnerText.Contains("i3f_400")) { state.err.parameter = "region"; state.err.text = doc.GetElementsByTagName("Message")[0].InnerText; state.err.statusCode = System.Net.HttpStatusCode.BadRequest; } else { state.err.parameter = "unknown"; state.err.text = e.Message; state.err.statusCode = System.Net.HttpStatusCode.BadRequest; } } catch (Exception ex) { state.err.parameter = "unknown"; state.err.text = ex.Message; state.err.statusCode = System.Net.HttpStatusCode.BadRequest; } } catch (Exception e) { state.err = new error(); state.err.parameter = "unknown"; state.err.text = e.Message; state.err.statusCode = System.Net.HttpStatusCode.BadRequest; } finally { asynch.CompleteCall(); } } } }
private void GetImage(IAsyncResult p_res) { ImageRequestState state = (ImageRequestState)p_res.AsyncState; if (state.err != null) { asynch.CompleteCall(); } else { lock (lockobj) { try { Extractor kdu = new Extractor(); State kdu_state = new State(); kdu_state.File = state.identifier.EndsWith(".jp2") ? state.identifier : state.identifier + ".jp2"; kdu_state.SizeType = state.sizeType; kdu_state.Size = string.IsNullOrEmpty(state.size) ? 0 : float.Parse(state.size); kdu_state.Width = string.IsNullOrEmpty(state.width) ? 0 : int.Parse(state.width); kdu_state.Height = string.IsNullOrEmpty(state.height) ? 0 : int.Parse(state.height); kdu_state.Region = state.region; kdu_state.Format = state.format; kdu_state.Quality = state.quality; Stream stream = kdu.GetImage(kdu_state); Image img = Image.FromStream(stream); if (state.sizeType.Equals("resize")) { int sizeWidth = img.Width; int sizeHeight = img.Height; if (!string.IsNullOrEmpty(state.width) && !string.IsNullOrEmpty(state.height)) { sizeWidth = Convert.ToInt32(state.width); sizeHeight = Convert.ToInt32(state.height); } else if (!string.IsNullOrEmpty(state.width)) { sizeWidth = Convert.ToInt32(state.width); sizeHeight = (int)(((float)sizeWidth / img.Width) * sizeHeight); } else if (!string.IsNullOrEmpty(state.height)) { sizeHeight = Convert.ToInt32(state.height); sizeWidth = (int)(((float)sizeHeight / img.Height) * sizeWidth); } img = ResizeImage(img, sizeWidth, sizeHeight); } else if (state.sizeType.Equals("best")) { int sizeWidth = Convert.ToInt32(state.width); int sizeHeight = Convert.ToInt32(state.height); double regionWidth = img.Width; if (!string.IsNullOrEmpty(state.regionWidth)) regionWidth = Convert.ToDouble(state.regionWidth); double regionHeight = img.Height; if (!string.IsNullOrEmpty(state.regionHeight)) regionHeight = Convert.ToDouble(state.regionHeight); double scalex = sizeWidth / regionWidth; double scaley = sizeHeight / regionHeight; if (scalex < scaley) img = ResizeImage(img, (int)(regionWidth * scalex), (int)(regionHeight * scalex)); else img = ResizeImage(img, (int)(regionWidth * scaley), (int)(regionHeight * scaley)); } else if (state.sizeType.Equals("proportion")) { double regionWidth = 0; double regionHeight = 0; if (state.region.Equals("all")) { XmlDocument doc = new XmlDocument(); doc.LoadXml(kdu.GetMetadata(state.identifier.EndsWith(".jp2") ? state.identifier : state.identifier + ".jp2")); regionWidth = Convert.ToInt32(doc.GetElementsByTagName("Width")[0].InnerText); regionHeight = Convert.ToInt32(doc.GetElementsByTagName("Height")[0].InnerText); } else if (state.region.StartsWith("%")) { XmlDocument doc = new XmlDocument(); doc.LoadXml(kdu.GetMetadata(state.identifier.EndsWith(".jp2") ? state.identifier : state.identifier + ".jp2")); regionWidth = Convert.ToDouble(state.regionWidth) * Convert.ToInt32(doc.GetElementsByTagName("Width")[0].InnerText); regionHeight = Convert.ToDouble(state.regionHeight) * Convert.ToInt32(doc.GetElementsByTagName("Height")[0].InnerText); } else { regionWidth = Convert.ToInt32(state.regionWidth); regionHeight = Convert.ToInt32(state.regionHeight); } regionWidth *= Convert.ToDouble(state.size); regionHeight *= Convert.ToDouble(state.size); if (regionWidth < 1 || regionHeight < 1) { state.err = new error(); state.err.parameter = "region / size"; state.err.text = "Invalid region /size specified"; state.err.statusCode = System.Net.HttpStatusCode.BadRequest; } else { img = ResizeImage(img, (int)regionWidth, (int)regionHeight); } } if (state.err == null) { if (!string.IsNullOrEmpty(state.quality)) { if (state.quality.Equals("grey")) img = MakeGrayscale(new Bitmap(img)); else if (state.quality.Equals("bitonal")) img = MakeBitonal(new Bitmap(img)); } switch (state.rotation) { case "90": img.RotateFlip(RotateFlipType.Rotate90FlipNone); break; case "180": img.RotateFlip(RotateFlipType.Rotate180FlipNone); break; case "270": img.RotateFlip(RotateFlipType.Rotate270FlipNone); break; } _bitmap = new Bitmap(img); } } catch (IIIFException e) { state.err = new error(); try { XmlDocument doc = new XmlDocument(); doc.LoadXml(e.Message); if (doc.GetElementsByTagName("Code")[0].InnerText.Contains("i3f_200")) { state.err.parameter = "identifier"; state.err.text = doc.GetElementsByTagName("Message")[0].InnerText; state.err.statusCode = System.Net.HttpStatusCode.NotFound; } else if (doc.GetElementsByTagName("Code")[0].InnerText.Contains("i3f_400")) { state.err.parameter = "region"; state.err.text = doc.GetElementsByTagName("Message")[0].InnerText; state.err.statusCode = System.Net.HttpStatusCode.BadRequest; } else { state.err.parameter = "unknown"; state.err.text = e.Message; state.err.statusCode = System.Net.HttpStatusCode.BadRequest; } } catch (Exception ex) { state.err.parameter = "unknown"; state.err.text = ex.Message; state.err.statusCode = System.Net.HttpStatusCode.BadRequest; } } catch (Exception e) { state.err = new error(); state.err.parameter = "unknown"; state.err.text = e.Message; state.err.statusCode = System.Net.HttpStatusCode.BadRequest; } finally { asynch.CompleteCall(); } } } }