Web image标签 有些JPG格式照片不能显示问题 解释及解决
2010-11-16 11:54
495 查看
今天做照片管理软件遇到个问题,某些JPG照片不能在WEB显示,查询后,找到了原因:
网页支持的格式应该是RGB格式的。而有时候我们扫描或者接受别人发过来的图片时,图片是CMYK印刷格式的。这种图片在本地编辑、查看一点问题都没有,但一旦放在网页中,就会无法显示。当你无法确认这是哪种图片格式的时候,推荐使用最简单的方法:用PHOTOSHOP(简称PS)打开这个图片,然后菜单“图象”——“模式”,这时就可以看到在“RGB”还是 “CMYK”前面打着对勾,就说明这是什么格式的。想改变格式的话就可以点击相应的格式。改变后保存图片再上传就可以了。
然后,网上找来个CMYK格式转换成RGB格式的方法
public class SaveImgAsRGB
{
/// <summary>
/// 上传图片 集成cmyk→rgb
/// </summary>
/// <param name="postedFile">上载文件的访问</param>
/// <param name="filePaht">保存目录</param>
/// <returns>上传后的文件名</returns>
public string SavePostedImage(HttpPostedFile postedFile, string filePaht)
{
return SavePostedImage(postedFile,filePaht,"",0,0,null,0.8);
}
/// <summary>
/// 上传图片 集成cmyk→rgb
/// </summary>
/// <param name="postedFile">上载文件的访问</param>
/// <param name="filePaht">保存目录</param>
/// <param name="imgFormat">图片格式要求</param>
/// <returns>上传后的文件名</returns>
public string SavePostedImage(HttpPostedFile postedFile, string filePaht,System.Drawing.Imaging.ImageFormat imgFormat)
{
return SavePostedImage(postedFile,filePaht,"",0,0,imgFormat,0.8);
}
/// <summary>
/// 上传图片 集成cmyk→rgb
/// </summary>
/// <param name="postedFile">上载文件的访问</param>
/// <param name="filePaht">保存目录</param>
/// <param name="fileName">新名字</param>
/// <param name="imgFormat">图片格式要求</param>
/// <returns>上传后的文件名</returns>
public string SavePostedImage(HttpPostedFile postedFile, string filePaht,string fileName,System.Drawing.Imaging.ImageFormat imgFormat)
{
return SavePostedImage(postedFile,filePaht,fileName,0,0,imgFormat,0.8);
}
/// <summary>
/// 上传图片 集成cmyk→rgb
/// </summary>
/// <param name="postedFile">上载文件的访问</param>
/// <param name="filePaht">保存目录</param>
/// <param name="fileName">新名字</param>
/// <param name="maxHeight">限高</param>
/// <param name="maxWidth">限宽</param>
/// <param name="imgFormat">图片格式要求</param>
/// <param name="rate">压缩比(double:0--1)</param>
/// <returns>上传后的文件名</returns>
public string SavePostedImage(HttpPostedFile postedFile, string filePaht,string fileName, int maxHeight, int maxWidth,System.Drawing.Imaging.ImageFormat imgFormat,double rate)
{
try
{
if(imgFormat==null)
{
if (postedFile.FileName.ToLower().EndsWith("jpg"))
{
imgFormat = ImageFormat.Jpeg;
}
else if (postedFile.FileName.ToLower().EndsWith("gif"))
{
imgFormat = ImageFormat.Gif;
}
else if (postedFile.FileName.ToLower().EndsWith("bmp"))
{
imgFormat = ImageFormat.Bmp;
}
else if (postedFile.FileName.ToLower().EndsWith("png"))
{
imgFormat = ImageFormat.Png;
}
else if (postedFile.FileName.ToLower().EndsWith("tiff"))
{
imgFormat = ImageFormat.Tiff;
}
else if (postedFile.FileName.ToLower().EndsWith("icon"))
{
imgFormat = ImageFormat.Icon;
}
else
{
return "";
}
}
Bitmap bmp = new Bitmap(postedFile.InputStream);
bmp=IsCMYK(bmp)?ConvertCMYK(bmp, rate):bmp;
if ((bmp.HorizontalResolution > 72) || (bmp.VerticalResolution > 72))
{
bmp.SetResolution(72, 72);
}
Bitmap saveBmp;
if ((bmp.Height > maxHeight) || (bmp.Width > maxWidth))
{
if ((maxHeight==0) || (maxWidth==0))
{
saveBmp = new Bitmap(bmp);
}
else
{
Double heightRatio = Convert.ToDouble(maxHeight) / Convert.ToDouble(bmp.Height);
Double widthRatio = Convert.ToDouble(maxWidth) / Convert.ToDouble(bmp.Width);
Double scaleRatio;
scaleRatio = heightRatio > widthRatio ? widthRatio : heightRatio;
saveBmp = new Bitmap(bmp, Convert.ToInt32(bmp.Width * scaleRatio), Convert.ToInt32(bmp.Height * scaleRatio));
}
}
else
{
saveBmp = new Bitmap(bmp);
}
DateTime DateFile=DateTime.Now;
string NewFileName=DateFile.Year.ToString()+DateFile.Month.ToString()+DateFile.Day.ToString()+DateFile.Hour.ToString()+DateFile.Minute.ToString();
fileName=fileName.LastIndexOf('.') > 0 ? fileName.Substring(0, fileName.IndexOf('.')) : fileName.Replace(".","");
fileName=fileName!=""?NewFileName+fileName:NewFileName;
string path=HttpContext.Current.Server.MapPath(filePaht);
if(!Directory.Exists(path))
Directory.CreateDirectory(path);
fileName+="."+imgFormat.ToString();
saveBmp.Save(path + "//" + fileName , imgFormat);
bmp.Dispose();
saveBmp.Dispose();
postedFile.InputStream.Close();
}
catch (System.Exception)
{
fileName="";
}
return fileName;
}
#region 获取ImageFlags
private string GetImageFlags(System.Drawing.Image img)
{
ImageFlags FlagVals = (ImageFlags)Enum.Parse(typeof(ImageFlags), img.Flags.ToString());
return FlagVals.ToString();
}
#endregion
#region 判断CMYK
private bool IsCMYK(System.Drawing.Image img)
{
string FlagVals = GetImageFlags(img);
if ((FlagVals.IndexOf("Ycck") > -1) || (FlagVals.IndexOf("Cmyk") > -1))
{ ret
ad59
urn true; }
else
{ return false; }
}
#endregion
#region 压缩图片
private Bitmap ConvertCMYK(Bitmap bmp,double rate)
{
rate=rate>1.0?1.0:rate;
rate=rate<0.5?0.5:rate;
Bitmap tmpBmp = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(tmpBmp);
if (rate==0.5)//底质量
{
g.CompositingQuality = CompositingQuality.HighSpeed;
g.SmoothingMode = SmoothingMode.HighSpeed;
g.InterpolationMode = InterpolationMode.NearestNeighbor;
}
if (rate==1.0)//高质量
{
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
}
else
{//一般质量
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
}
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;
}
#endregion
}
网页支持的格式应该是RGB格式的。而有时候我们扫描或者接受别人发过来的图片时,图片是CMYK印刷格式的。这种图片在本地编辑、查看一点问题都没有,但一旦放在网页中,就会无法显示。当你无法确认这是哪种图片格式的时候,推荐使用最简单的方法:用PHOTOSHOP(简称PS)打开这个图片,然后菜单“图象”——“模式”,这时就可以看到在“RGB”还是 “CMYK”前面打着对勾,就说明这是什么格式的。想改变格式的话就可以点击相应的格式。改变后保存图片再上传就可以了。
然后,网上找来个CMYK格式转换成RGB格式的方法
public class SaveImgAsRGB
{
/// <summary>
/// 上传图片 集成cmyk→rgb
/// </summary>
/// <param name="postedFile">上载文件的访问</param>
/// <param name="filePaht">保存目录</param>
/// <returns>上传后的文件名</returns>
public string SavePostedImage(HttpPostedFile postedFile, string filePaht)
{
return SavePostedImage(postedFile,filePaht,"",0,0,null,0.8);
}
/// <summary>
/// 上传图片 集成cmyk→rgb
/// </summary>
/// <param name="postedFile">上载文件的访问</param>
/// <param name="filePaht">保存目录</param>
/// <param name="imgFormat">图片格式要求</param>
/// <returns>上传后的文件名</returns>
public string SavePostedImage(HttpPostedFile postedFile, string filePaht,System.Drawing.Imaging.ImageFormat imgFormat)
{
return SavePostedImage(postedFile,filePaht,"",0,0,imgFormat,0.8);
}
/// <summary>
/// 上传图片 集成cmyk→rgb
/// </summary>
/// <param name="postedFile">上载文件的访问</param>
/// <param name="filePaht">保存目录</param>
/// <param name="fileName">新名字</param>
/// <param name="imgFormat">图片格式要求</param>
/// <returns>上传后的文件名</returns>
public string SavePostedImage(HttpPostedFile postedFile, string filePaht,string fileName,System.Drawing.Imaging.ImageFormat imgFormat)
{
return SavePostedImage(postedFile,filePaht,fileName,0,0,imgFormat,0.8);
}
/// <summary>
/// 上传图片 集成cmyk→rgb
/// </summary>
/// <param name="postedFile">上载文件的访问</param>
/// <param name="filePaht">保存目录</param>
/// <param name="fileName">新名字</param>
/// <param name="maxHeight">限高</param>
/// <param name="maxWidth">限宽</param>
/// <param name="imgFormat">图片格式要求</param>
/// <param name="rate">压缩比(double:0--1)</param>
/// <returns>上传后的文件名</returns>
public string SavePostedImage(HttpPostedFile postedFile, string filePaht,string fileName, int maxHeight, int maxWidth,System.Drawing.Imaging.ImageFormat imgFormat,double rate)
{
try
{
if(imgFormat==null)
{
if (postedFile.FileName.ToLower().EndsWith("jpg"))
{
imgFormat = ImageFormat.Jpeg;
}
else if (postedFile.FileName.ToLower().EndsWith("gif"))
{
imgFormat = ImageFormat.Gif;
}
else if (postedFile.FileName.ToLower().EndsWith("bmp"))
{
imgFormat = ImageFormat.Bmp;
}
else if (postedFile.FileName.ToLower().EndsWith("png"))
{
imgFormat = ImageFormat.Png;
}
else if (postedFile.FileName.ToLower().EndsWith("tiff"))
{
imgFormat = ImageFormat.Tiff;
}
else if (postedFile.FileName.ToLower().EndsWith("icon"))
{
imgFormat = ImageFormat.Icon;
}
else
{
return "";
}
}
Bitmap bmp = new Bitmap(postedFile.InputStream);
bmp=IsCMYK(bmp)?ConvertCMYK(bmp, rate):bmp;
if ((bmp.HorizontalResolution > 72) || (bmp.VerticalResolution > 72))
{
bmp.SetResolution(72, 72);
}
Bitmap saveBmp;
if ((bmp.Height > maxHeight) || (bmp.Width > maxWidth))
{
if ((maxHeight==0) || (maxWidth==0))
{
saveBmp = new Bitmap(bmp);
}
else
{
Double heightRatio = Convert.ToDouble(maxHeight) / Convert.ToDouble(bmp.Height);
Double widthRatio = Convert.ToDouble(maxWidth) / Convert.ToDouble(bmp.Width);
Double scaleRatio;
scaleRatio = heightRatio > widthRatio ? widthRatio : heightRatio;
saveBmp = new Bitmap(bmp, Convert.ToInt32(bmp.Width * scaleRatio), Convert.ToInt32(bmp.Height * scaleRatio));
}
}
else
{
saveBmp = new Bitmap(bmp);
}
DateTime DateFile=DateTime.Now;
string NewFileName=DateFile.Year.ToString()+DateFile.Month.ToString()+DateFile.Day.ToString()+DateFile.Hour.ToString()+DateFile.Minute.ToString();
fileName=fileName.LastIndexOf('.') > 0 ? fileName.Substring(0, fileName.IndexOf('.')) : fileName.Replace(".","");
fileName=fileName!=""?NewFileName+fileName:NewFileName;
string path=HttpContext.Current.Server.MapPath(filePaht);
if(!Directory.Exists(path))
Directory.CreateDirectory(path);
fileName+="."+imgFormat.ToString();
saveBmp.Save(path + "//" + fileName , imgFormat);
bmp.Dispose();
saveBmp.Dispose();
postedFile.InputStream.Close();
}
catch (System.Exception)
{
fileName="";
}
return fileName;
}
#region 获取ImageFlags
private string GetImageFlags(System.Drawing.Image img)
{
ImageFlags FlagVals = (ImageFlags)Enum.Parse(typeof(ImageFlags), img.Flags.ToString());
return FlagVals.ToString();
}
#endregion
#region 判断CMYK
private bool IsCMYK(System.Drawing.Image img)
{
string FlagVals = GetImageFlags(img);
if ((FlagVals.IndexOf("Ycck") > -1) || (FlagVals.IndexOf("Cmyk") > -1))
{ ret
ad59
urn true; }
else
{ return false; }
}
#endregion
#region 压缩图片
private Bitmap ConvertCMYK(Bitmap bmp,double rate)
{
rate=rate>1.0?1.0:rate;
rate=rate<0.5?0.5:rate;
Bitmap tmpBmp = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(tmpBmp);
if (rate==0.5)//底质量
{
g.CompositingQuality = CompositingQuality.HighSpeed;
g.SmoothingMode = SmoothingMode.HighSpeed;
g.InterpolationMode = InterpolationMode.NearestNeighbor;
}
if (rate==1.0)//高质量
{
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
}
else
{//一般质量
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
}
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;
}
#endregion
}
相关文章推荐
- MyEclipse+Tomcat开发Web项目时修改内容不能及时显示问题解决方法
- 使用struts bean:write标签时不能显示Integer,Date等类型的属性问题的解决
- Lync问题解决之部分客户端不能显示照片
- 解决 IOS9.0 调用qq2.91SDK登录 只显示web页面而不能调用客户端登录的问题
- 使用struts bean:write标签时不能显示Integer,BigDecimal等类型的属性问题的解决
- 使用SDWebImage解决头像不显示问题
- html的img中使用SVG图片做SRC在本地测试可用但是上传服务器后不能显示问题解决 标签: SVGMIME TYPE不显示服务器设置 2016-05-21 13:49 2517人阅读 评论(0)
- 解决百度富文本编辑不能上传视频成功但是在IE浏览器不能播放、显示的问题、解决浏览器不支持video标签
- 关于解决用<i>标签做图标不能显示的问题
- flexview模板中解决图表控件不能显示的问题
- Android 6.0 解决recyclerview 在 scrollview 中不能全部显示,高度不正常的问题
- 如何解决ASP.NET中中文不能正常显示问题
- 解决qt程序在板子上不能正常显示中文的问题
- 如何解决vs2003 asp.net树控件不能正常显示的问题
- 解决android模拟器启动后只能在任务栏显示而不能在电脑屏幕显示的问题
- webView接入本地html图片 解决不显示问题
- 取从textarea中存到MYSQL的数据以原格式显示问题以及解决MySQL日期处理和标签的使用
- 解决 Ext tabPanel 下组件不能及时显示的问题
- 解决webpack dev-server不能匹配post请求的问题
- 在c#中将dataset输出成xml内容的xls文件,解决其它输出不能在excel中显示“001”的前导0的问题