zoukankan      html  css  js  c++  java
  • 上传图片时,CMKY转RGB

    在做项目时发现图片CMYK模式无法显示,

    下面使用将Image重新绘制为Format24bppRgb的方式来解决此问题: 

    using System.Drawing; 

    using System.Drawing.Drawing2D;
    using System.Drawing.Imaging;

    protected void Button1_Click(object sender, EventArgs e)
            {
                if (FileUpload1.HasFile)
                {
                    SavePostedImage(FileUpload1.PostedFile, FileUpload1.FileName, 1000,1000);
                }
            }

            public void SavePostedImage(HttpPostedFile postedFile, string destFileName, int maxHeight, int maxWidth)
            {
                System.Drawing.Imaging.ImageFormat imgFormat;
                if (destFileName.ToLower().EndsWith("jpg"))
                {
                    imgFormat = ImageFormat.Jpeg;
                }
                else //这里可以加更多选项,比如png,gif,tif....
                {
                    imgFormat = ImageFormat.Gif;
                }

                Bitmap bmp = new Bitmap(postedFile.InputStream);

                if (IsCMYK(bmp))
                {
                    bmp = ConvertCMYK(bmp);
                }

                if ((bmp.HorizontalResolution > 72) || (bmp.VerticalResolution > 72))
                {
                    bmp.SetResolution(7272);
                }

                Bitmap saveBmp;
                if ((bmp.Height > maxHeight) || (bmp.Width > maxWidth))
                {
                    Double heightRatio = Convert.ToDouble(maxHeight) / Convert.ToDouble(bmp.Height);
                    Double widthRatio = Convert.ToDouble(maxWidth) / Convert.ToDouble(bmp.Width);
                    Double scaleRatio;

                    if (heightRatio > widthRatio)
                    {
                        scaleRatio = widthRatio;
                    }
                    else
                    {
                        scaleRatio = heightRatio;
                    }

                    int height = Convert.ToInt32(bmp.Height * scaleRatio);
                    int width = Convert.ToInt32(bmp.Width * scaleRatio);

                    saveBmp = new Bitmap(bmp, width, height);
                }
                else
                {
                    saveBmp = new Bitmap(bmp);
                }

                bmp.Dispose();
                saveBmp.Save(Server.MapPath("~/") + destFileName, imgFormat);
                saveBmp.Dispose();
                postedFile.InputStream.Close();
            }

            public string GetImageFlags(System.Drawing.Image img)
            {
                ImageFlags FlagVals = (ImageFlags)Enum.Parse(typeof(ImageFlags), img.Flags.ToString());
                return FlagVals.ToString();
            }


            public bool IsCMYK(System.Drawing.Image img)
            {
                bool isCmyk;

                if ((GetImageFlags(img).IndexOf("Ycck") > -1) || (GetImageFlags(img).IndexOf("Cmyk") > -1))
                { isCmyk = true; }
                else
                { isCmyk = false; }

                return isCmyk;
            }

            public Bitmap ConvertCMYK(Bitmap bmp)
            {
                Bitmap tmpBmp = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format24bppRgb);

                Graphics g = Graphics.FromImage(tmpBmp);
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;

                Rectangle rect = new Rectangle(00, bmp.Width, bmp.Height);
                // 将CMYK图片重绘一遍,此时GDI+自动将CMYK格式转换为RGB了
                g.DrawImage(bmp, rect);

                Bitmap returnBmp = new Bitmap(tmpBmp);

                g.Dispose();
                tmpBmp.Dispose();
                bmp.Dispose();

                return returnBmp;
            } 

        }下面使用将Image重新绘制为Format24bppRgb的方式来解决此问题:。


  • 相关阅读:
    CentOS6.5安装telnet命令
    Spark Streaming 事务处理彻底掌握
    通过案例对 spark streaming 透彻理解三板斧之三:spark streaming运行机制与架构
    通过案例对 spark streaming 透彻理解三板斧之二:spark streaming运行机制
    Spark Streaming源码解读之Receiver生成全生命周期彻底研究和思考
    Spark Streaming源码解读之Job动态生成和深度思考
    通过案例对 spark streaming 透彻理解三板斧之一: spark streaming 另类实验
    Spark Streaming源码解读之JobScheduler内幕实现和深度思考
    Spark Streaming源码解读之流数据不断接收全生命周期彻底研究和思考
    Spark Streaming源码解读之生成全生命周期彻底研究与思考
  • 原文地址:https://www.cnblogs.com/colder/p/2773115.html
Copyright © 2011-2022 走看看