上传图片时,使用GDI+中重绘方式将CMYK图片转为RGB图片
原文:上传图片时,使用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提供了三个函数用于窗口重绘Inva ...
- 在WPF窗体中重绘
原文:在WPF窗体中重绘 写这篇主要是为了验证任何元素自身都具备绘图功能. 在默认Window中重写OnRender方法 protected override void OnRender(Draw ...
- WinForm中重绘TabControl选项卡标题
最近开发WinForm频繁使用了TabControl控件,这个控件的选项卡没有BackgroundImage这个属性,那么如何为其各个选项卡添加背景图片呢?(这里说的是每个TabPage的头部,也就是 ...
- C# .NET开发图形图像程序时提示"GDI+ 中发生一般性错误"
今天突然收到一封信,说我那个极度复杂的Marshal的问题被解决了(http://www.cnblogs.com/hotcan/archive/2005/01/12/91007.html).顿时感觉好 ...
- 关于生成缩略图及水印图片时出现GDI+中发生一般性错误解决方法
System.Drawing.Image OldImage = null; oldImage = System.Drawing.Image.FromFile(ImageUrl); 使用该方法读取图片时 ...
- PHP上传图片时,如何判断上传的文件是否为可用的图片文件
利用getimagesize函数: function isImage($filename){$types = '.gif|.jpeg|.png|.bmp';//定义检查的图片类型if(file_exi ...
- Java CMYK图片转RGB图片(TwelveMonkeys方式)
TwelveMonkeys的使用比较简单,只要把相关的jar包加入到类路径,他的类我们基本不会用到,只要使用jdk ImageIO或其上层的接口就行了.jdk的ImageIO有自动发现功能,会自动查找 ...
- 【MFC】MFC中窗口重绘
MFC中窗口重绘 摘自:http://blog.csdn.net/shuilan0066/article/details/5859057 在刷新窗口时经常要调用重绘函数 MFC提供了三个函数用于窗口重 ...
- 深入Windows窗体原理及控件重绘技巧
之前有学MFC的同学告诉我觉得Windows的控件重绘难以理解,就算重绘成功了还是有些地方不明白,我觉得可能很多人都有这样的问题,在这里我从Windows窗体的最基本原理来讲解,如果你有类似的疑惑希望 ...
随机推荐
- echart报表插件使用笔记(二)--按月统计
按月统计注冊人数 java类: package com.spring.controller; import java.io.IOException; import java.sql.Connectio ...
- 等价变换(equivalent transformation)
1. 加加减减 (x−b)n=(x−a+a−b)n=∑i=0n(ni)(x−a)i(a−b)n−i
- [TypeStyle] Compose CSS classes using TypeStyle
We will demonstrate composing classes using the utility classes function. classes is also what we re ...
- [Angular2 Form] Create custom form component using Control Value Accessor
//switch-control component import { Component } from '@angular/core'; import { ControlValueAccessor, ...
- NoSql中的B-tree、B+tree和LSM-tree 分类: B7_HBASE 2015-03-15 18:27 85人阅读 评论(0) 收藏
总结: 1.B+树将数据完全排序,读数据时很快,但当要修改数据时,就需要将新入数据下面的数据重新排位,特别是当写入的数据排在较高的位置时,需要大量的移位操作才能完成写入. 2.SLM牺牲部分的读性能, ...
- php实现合并两个排序的链表(很多情况下新建数组装东西比连东西逻辑快很多)($cur=$cur->next;的理解)
php实现合并两个排序的链表(很多情况下新建数组装东西比连东西逻辑快很多)($cur=$cur->next;的理解) 一.总结 $cur=$cur->next;这句话需要好好理解 指$cu ...
- matplotlib学习之散点图与条形图
# coding:utf-8 from matplotlib import pyplot as plt import numpy as np plt.style.use('ggplot') x = n ...
- 数据类型总结——String(字符串类型)
相关文章 简书原文:https://www.jianshu.com/p/546a755c3eb6 数据类型总结——概述:https://www.cnblogs.com/shcrk/p/9266015. ...
- 【solr专题之一】Solr快速入门 分类: H4_SOLR/LUCENCE 2014-07-02 14:59 2403人阅读 评论(0) 收藏
一.Solr学习相关资料 1.官方材料 (1)快速入门:http://lucene.apache.org/solr/4_9_0/tutorial.html,以自带的example项目快速介绍发Solr ...
- php json字符串转为数组或对象
从网上查到的方法是 用get_object_vars 把类类型转换成数组 然后在用foreach 遍历即可 $array = get_object_vars($test); $json= '[{&q ...