我在网站上传了一张照片,我想在其上设置水印并保存原始质量。为了测试,我创建了C#应用程序。
class Class1
{
public static string GetContentType(String path)
{
switch (Path.GetExtension(path))
{
case ".bmp": return "Image/bmp";
case ".gif": return "Image/gif";
case ".jpg": return "Image/jpeg";
case ".png": return "Image/png";
default: break;
}
return String.Empty;
}
public static ImageFormat GetImageFormat(String path)
{
switch (Path.GetExtension(path).ToLower())
{
case ".bmp": return ImageFormat.Bmp;
case ".gif": return ImageFormat.Gif;
case ".jpg": return ImageFormat.Jpeg;
case ".png": return ImageFormat.Png;
default: return null;
}
}
public static void AddWaterMark(string sourceFile, string destinationPath)
{
// Normally you’d put this in a config file somewhere.
string watermark = "http://mysite.com/";
Image image = Image.FromFile(sourceFile);
Graphics graphic;
if (image.PixelFormat != PixelFormat.Indexed &&
image.PixelFormat != PixelFormat.Format8bppIndexed &&
image.PixelFormat != PixelFormat.Format4bppIndexed &&
image.PixelFormat != PixelFormat.Format1bppIndexed)
{
graphic = Graphics.FromImage(image);
}
else
{
Bitmap indexedImage = new Bitmap(image);
graphic = Graphics.FromImage(indexedImage);
// Draw the contents of the original bitmap onto the new bitmap.
graphic.DrawImage(image, 0, 0, image.Width, image.Height);
image = indexedImage;
}
graphic.SmoothingMode = SmoothingMode.AntiAlias & SmoothingMode.HighQuality;
Font myFont = new Font("Arial", 20);
SolidBrush brush = new SolidBrush(Color.FromArgb(80, Color.White));
//This gets the size of the graphic
SizeF textSize = graphic.MeasureString(watermark, myFont);
// Code for writing text on the image.
PointF pointF = new PointF(430, 710);
graphic.DrawString(watermark, myFont, brush, pointF);
image.Save(destinationPath, GetImageFormat(sourceFile));
graphic.Dispose();
}
}
//And using
class Program
{
private static string file1 = "C:\\1.JPG";
private static string file1_withwatermark = "C:\\1_withwatermark.JPG";
static void Main(string[] args)
{
Class1.AddWaterMark(file1, file1_withwatermark);
}
}
file1的分辨率为3648x2736
,大小为4Mb
。
我不明白的第一件事是为什么file1_withwatermark
没有水印?
第二个问题是为什么file1_withwatermark
的大小为1Mb
,但它的分辨率也是3648x2736
!我希望以原始质量保存file1_withwatermark
,file1_withwatermark
的大小必须大约为4Mb
。
答案 0 :(得分:2)
部分答案;请注意,JPEG是一种有损压缩方法。因此,将在保存的图像中丢失与原始图像相比的实际图像质量。
即使您以更高的质量级别保存,也会产生比原始文件更大的文件。
对于一个或两个重新保存文件的实例而言,这不是一个大问题,但在考虑编辑过的JPEG压缩图像的“质量”和文件大小时,请记住这一点。
答案 1 :(得分:1)
两个想法:1)尝试交换保存和处理线;在保存之前,您可能有未完成的待处理图形操作。 2)如果是jpeg img,则需要指定质量等级。见High quality JPEG compression with c#