上传图片时,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的方式来解决此问题:。


原文地址:https://www.cnblogs.com/colder/p/2773115.html