如果用户上传的是JPG格式的图片,但这个图片的色彩模式是CMYK,在网页上就显示不了,这个问题该如何解决呢???

解决方案 »

  1.   

    //生成RGB显示图
    img=System.Drawing.Image.FromFile(lblpicpath.Text+lblpicfname.Text);
    oldms=new MemoryStream();
    if ((GetImageFlags(img).IndexOf("Ycck") > -1) || (GetImageFlags(img).IndexOf("Cmyk") > -1))
    {
    ms=new MemoryStream();
    System.Drawing.Bitmap bimg=new Bitmap(img);
    System.Drawing.Bitmap newimg=new Bitmap(bimg.Width,bimg.Height);
    Color pixel;
    for(int i=0;i<bimg.Width;i++)
    {
    for(int j=0;j<bimg.Height;j++)
    {
    int r, g, b;
    pixel = bimg.GetPixel(i,j);
    r =  pixel.R;
    g =  pixel.G;
    b =  pixel.B;
    newimg.SetPixel(i,j,Color.FromArgb(r, g, b));
    }
    }
    newimg=function.setimg(newimg);
    newimg.Save(oldms,System.Drawing.Imaging.ImageFormat.Jpeg);

    }
    else
    {
    System.Drawing.Bitmap vimg=new Bitmap(img);
    vimg=function.setimg(vimg);
    vimg.Save(oldms,System.Drawing.Imaging.ImageFormat.Jpeg);
    File.Copy(lblpicpath.Text+lblpicfname.Text,lblpicpath.Text+lblpicfname.Text.Substring(0,lblpicfname.Text.LastIndexOf('.'))+"rgb"+lblpicfname.Text.Substring(lblpicfname.Text.LastIndexOf('.')),true);
    } public static string GetImageFlags(System.Drawing.Image img)
    {
    ImageFlags FlagVals = (ImageFlags)Enum.Parse(typeof(ImageFlags), img.Flags.ToString());
    return FlagVals.ToString();
    }
      

  2.   

    楼上的兄台,关于转换函数,我手头也有一个,比你那个要方便点,交换一下
     public static Bitmap ConvertCMYK(Bitmap bmp)
        {
            Bitmap tmpBmp = new Bitmap(bmp.Width, bmp.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            
            Graphics g = Graphics.FromImage(tmpBmp);
            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.InterpolationMode = System.Drawing.Drawing2D.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;
        }
    但是有一个问题,关于判断是否CMYK这里
    if ((GetImageFlags(img).IndexOf("Ycck") > -1) ¦ ¦ (GetImageFlags(img).IndexOf("Cmyk") > -1)) 
    好象并不是很准确,有时候判断不出来!
    我现在目前只能上传的图片全部重转一次,麻烦啊
      

  3.   


    ImageFlags 名称                  说明 
     None               没有格式信息。 
     Scalable           此像素数据是可伸缩的。 
     HasAlpha           此像素数据包含 alpha 信息。 
     HasTranslucent     指定此像素数据有不同于 0(透明)和 255(不透明)的 alpha 值。 
     PartiallyScalable  此像素数据部分可伸缩,但有一些限制。 
     ColorSpaceRgb      此像素数据使用 RGB 颜色空间。 
     ColorSpaceCmyk     此像素数据使用 CMYK 颜色空间。 
     ColorSpaceGray     此像素数据为灰度。 
     ColorSpaceYcbcr    指定使用 YCBCR 颜色空间来存储图像。 
     ColorSpaceYcck     指定使用 YCCK 颜色空间来存储图像。 
     HasRealDpi         指定在图像中存储每英寸点数信息。 
     HasRealPixelSize   指定在图像中存储像素大小。 
     ReadOnly           此像素数据是只读的。 
     Caching            此像素数据可以缓存以便更快地访问。 目前我碰到的图片里,ImageFlags属性为ColorSpaceCmyk,ColorSpaceYcck,HasAlpha的都不能在网页中正常显示,不知道是不是除了RGB的那个,别的都不能显示,迷惑中...
    专家解释下吧!