这是我给图片加水印的一个方法:
public Image CreateWater(Stream InputStream)
{
Image OrgImage = Image.FromStream(InputStream);
Graphics g = Graphics.FromImage(OrgImage);
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
Bitmap WaterImage = new Bitmap(OrgImage.Width, OrgImage.Height);
Graphics wg = Graphics.FromImage(WaterImage);
wg.CompositingQuality = CompositingQuality.HighQuality;
wg.SmoothingMode = SmoothingMode.HighQuality;
try
{
if (SystemConfig.Water == WaterStatus.Font)
{
wg.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
SolidBrush Front = new SolidBrush(Color.FromName(SystemConfig.MarkFontColor));
Font Word = new Font(SystemConfig.MarkFontFamily, SystemConfig.MarkFontSize
, (FontStyle.Regular), GraphicsUnit.Pixel);
StringFormat sf = this.GetFontPostion(SystemConfig.MarkPostion);
try
{
wg.DrawString(SystemConfig.MarkFont, Word, Front, new Rectangle(0, 0
, WaterImage.Width, WaterImage.Height), sf);
if (SystemConfig.MarkOpacity > 0)
{
g.DrawImage(WaterImage, new Rectangle(0, 0, WaterImage.Width, WaterImage.Height)
, 0, 0, WaterImage.Width, WaterImage.Height, GraphicsUnit.Pixel
, this.MakeOpaticy((float)SystemConfig.MarkOpacity));
}
else
{
g.DrawImage(WaterImage, new Rectangle(0, 0, WaterImage.Width, WaterImage.Height)
, 0, 0, WaterImage.Width, WaterImage.Height, GraphicsUnit.Pixel);
}
}
finally
{
sf.Dispose();
Word.Dispose();
}
}
else if (SystemConfig.Water == WaterStatus.Image && !String.IsNullOrWhiteSpace(SystemConfig.MarkImage))
{
string ImagePath = SystemConfig.MarkImage.Replace("/", @"\");
if (ImagePath.StartsWith(@"\"))
{
ImagePath = ImagePath.Substring(1);
}
ImagePath = Path.Combine(HttpRuntime.AppDomainAppPath, ImagePath);
WaterImage = new Bitmap(ImagePath);
Point[] fpos = this.GetImagePos(SystemConfig.MarkPostion, OrgImage.Width
, OrgImage.Height, WaterImage.Width, WaterImage.Height);
if (SystemConfig.MarkOpacity > 0)
{
Rectangle r = new Rectangle(0, 0, WaterImage.Width, WaterImage.Height);
g.DrawImage(WaterImage, fpos, r, GraphicsUnit.Pixel
, this.MakeOpaticy((float)SystemConfig.MarkOpacity));
}
else
{
g.DrawImage(WaterImage, fpos);
}
}
return OrgImage;
}
finally
{
wg.Dispose();
WaterImage.Dispose();
g.Dispose();
}
}
这是我保存图片的方法:
private bool SaveFile(Stream InputStream, string FileName, LoadFileType Ftype)
{
MemoryStream Fstream = new MemoryStream();
if (Ftype == LoadFileType.Image && SystemConfig.Water != WaterStatus.Closed)
{
WaterMask wm = new WaterMask();
using (Image img = wm.CreateWater(InputStream))
{
img.Save(Fstream, img.RawFormat);
}
}
else
{
Fstream = InputStream as MemoryStream;
}
if (this.SiteUrl.Equals("Local"))
{
string SavePath = Path.Combine(HttpRuntime.AppDomainAppPath
, FileName.Substring(1)).Replace("/", "\\");
if (!Directory.Exists(Path.GetDirectoryName(SavePath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(SavePath));
}
FileStream fs = new FileStream(SavePath, FileMode.Create, FileAccess.Write);
try
{
byte[] ReadBytes = new byte[1024];
int ReadCount = Fstream.Read(ReadBytes, 0, ReadBytes.Length);
while (ReadCount > 0)
{
fs.Write(ReadBytes, 0, ReadCount);
ReadCount = Fstream.Read(ReadBytes, 0, ReadBytes.Length);
}
}
catch (Exception ex)
{
this.Error = ex.ToString();
return false;
}
finally
{
fs.Dispose();
Fstream.Dispose();
}
}
else if (!String.IsNullOrWhiteSpace(this.FtpUser)
&& !String.IsNullOrWhiteSpace(this.FtpPass))
{
FtpOperation ftp = new FtpOperation(this.SiteUrl, this.FtpUser, this.FtpPass);
ftp.UpLoadFile(FileName, Fstream, false);
}
return true;
}
问题来了,Fstream在调用CreateWater后不可以Read(),也就是Fstream.Read(ReadBytes, 0, ReadBytes.Length)等于0.但是可以用Fstream.ToArray()返回bytes数组.这是为什么啊 谢谢大侠们帮我看看啊。郁闷
public Image CreateWater(Stream InputStream)
{
Image OrgImage = Image.FromStream(InputStream);
Graphics g = Graphics.FromImage(OrgImage);
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
Bitmap WaterImage = new Bitmap(OrgImage.Width, OrgImage.Height);
Graphics wg = Graphics.FromImage(WaterImage);
wg.CompositingQuality = CompositingQuality.HighQuality;
wg.SmoothingMode = SmoothingMode.HighQuality;
try
{
if (SystemConfig.Water == WaterStatus.Font)
{
wg.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
SolidBrush Front = new SolidBrush(Color.FromName(SystemConfig.MarkFontColor));
Font Word = new Font(SystemConfig.MarkFontFamily, SystemConfig.MarkFontSize
, (FontStyle.Regular), GraphicsUnit.Pixel);
StringFormat sf = this.GetFontPostion(SystemConfig.MarkPostion);
try
{
wg.DrawString(SystemConfig.MarkFont, Word, Front, new Rectangle(0, 0
, WaterImage.Width, WaterImage.Height), sf);
if (SystemConfig.MarkOpacity > 0)
{
g.DrawImage(WaterImage, new Rectangle(0, 0, WaterImage.Width, WaterImage.Height)
, 0, 0, WaterImage.Width, WaterImage.Height, GraphicsUnit.Pixel
, this.MakeOpaticy((float)SystemConfig.MarkOpacity));
}
else
{
g.DrawImage(WaterImage, new Rectangle(0, 0, WaterImage.Width, WaterImage.Height)
, 0, 0, WaterImage.Width, WaterImage.Height, GraphicsUnit.Pixel);
}
}
finally
{
sf.Dispose();
Word.Dispose();
}
}
else if (SystemConfig.Water == WaterStatus.Image && !String.IsNullOrWhiteSpace(SystemConfig.MarkImage))
{
string ImagePath = SystemConfig.MarkImage.Replace("/", @"\");
if (ImagePath.StartsWith(@"\"))
{
ImagePath = ImagePath.Substring(1);
}
ImagePath = Path.Combine(HttpRuntime.AppDomainAppPath, ImagePath);
WaterImage = new Bitmap(ImagePath);
Point[] fpos = this.GetImagePos(SystemConfig.MarkPostion, OrgImage.Width
, OrgImage.Height, WaterImage.Width, WaterImage.Height);
if (SystemConfig.MarkOpacity > 0)
{
Rectangle r = new Rectangle(0, 0, WaterImage.Width, WaterImage.Height);
g.DrawImage(WaterImage, fpos, r, GraphicsUnit.Pixel
, this.MakeOpaticy((float)SystemConfig.MarkOpacity));
}
else
{
g.DrawImage(WaterImage, fpos);
}
}
return OrgImage;
}
finally
{
wg.Dispose();
WaterImage.Dispose();
g.Dispose();
}
}
这是我保存图片的方法:
private bool SaveFile(Stream InputStream, string FileName, LoadFileType Ftype)
{
MemoryStream Fstream = new MemoryStream();
if (Ftype == LoadFileType.Image && SystemConfig.Water != WaterStatus.Closed)
{
WaterMask wm = new WaterMask();
using (Image img = wm.CreateWater(InputStream))
{
img.Save(Fstream, img.RawFormat);
}
}
else
{
Fstream = InputStream as MemoryStream;
}
if (this.SiteUrl.Equals("Local"))
{
string SavePath = Path.Combine(HttpRuntime.AppDomainAppPath
, FileName.Substring(1)).Replace("/", "\\");
if (!Directory.Exists(Path.GetDirectoryName(SavePath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(SavePath));
}
FileStream fs = new FileStream(SavePath, FileMode.Create, FileAccess.Write);
try
{
byte[] ReadBytes = new byte[1024];
int ReadCount = Fstream.Read(ReadBytes, 0, ReadBytes.Length);
while (ReadCount > 0)
{
fs.Write(ReadBytes, 0, ReadCount);
ReadCount = Fstream.Read(ReadBytes, 0, ReadBytes.Length);
}
}
catch (Exception ex)
{
this.Error = ex.ToString();
return false;
}
finally
{
fs.Dispose();
Fstream.Dispose();
}
}
else if (!String.IsNullOrWhiteSpace(this.FtpUser)
&& !String.IsNullOrWhiteSpace(this.FtpPass))
{
FtpOperation ftp = new FtpOperation(this.SiteUrl, this.FtpUser, this.FtpPass);
ftp.UpLoadFile(FileName, Fstream, false);
}
return true;
}
问题来了,Fstream在调用CreateWater后不可以Read(),也就是Fstream.Read(ReadBytes, 0, ReadBytes.Length)等于0.但是可以用Fstream.ToArray()返回bytes数组.这是为什么啊 谢谢大侠们帮我看看啊。郁闷
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货