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

我们知道,如果网站上传图片时,如果用户上传的是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中,又如何进行呢?

留给读者去思考吧.

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

  1. VC的MFC中重绘函数的使用总结(整理)

    原文网址:http://www.cnblogs.com/x8023z/archive/2008/12/09/mfc33.html 在刷新窗口时经常要调用重绘函数 MFC提供了三个函数用于窗口重绘 In ...

  2. C#界面设计--5--Bitmap.save保存图片时: GDI+ 中发生一般性错误 解决办法

    Bitmap.save保存图片时: GDI+ 中发生一般性错误 解决办法 源程序: var date = DateTime.Now.ToString("yyyy-MM-dd");/ ...

  3. 解决MFC 的 CButton改变样式问题,使用重绘方式。(转载)

    要想修改CButton类按钮背景颜色和文字颜色,必须利用自绘方法对按钮进行重新绘制.这可以通过定义一个以CButton为基类的新按钮类来实现.以下为具体的实现方法: 方法一: 加入一个新类,类名:CM ...

  4. C#中关于WinForm中重绘TabControl选项卡标题的问题

    这里说的是每个TabPage的头部,也就是标题,不是工作区域. 最开始用到TabControl的时候,我的每个选项卡是写死的,而后由于项目需求又动态添加了TabControl并生成各个选项卡,而两次我 ...

  5. safari支持Ajax同步请求吗,在同步“Ajax”请求之前强制在Webkit(Safari和Chrome)中重绘UI...

    你为什么认为: doSomethingBeforeRequest(); response = synchronousAjax(); doSomethingToTheDataAfterRequest(r ...

  6. html打开方式怎么没有,打开文件时右键菜单中没有“打开方式”怎么办?

    我们的电脑上有各种格式的文件和资料,每个文件都有相应的应用程序可以打开查看,比如听歌要打开酷狗,看视频用优酷,有的文件比如PDF格式就需要下载相应的应用程序才能点开查看.当我们在网上下载了一个文件,想 ...

  7. gdi按钮重绘背景黑色_PS快速抠图换背景教程 PS怎么抠图放在另一张图 这个方法简单万能...

    PS抠图是工作中最常见的一种基本技能,一般用来处理产品,合成海报等.除了精修产品图以外,大部分时间的抠图都需要设计者快速高效地完成,今天小编就从工作角度来讲一下快速抠图的方法,学会以后将大大降低抠图时 ...

  8. qt5中重绘工具栏_Qt ------ QPainter 和控件组件的重绘

    使用 QPainter 修改 QPaintDevice 的子类,如果 QPaintDevice 的子类也是 QWidget 的子类,比如自定义QWidget子类.QLabel等,需要把 QPainte ...

  9. java rgb cmyk_Java CMYK图片转RGB图片(TwelveMonkeys方式)

    TwelveMonkeys的使用比较简单,只要把相关的jar包加入到类路径,他的类我们基本不会用到,只要使用jdk ImageIO或其上层的接口就行了.jdk的ImageIO有自动发现功能,会自动查找 ...

  10. 斯坦福iOS7教程以及国内一些培训班中关于UIView重绘不易发现的一个坑

    在这些教程里,对于UIView的重绘基本都是新建一个类,然后在StroyBoard里拖线. 而很多iOS的学习者,是用代码来构建界面的,这样就造成了有时候会发生莫名其妙的Bug. 大家都知道重绘是在这 ...

最新文章

  1. OpenCV 图像平移
  2. 数组中没有给初始值_Array中的reduce()、filter()、map()几张图搞懂
  3. Flask框架(flask中的数据库SQLAlchemy(python3),配置、模型类、创建表)
  4. Angular变化检测机制
  5. 1024程序员节持续引爆星城:500万程序员线上线下互动,共迎开源软件、操作系统新时代...
  6. 程序员们如何破局 5G?
  7. DB2 ResultSet用法
  8. windbg分析Kernel32.dll导出表
  9. android java项目源码_Android项目源码本站第三个知乎app项目
  10. 【矩阵论】对称矩阵特征值的性质与直积
  11. 从武汉远程医疗方案看,5G战“疫”是噱头还是福音?
  12. 淘宝打单发货API,淘宝打单发货接口
  13. 【神经网络】单层感知器
  14. 【题解】#10246. 「一本通 6.7 练习 3」取石子
  15. 计算机无法关闭密码保护,Windows 10不会关闭密码保护共享
  16. bzoj3039 玉蟾宫【单调栈】
  17. 【STM32 .Net MF开发板学习-12】跳动的音符(PWM合成)
  18. 【转载】破解物联网落地困境-阿里云硬件接入最佳实践
  19. 手机跟电脑居然是同一IP地址,你知道是怎么上网的吗?
  20. ubuntu系统配置中文输入法以及安装ros2,docker等开发环境

热门文章

  1. 上课流程法-如何上好第一节课(1) 目录 1. 目录 1 1.1. 销售自己 1 1.2. 销售课程 1 1.3. 学习方法 1 1.4. 制定规章 2 2. 销售自己-自我介绍 2 2.1.
  2. Atitit 常见集合的操作 dsl表达式 选择器 多属性条件检索 ,排序等 目录 1. Ognl 集合操作 1 2. /bookmarksHtmlEverythingIndexPrj/src/Li
  3. Atian inputmethod 输入法解决方案 方言与多语言多文字支持 英语汉字汉语阿拉伯文的支持 (au
  4. Atitit. 项目文档目录大纲 总集合  v2
  5. paip.文件读写api php java python总结.txt
  6. paip.erlang环境搭建和脚本式escript运行halo world 在windows下attilax总结
  7. 关于FLEX中找不到目标对象或通道未定义错误
  8. CTO用“汉德公式”来定责,我大写的服!
  9. 1500页,40万字,阿里淘系技术2020技术年货来了!
  10. Linux宝库幕后推手齐聚OpenInfra Days China