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

转载 2011年10月19日 11:12:07

我们知道,如果网站上传图片时,如果用户上传的是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;
    }
}



js生成缩略图后上传(利用canvas重绘)

一般在处理图片上传时,通常的逻辑都是将源图片上传到服务器端,再由服务器端的语言进行缩放大小的操作。 此种模式一般可以满足大部分的需求,但当我们所需要的图片仅仅是一个符合规定大小的源图片的缩略图,再使...
  • php_Soul
  • php_Soul
  • 2014-01-06 11:09:47
  • 3550

laravel实现上传图片,并且制作缩略图,按照日期存放

先上代码吧:前端代码:有很多小伙伴在做表单上传文件的时候没有注意表单的上传格式是什么,就可能导致上传文件、图片不成功!<form id="form1" name=&q...
  • a12541254
  • a12541254
  • 2018-03-14 12:34:34
  • 130

用PHP将CMYK格式的JPG文件转为RGB格式

imagick是一个PHP的扩展,它调用ImageMagick提供的API来进行图片的操作 ImageMagick是一套软件系列,主要用于图片的创建、编辑以及转换等,详细的解释见ImageMagic...
  • zwfcan
  • zwfcan
  • 2013-11-26 13:41:29
  • 2971

Java实现把cmyk格式图片转换为RGB格式图片

package com.pb.util; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg....
  • u011677147
  • u011677147
  • 2015-09-28 15:40:13
  • 2687

laravel5.2 生成缩略图

composer安装:           composer require intervention/image       laravel配置:           1.编辑 config/...
  • pz_winner
  • pz_winner
  • 2017-11-08 21:13:03
  • 473

图片缩放转换类

在处理图片显示的时候,我们经常会用到图片的缩放功能。
  • pc_286
  • pc_286
  • 2013-08-16 09:37:50
  • 515

java下cmyk图片读取和转换rgb

记录一下整个过程 第一次采用的办法 public static String readImage(String filename) throws IOException { ...
  • ybn187
  • ybn187
  • 2016-08-11 18:15:34
  • 3331

UIImagePickerController选取图片后在判断图片方向,解决保存图片或重绘图片后旋转90度的方法

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDic...
  • u010889390
  • u010889390
  • 2013-10-31 17:22:31
  • 4463

如何改变界面的背景图像

改变界面背景图像最常用的方法是在OnPaint()函数中来实现对背景图像的重绘。void CMyDlg::OnPaint() { CPaintDC dc(this); // device contex...
  • jonathanlin2008
  • jonathanlin2008
  • 2008-08-04 21:58:00
  • 422

pdf文件RGB转CMYK

  • 2011年02月19日 14:48
  • 603KB
  • 下载
收藏助手
不良信息举报
您举报文章:上传图片时,使用GDI+中重绘方式将CMYK图片转为RGB图片
举报原因:
原因补充:

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