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);
            }
        }
Exemple #3
0
        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();
                    }
                }
            }
        }