上传图片时,使用GDI+中重绘方式将CMYK图片转为RGB图片

原创 2007年09月11日 21:19:00

我们知道,如果网站上传图片时,如果用户上传的是CMYK图片,那么在网站上将是无法显示的,通常的现象是出现一个红叉。
下面使用将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;


更多讨论:
(1)如何将RGB图片转换为CMYK图片?
(2)如何将RGB图片转换为索引图片?
(3)如何将RGB图片转换为灰度/黑白线条图片?
(4)上述转换如果是在WPF中,又如何进行呢?

留给读者去思考吧.

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

上传图片时,使用GDI+中重绘方式将CMYK图片转为RGB图片

我们知道,如果网站上传图片时,如果用户上传的是CMYK图片,那么在网站上将是无法显示的(IE8浏览器或以下,火狐、谷歌浏览器可以),通常的现象是出现一个红叉。 下面使用将Image重新绘制为Form...

使用GDI+进行图片处理时要注意的问题

使用GDI+进行图片处理时要注意的问题

使用GDI+进行图片处理时要注意的问题

与GDI相比,GDI+要强大很多。对于Windows应用程序来说,用GDI是比较多的,也是比较熟练的,GDI+相对用的较少一点,但是现在GDI+的使用已经很普遍了。GDI+支持各种类型图片的处理,比如...

GDI+ 通过流方式操作图片文件,避免文件权限冲突

在程序中,很多使用GDI+,很多要操作图片文件的地方。当然我们有Bitmap 类,有Bitmap::FromFile 函数,只需要指定文件路径,后面的一切都那么轻松! 但是,当你载入图片后,你的程序...

Get、Post(HTTP中最常用的请求方式 使用ASIHTTPRequest)----例如:登录、上传图片(调用手机相册 UIImage 转为data)

HTTP:超文本传输协议,它定义了一种在网络间传输数据的格式。     HTTP的请求方式有八种,最常用的就是GET和POST,剩下的几种方式都可以使用GET或者POST来实现,所以他们都使用的很...

vc6.0使用gdi+在内存中绘图并将其保存为bmp,jpg,gif,png等格式的图片

刚开始使用的是gdi保存cview中的绘图内容,但是发现由于保存的是位图所以保存下来的图片的大小很大,每个大概有2M左右,所以在网上找解决方法,选择使用GDI+来保存绘图为图片,大小为20K左右,主要...
  • zhha86
  • zhha86
  • 2011年11月28日 11:00
  • 4195

vc6.0使用gdi+在内存中绘图并将其保存为bmp,jpg,gif,png等格式的图片

刚开始使用的是gdi保存cview中的绘图内容,但是发现由于保存的是位图所以保存下来的图片的大小很大,每个大概有2M左右,所以在网上找解决方法,选择使用GDI+来保存绘图为图片,大小为20K左右,主要...

使用GDI+在内存中转换图片类型

使用GDI+在内存中转换图片类型作者:卢伟微软新推出的GDI+功能强大,本文仅对图片转换加以讨论,不足之处请大家指出,本人QQ: 394777271 。图片类型的转换支持:bmp、dib、png、gi...

GDI+ DrawImage函数拉伸图片时自动渐变问题

DrawImage函数在绘制图片时,如果有拉伸会导致自动渐变的问题。具体描述如下。 假设我们要做一个进度条,用自己的png格式图片作为背景和前景进行绘制,此时必然要拉伸图片,一是我们在横向上要通过拉...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:上传图片时,使用GDI+中重绘方式将CMYK图片转为RGB图片
举报原因:
原因补充:

(最多只允许输入30个字)