上传图片时,使用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图片相关推荐
- VC的MFC中重绘函数的使用总结(整理)
原文网址:http://www.cnblogs.com/x8023z/archive/2008/12/09/mfc33.html 在刷新窗口时经常要调用重绘函数 MFC提供了三个函数用于窗口重绘 In ...
- C#界面设计--5--Bitmap.save保存图片时: GDI+ 中发生一般性错误 解决办法
Bitmap.save保存图片时: GDI+ 中发生一般性错误 解决办法 源程序: var date = DateTime.Now.ToString("yyyy-MM-dd");/ ...
- 解决MFC 的 CButton改变样式问题,使用重绘方式。(转载)
要想修改CButton类按钮背景颜色和文字颜色,必须利用自绘方法对按钮进行重新绘制.这可以通过定义一个以CButton为基类的新按钮类来实现.以下为具体的实现方法: 方法一: 加入一个新类,类名:CM ...
- C#中关于WinForm中重绘TabControl选项卡标题的问题
这里说的是每个TabPage的头部,也就是标题,不是工作区域. 最开始用到TabControl的时候,我的每个选项卡是写死的,而后由于项目需求又动态添加了TabControl并生成各个选项卡,而两次我 ...
- safari支持Ajax同步请求吗,在同步“Ajax”请求之前强制在Webkit(Safari和Chrome)中重绘UI...
你为什么认为: doSomethingBeforeRequest(); response = synchronousAjax(); doSomethingToTheDataAfterRequest(r ...
- html打开方式怎么没有,打开文件时右键菜单中没有“打开方式”怎么办?
我们的电脑上有各种格式的文件和资料,每个文件都有相应的应用程序可以打开查看,比如听歌要打开酷狗,看视频用优酷,有的文件比如PDF格式就需要下载相应的应用程序才能点开查看.当我们在网上下载了一个文件,想 ...
- gdi按钮重绘背景黑色_PS快速抠图换背景教程 PS怎么抠图放在另一张图 这个方法简单万能...
PS抠图是工作中最常见的一种基本技能,一般用来处理产品,合成海报等.除了精修产品图以外,大部分时间的抠图都需要设计者快速高效地完成,今天小编就从工作角度来讲一下快速抠图的方法,学会以后将大大降低抠图时 ...
- qt5中重绘工具栏_Qt ------ QPainter 和控件组件的重绘
使用 QPainter 修改 QPaintDevice 的子类,如果 QPaintDevice 的子类也是 QWidget 的子类,比如自定义QWidget子类.QLabel等,需要把 QPainte ...
- java rgb cmyk_Java CMYK图片转RGB图片(TwelveMonkeys方式)
TwelveMonkeys的使用比较简单,只要把相关的jar包加入到类路径,他的类我们基本不会用到,只要使用jdk ImageIO或其上层的接口就行了.jdk的ImageIO有自动发现功能,会自动查找 ...
- 斯坦福iOS7教程以及国内一些培训班中关于UIView重绘不易发现的一个坑
在这些教程里,对于UIView的重绘基本都是新建一个类,然后在StroyBoard里拖线. 而很多iOS的学习者,是用代码来构建界面的,这样就造成了有时候会发生莫名其妙的Bug. 大家都知道重绘是在这 ...
最新文章
- OpenCV 图像平移
- 数组中没有给初始值_Array中的reduce()、filter()、map()几张图搞懂
- Flask框架(flask中的数据库SQLAlchemy(python3),配置、模型类、创建表)
- Angular变化检测机制
- 1024程序员节持续引爆星城:500万程序员线上线下互动,共迎开源软件、操作系统新时代...
- 程序员们如何破局 5G?
- DB2 ResultSet用法
- windbg分析Kernel32.dll导出表
- android java项目源码_Android项目源码本站第三个知乎app项目
- 【矩阵论】对称矩阵特征值的性质与直积
- 从武汉远程医疗方案看,5G战“疫”是噱头还是福音?
- 淘宝打单发货API,淘宝打单发货接口
- 【神经网络】单层感知器
- 【题解】#10246. 「一本通 6.7 练习 3」取石子
- 计算机无法关闭密码保护,Windows 10不会关闭密码保护共享
- bzoj3039 玉蟾宫【单调栈】
- 【STM32 .Net MF开发板学习-12】跳动的音符(PWM合成)
- 【转载】破解物联网落地困境-阿里云硬件接入最佳实践
- 手机跟电脑居然是同一IP地址,你知道是怎么上网的吗?
- ubuntu系统配置中文输入法以及安装ros2,docker等开发环境
热门文章
- 上课流程法-如何上好第一节课(1) 目录 1. 目录	1 1.1. 销售自己	1 1.2. 销售课程	1 1.3. 学习方法	1 1.4. 制定规章	2 2. 销售自己-自我介绍	2 2.1.
- Atitit 常见集合的操作 dsl表达式 选择器 多属性条件检索 ,排序等 目录 1. Ognl 集合操作	1 2. /bookmarksHtmlEverythingIndexPrj/src/Li
- Atian inputmethod 输入法解决方案 方言与多语言多文字支持 英语汉字汉语阿拉伯文的支持 (au
- Atitit. 项目文档目录大纲 总集合 v2
- paip.文件读写api php java python总结.txt
- paip.erlang环境搭建和脚本式escript运行halo world 在windows下attilax总结
- 关于FLEX中找不到目标对象或通道未定义错误
- CTO用“汉德公式”来定责,我大写的服!
- 1500页,40万字,阿里淘系技术2020技术年货来了!
- Linux宝库幕后推手齐聚OpenInfra Days China