在做项目时发现图片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(72, 72); } 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(0, 0, 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的方式来解决此问题:。