我们知道,如果网站上传图片时,如果用户上传的是CMYK图片,那么在网站上将是无法显示的(IE8浏览器或以下,火狐、谷歌浏览器可以),通常的现象是出现一个红叉。
下面使用将Image重新绘制为Format24bppRgb的方式来解决此问题:
public static void SavePostedImage(HttpPostedFile postedFile, string destFileName, int maxHeight, int maxWidth)
{
System.Drawing.Imaging.ImageFormat imgFormat;
if (destFileName.ToLower().EndWith("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(destFileName, imgFormat);
saveBmp.Dispose();
postedFile.InputStream.Close();
}
public static string GetImageFlags(System.Drawing.Image img)
{
ImageFlags FlagVals = (ImageFlags)Enum.Parse(typeof(ImageFlags), img.Flags.ToString());
return FlagVals.ToString();
}
public static 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 static 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;
}
PS:如果不要重绘,可以判断是否为CMYK模式,叫用户用PS去重新修改图片的模式
using System.Drawing.Imaging;
public partial class img : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string str1 = Server.MapPath(@"images/cmyk.jpg");
string str2 = Server.MapPath(@"images/rgb.jpg");
using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(str2))
{
bool flag = IsCMYK(bitmap);
if (flag == true)
{
Response.Write("这图是CMYK");
}
else
{
Response.Write("RGB啊,大哥");
}
}
}
//得到图片的Flags
public static string GetImageFlags(System.Drawing.Image img)
{
ImageFlags FlagVals = (ImageFlags)Enum.Parse(typeof(ImageFlags), img.Flags.ToString());
return FlagVals.ToString();
}
//判断是否为CMYK
public static 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;
}
}