我有一个如下所示的函数:
// Convert To JPG
//
public string AlltoJPG(FileInfo foo)
{
// Get file extension
string fileExtension = foo.Extension;
// Get file name without extenstion
string fileName = foo.Name.Replace(foo.Extension, string.Empty) + ".jpg";
/*------------------------------------------------------------------------*/
/// <Check for PNG File Format>
if (fileExtension == ".png" || fileExtension == ".PNG")
{
System.Drawing.Image img = System.Drawing.Image.FromFile(foo.FullName);
// Assumes img is the PNG you are converting
using (Bitmap b = new Bitmap(img.Width, img.Height))
{
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(b))
{
g.Clear(System.Drawing.Color.White);
g.DrawImageUnscaled(img, 0, 0);
}
// Save the image as a JPG
b.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
/*------------------------------------------------------------------------*/
/// <Check for GIF File Format>
if (fileExtension == ".gif" || fileExtension == ".GIF")
{
System.Drawing.Image img = System.Drawing.Image.FromFile(foo.FullName);
// Construct a bitmap from the image resource.
Bitmap bmp1 = new Bitmap(img.Width, img.Height);
// Save the image as a JPG
bmp1.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
}
/*------------------------------------------------------------------------*/
/// <Check for BMP File Format>
if (fileExtension == ".bmp" || fileExtension == ".BMP")
{
System.Drawing.Image img = System.Drawing.Image.FromFile(foo.FullName);
// Construct a bitmap from the image resource.
Bitmap bmp1 = new Bitmap(img.Width, img.Height);
// Save the image as a JPG
bmp1.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
}
/*------------------------------------------------------------------------*/
/// <Check for TIFF File Format>
if (fileExtension == ".tiff" || fileExtension == ".TIFF")
{
System.Drawing.Image img = System.Drawing.Image.FromFile(foo.FullName);
// Construct a bitmap from the image resource.
Bitmap bmp1 = new Bitmap(img.Width, img.Height);
// Save the image as a JPG
bmp1.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
}
/*------------------------------------------------------------------------*/
fileName = foo.DirectoryName + "\\" + fileName;
return fileName;
}
我正在尝试转换bmp
,png
,gif
,tiff
文件格式为jpg
, but GDI+
如给出:
System.OutOfMemoryException 未处理
消息=Bellek Yetersiz。
来源=系统.绘图
堆栈跟踪:
konum:System.Drawing.Image.FromFile(字符串文件名,布尔值useEmbeddedColorManagement)
konum:System.Drawing.Image.FromFile(字符串文件名)
那么我怎样才能避免这种情况并至少转换PNG
and BMP
文件到JPG
?
这是错误的图片:
我发现问题了!这是由 PNG alpha 通道引起的。
感谢 max,下面的链接解决了我的问题:
如何将透明 PNG 加载到位图并忽略 Alpha 通道 https://stackoverflow.com/questions/6809442/how-to-load-transparent-png-to-bitmap-and-ignore-alpha-channel
public static void SetAlpha(this Bitmap bmp, byte alpha)
{
if(bmp == null) throw new ArgumentNullException("bmp");
var data = bmp.LockBits(
new Rectangle(0, 0, bmp.Width, bmp.Height),
System.Drawing.Imaging.ImageLockMode.ReadWrite,
System.Drawing.Imaging.PixelFormat.Format32bppArgb);
var line = data.Scan0;
var eof = line + data.Height * data.Stride;
while(line != eof)
{
var pixelAlpha = line + 3;
var eol = pixelAlpha + data.Width * 4;
while(pixelAlpha != eol)
{
System.Runtime.InteropServices.Marshal.WriteByte(
pixelAlpha, alpha);
pixelAlpha += 4;
}
line += data.Stride;
}
bmp.UnlockBits(data);
}
Usage:
var pngImage = new Bitmap("filename.png");
pngImage.SetAlpha(255);
设置 alpha 后,它开始正常工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)