新问题,如果用户上传的是CMYK图片怎么办? 如果用户上传的是JPG格式的图片,但这个图片的色彩模式是CMYK,在网页上就显示不了,这个问题该如何解决呢??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //生成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(); } 楼上的兄台,关于转换函数,我手头也有一个,比你那个要方便点,交换一下 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)) 好象并不是很准确,有时候判断不出来!我现在目前只能上传的图片全部重转一次,麻烦啊 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的那个,别的都不能显示,迷惑中...专家解释下吧! 急求!Winform调用WebService实例。!!在线等,老虎头哥哥赶紧来! 服务器超时问题。 问个网站支付的功能 求一sql语句 高分求救,设计问题 关于DataGrid中checkbox的值取不出来的问题 ======控件的下标一会从0开始,一会从1开始,有啥区别不? 高分征新闻或内容采集系统或思路,要求能替换字符,智能分析分页,提取链接,图片,Flash等资源 session超时转到登陆页面怎么设置啊? 为什么我的UrlReferrer总是为空,无法取得上一个页面的url 自定义控件 访问问题! 高手请帮忙!! 去IE打印有表头表尾
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();
}
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))
好象并不是很准确,有时候判断不出来!
我现在目前只能上传的图片全部重转一次,麻烦啊
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的那个,别的都不能显示,迷惑中...
专家解释下吧!