using System;
|
using System.Collections.Generic;
|
using System.Drawing;
|
using System.Drawing.Imaging;
|
using System.Linq;
|
|
namespace IStation.WinFrmUI.Basic
|
{
|
public class ImageWaterMarkHelper
|
{
|
#region 添加水印和标题
|
|
|
//添加水印 (计算位置)
|
public static void AddLogoImage(string image_file, bool isWaterMarkLogo)
|
{
|
if (!System.IO.File.Exists(image_file))
|
return;
|
|
var imgSource = Image.FromFile(image_file);
|
if (imgSource == null)
|
return;
|
|
var bitMap = AddLogoImage(imgSource, isWaterMarkLogo);
|
if (bitMap == null)
|
return;
|
imgSource.Dispose();
|
bitMap.Save(image_file);
|
bitMap.Dispose();
|
}
|
public static Image AddLogoImage(Image imgSource, bool isWaterMarkLogo)
|
{
|
string waterMarkLogoFile = null;
|
if (!GetLogoFilePath(isWaterMarkLogo, out waterMarkLogoFile))
|
return imgSource;
|
var width = imgSource.Width;
|
var height = imgSource.Height;
|
if (width < 200 || height < 60)
|
{
|
return imgSource;
|
}
|
try
|
{
|
if (IsIndexedPixelFormat(imgSource.PixelFormat))
|
{
|
var bitMap = new Bitmap(width, height);
|
bitMap.SetResolution(imgSource.HorizontalResolution, imgSource.VerticalResolution);
|
using (Graphics gh = Graphics.FromImage(bitMap))
|
{
|
gh.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
|
gh.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
gh.DrawImage(imgSource, new Rectangle(0, 0, width, height), 0, 0, width, height, GraphicsUnit.Pixel);
|
DrawLogoByCalc(gh, bitMap.Width, bitMap.Height, waterMarkLogoFile);
|
}
|
|
|
return bitMap;
|
}
|
else
|
{
|
|
var bitMap = new Bitmap(imgSource);
|
|
using (Graphics gh = Graphics.FromImage(bitMap))
|
{
|
DrawLogoByCalc(gh, bitMap.Width, bitMap.Height, waterMarkLogoFile);
|
}
|
|
return bitMap;
|
|
}
|
}
|
catch
|
{
|
return imgSource;
|
}
|
}
|
|
//添加水印 (计算位置)
|
/* public static Image AddLogoImage(Image imgSource, bool isWaterMarkLogo)
|
{
|
if (imgSource == null)
|
return imgSource;
|
try
|
{
|
var width = imgSource.Width;
|
var height = imgSource.Height;
|
if (width < 200 || height < 60)
|
{
|
return imgSource;
|
}
|
|
string waterMarkLogoFile = null;
|
if (!GetLogoFilePath(isWaterMarkLogo, out waterMarkLogoFile))
|
return imgSource;
|
|
//if (IsIndexedPixelFormat(imgSource.PixelFormat))
|
//{
|
var bmp = new Bitmap(width, height);
|
bmp.SetResolution(imgSource.HorizontalResolution, imgSource.VerticalResolution);
|
using (Graphics gh = Graphics.FromImage(bmp))
|
{
|
gh.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
|
gh.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
gh.DrawImage(imgSource, new Rectangle(0, 0, width, height), 0, 0, width, height, GraphicsUnit.Pixel);
|
|
DrawLogoByCalc(gh, bmp.Width, bmp.Height, waterMarkLogoFile);
|
}
|
|
return bmp;
|
//}
|
//else
|
//{
|
// var bmp = new Bitmap(width, height);
|
// bmp.SetResolution(imgSource.HorizontalResolution, imgSource.VerticalResolution);
|
// using (Graphics gh = Graphics.FromImage(bmp))
|
// {
|
// gh.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
|
// gh.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
// gh.DrawImage(imgSource, new Rectangle(0, 0, width, height), 0, 0, width, height, GraphicsUnit.Pixel);
|
|
// CalcLogoImagePosi(gh, bmp.Width, bmp.Height, waterMarkLogoFile);
|
// }
|
|
// return bmp;
|
|
// //using (Graphics gh = Graphics.FromImage(imgSource))
|
// //{
|
// // CalcLogoImagePosi(gh, imgSource.Width, imgSource.Height, waterMarkLogoFile);
|
// //}
|
// //return imgSource;
|
//}
|
}
|
catch //(Exception ex)
|
{
|
return imgSource;
|
}
|
}*/
|
|
|
//添加水印(输入水印位置)
|
public static void AddLogoImage(string image_file, List<int> posiList, bool isWaterMarkLogo, float waterMarkImageRatio)
|
{
|
if (posiList == null || posiList.Count <= 0)
|
{
|
AddLogoImage(image_file, isWaterMarkLogo);
|
return;
|
}
|
string waterMarkLogoFile = null;
|
if (!GetLogoFilePath(isWaterMarkLogo, out waterMarkLogoFile))
|
return;
|
var imgSource = Image.FromFile(image_file);
|
var width = imgSource.Width;
|
var height = imgSource.Height;
|
if (width < 200 || height < 60)
|
{
|
return;
|
}
|
try
|
{
|
if (IsIndexedPixelFormat(imgSource.PixelFormat))
|
{
|
var bitMap = new Bitmap(width, height);
|
bitMap.SetResolution(imgSource.HorizontalResolution, imgSource.VerticalResolution);
|
using (Graphics gh = Graphics.FromImage(bitMap))
|
{
|
gh.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
|
gh.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
gh.DrawImage(imgSource, new Rectangle(0, 0, width, height), 0, 0, width, height, GraphicsUnit.Pixel);
|
DrawLogoByPosi(gh, waterMarkLogoFile, posiList, waterMarkImageRatio);
|
}
|
|
bitMap.Save(image_file);
|
bitMap.Dispose();
|
|
imgSource.Dispose();
|
}
|
else
|
{
|
var bitMap = new Bitmap(imgSource);
|
imgSource.Dispose();
|
using (Graphics gh = Graphics.FromImage(bitMap))
|
{
|
DrawLogoByPosi(gh, waterMarkLogoFile, posiList, waterMarkImageRatio);
|
}
|
bitMap.Save(image_file);
|
bitMap.Dispose();
|
}
|
}
|
catch
|
{
|
return;
|
}
|
}
|
|
private static bool GetLogoFilePath(bool isWaterMarkLogo, out string waterMarkLogoFile)
|
{
|
waterMarkLogoFile = "";
|
if (isWaterMarkLogo)
|
{
|
return true;
|
}
|
else
|
{
|
|
|
return false;
|
}
|
|
}
|
|
|
//添加水印(输入水印位置)
|
public static Image AddLogoImage(Image imgSource, List<int> posiList, bool isWaterMarkLogo, float waterMarkImageRatio)
|
{
|
if (posiList == null || posiList.Count <= 0)
|
{
|
return AddLogoImage(imgSource, isWaterMarkLogo);
|
}
|
|
if (imgSource == null)
|
return imgSource;
|
try
|
{
|
var width = imgSource.Width;
|
var height = imgSource.Height;
|
if (width < 200 || height < 60)
|
{
|
return imgSource;
|
}
|
|
string waterMarkLogoFile = null;
|
if (!GetLogoFilePath(isWaterMarkLogo, out waterMarkLogoFile))
|
return imgSource;
|
|
//if (IsIndexedPixelFormat(imgSource.PixelFormat))
|
//{
|
var bmp = new Bitmap(width, height);
|
bmp.SetResolution(imgSource.HorizontalResolution, imgSource.VerticalResolution);
|
using (Graphics gh = Graphics.FromImage(bmp))
|
{
|
gh.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
|
gh.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
gh.DrawImage(imgSource, new Rectangle(0, 0, width, height), 0, 0, width, height, GraphicsUnit.Pixel);
|
|
DrawLogoByPosi(gh, waterMarkLogoFile, posiList, waterMarkImageRatio);
|
}
|
|
return bmp;
|
//}
|
//else
|
//{
|
// var bmp = new Bitmap(width, height);
|
// bmp.SetResolution(imgSource.HorizontalResolution, imgSource.VerticalResolution);
|
// using (Graphics gh = Graphics.FromImage(bmp))
|
// {
|
// gh.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
|
// gh.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
// gh.DrawImage(imgSource, new Rectangle(0, 0, width, height), 0, 0, width, height, GraphicsUnit.Pixel);
|
|
// CalcLogoImagePosi(gh, bmp.Width, bmp.Height, waterMarkLogoFile);
|
// }
|
|
// return bmp;
|
|
// //using (Graphics gh = Graphics.FromImage(imgSource))
|
// //{
|
// // CalcLogoImagePosi(gh, imgSource.Width, imgSource.Height, waterMarkLogoFile);
|
// //}
|
// //return imgSource;
|
//}
|
}
|
catch //(Exception ex)
|
{
|
return imgSource;
|
}
|
}
|
|
|
public static void AddLogoImage(Graphics gh, int ImageWidth, int ImageHeight, bool isWaterMarkLogo)
|
{
|
string waterMarkLogoFile = null;
|
if (!GetLogoFilePath(isWaterMarkLogo, out waterMarkLogoFile))
|
return;
|
try
|
{
|
|
DrawLogoByCalc(gh, ImageWidth, ImageHeight, waterMarkLogoFile);
|
|
}
|
catch //(Exception ex)
|
{
|
return;
|
}
|
}
|
|
|
//通过计算 绘制LOGO
|
private static void DrawLogoByCalc(Graphics gh, int ImageWidth, int ImageHeight, string waterMarkLogoFilePath)
|
{
|
using (var img_waterMark = Image.FromFile(waterMarkLogoFilePath))
|
{
|
var waterMark_width = img_waterMark.Width;
|
var waterMark_height = img_waterMark.Height;
|
if (ImageWidth <= waterMark_width || ImageHeight <= waterMark_height)
|
{
|
float waterMark_width2 = ImageWidth / 2.0f;
|
|
float waterMark_ratio = waterMark_width2 / waterMark_width;
|
|
var left_posi = (ImageWidth / 2 - waterMark_width2 / 2);
|
|
DrawOneColumnLogo(gh, ImageHeight, left_posi, img_waterMark, waterMark_width, waterMark_height, waterMark_ratio);
|
|
return;
|
}
|
if (ImageWidth > waterMark_width * 5)
|
{//3列
|
float waterMark_width2 = ImageWidth / 5.0f;
|
float waterMark_ratio = waterMark_width2 / waterMark_width;
|
float space = waterMark_width2 * 0.5f;
|
var x_posi1 = space;
|
var x_posi2 = space + waterMark_width2 + space;
|
var x_posi3 = space + waterMark_width2 + space + waterMark_width2 + space;
|
|
DrawOneColumnLogo(gh, ImageHeight, x_posi1, img_waterMark, waterMark_width, waterMark_height, waterMark_ratio);
|
|
DrawOneColumnLogo(gh, ImageHeight, x_posi2, img_waterMark, waterMark_width, waterMark_height, waterMark_ratio);
|
|
DrawOneColumnLogo(gh, ImageHeight, x_posi3, img_waterMark, waterMark_width, waterMark_height, waterMark_ratio);
|
}
|
else if (ImageWidth > waterMark_width * 3.5)
|
{//两列
|
float waterMark_width2 = ImageWidth / 3.5f;
|
|
float waterMark_ratio = waterMark_width2 / waterMark_width;
|
|
var space = waterMark_width2 * 0.5f;
|
var x_posi1 = space;
|
var x_posi2 = space + waterMark_width2 + space;
|
|
DrawOneColumnLogo(gh, ImageHeight, x_posi1, img_waterMark, waterMark_width, waterMark_height, waterMark_ratio);
|
|
DrawOneColumnLogo(gh, ImageHeight, x_posi2, img_waterMark, waterMark_width, waterMark_height, waterMark_ratio);
|
}
|
else
|
{//一列
|
float waterMark_width2 = ImageWidth / 2.0f;
|
|
float waterMark_ratio = waterMark_width2 / waterMark_width;
|
|
var left_posi = (ImageWidth / 2 - waterMark_width2 / 2);
|
|
DrawOneColumnLogo(gh, ImageHeight, left_posi, img_waterMark, waterMark_width, waterMark_height, waterMark_ratio);
|
}
|
}
|
}
|
|
//绘制一列
|
private static void DrawOneColumnLogo(Graphics gh, int ImageHeight, int left_posi, Image img_waterMark, int waterMark_width, int waterMark_height, float waterMark_ratio)
|
{
|
var list_y = CalcOneColumnLogoPosi(ImageHeight, waterMark_height, waterMark_ratio);
|
for (int i = 0; i < list_y.Count; i++)
|
{
|
var top_posi = list_y[i];
|
|
var rect_2 = new RectangleF(left_posi, top_posi, waterMark_width, waterMark_height * waterMark_ratio);
|
|
gh.DrawImage(img_waterMark, rect_2);
|
}
|
}
|
private static void DrawOneColumnLogo(Graphics gh, int ImageHeight, float left_posi, Image img_waterMark, float waterMark_width, float waterMark_height, float waterMark_ratio)
|
{
|
var list_y = CalcOneColumnLogoPosi(ImageHeight, (int)waterMark_height, waterMark_ratio);
|
for (int i = 0; i < list_y.Count; i++)
|
{
|
var top_posi = list_y[i];
|
|
var rect_2 = new RectangleF(left_posi, top_posi, waterMark_width * waterMark_ratio, waterMark_height * waterMark_ratio);
|
|
gh.DrawImage(img_waterMark, rect_2);
|
}
|
}
|
//计算一列的位置(等比例)
|
private static List<int> CalcOneColumnLogoPosi(int image_height, int waterMark_origin_height, float waterMark_ratio)
|
{
|
int space_height = 100;
|
int top = 100;
|
int bottom = 100;
|
var waterMark_height = (int)(waterMark_ratio * waterMark_origin_height);
|
if (waterMark_height > 250)
|
{
|
space_height = (int)(waterMark_height * 1.5);
|
top = (int)(waterMark_height * 0.2);
|
bottom = (int)(image_height - waterMark_height * 1.2);
|
}
|
else
|
{
|
space_height = (int)(waterMark_height * 1.8);
|
top = (int)(waterMark_height * 0.5);
|
bottom = (int)(image_height - waterMark_height * 1.5);
|
}
|
|
|
int num = (bottom - top) / space_height + 1;
|
if (num <= 1)
|
{
|
space_height = (int)(waterMark_height * 1.2);
|
top = (int)(waterMark_height * 0.2);
|
bottom = image_height - waterMark_height - 5;
|
}
|
else if (num == 2)
|
{
|
space_height = (int)(waterMark_height * 1.3);
|
top = (int)(waterMark_height * 0.3);
|
bottom = image_height - waterMark_height - 5;
|
}
|
if (num > 5)
|
{//每列最多5个
|
int space = (image_height - waterMark_height * 5) / 6;
|
List<int> posi = new List<int>();
|
for (int i = 0; i < 6; i++)
|
{
|
var top_posi = space + (waterMark_height + space) * i;
|
if (top_posi > image_height - waterMark_height)
|
return posi;
|
|
posi.Add(top_posi);
|
}
|
return posi;
|
}
|
else
|
{
|
List<int> posi = new List<int>();
|
for (int i = 0; i < 100; i++)
|
{
|
var top_posi = top + space_height * i;
|
if (top_posi > bottom)
|
return posi;
|
|
posi.Add(top_posi);
|
}
|
return posi;
|
}
|
|
|
|
}
|
|
//计算一列的位置(缩放水印)
|
//private static List<int> CalcOneColumnLogoPosi(int image_height, int waterMark_height, int waterMark_num, out double scale)
|
//{
|
// scale = 1;
|
// if (waterMark_num == 0)
|
// return CalcOneColumnLogoPosi(image_height, waterMark_height, out scale);
|
|
// double bl = 0.2;//间隙与图片高度的比例
|
// //每列最多5个
|
// double waterMark_height_scale = image_height * 1.0 / (waterMark_num * (1 + bl) + bl);
|
// scale = waterMark_height_scale / waterMark_height;
|
// List<int> posi = new List<int>();
|
// for (int i = 0; i < 100; i++)
|
// {
|
// var top_posi = (i * (1 + bl) + bl) * waterMark_height_scale;
|
// if (top_posi > image_height)
|
// return posi;
|
|
// posi.Add((int)top_posi);
|
// }
|
// return posi;
|
//}
|
|
//通过位置 绘制LOGO
|
private static void DrawLogoByPosi(Graphics gh, string waterMarkLogoFilePath, List<int> posi_array, float waterMarkImageRatio)
|
{
|
using (var img_waterMark = Image.FromFile(waterMarkLogoFilePath))
|
{
|
var waterMark_width = img_waterMark.Width;
|
var waterMark_height = img_waterMark.Height;
|
for (int i = 0; i < posi_array.Count; i = i + 2)
|
{
|
int left_posi = posi_array[i];
|
int top_posi = posi_array[i + 1];
|
|
var rect_2 = new RectangleF(left_posi, top_posi, waterMark_width * waterMarkImageRatio, waterMark_height * waterMarkImageRatio);
|
|
gh.DrawImage(img_waterMark, rect_2);
|
}
|
}
|
}
|
|
|
//计算位置
|
public static List<int> CalcLogoImagePosi(int ImageWidth, int ImageHeight, bool isWaterMarkLogo, out string waterMarkLogoFilePath, out float waterMarkImageRatio)
|
{
|
waterMarkImageRatio = 1;
|
waterMarkLogoFilePath = null;
|
if (!GetLogoFilePath(isWaterMarkLogo, out waterMarkLogoFilePath))
|
return null;
|
|
using (var img_waterMark = Image.FromFile(waterMarkLogoFilePath))
|
{
|
var waterMark_width = img_waterMark.Width;
|
var waterMark_height = img_waterMark.Height;
|
if (ImageWidth <= waterMark_width || ImageHeight <= waterMark_height)
|
{
|
return null;
|
}
|
|
var y_list = CalcOneColumnLogoPosi(ImageHeight, waterMark_height, waterMarkImageRatio);
|
if (y_list == null || y_list.Count() == 0)
|
return null;
|
|
List<int> all_posi = new List<int>();
|
if (ImageWidth > waterMark_width * 5)
|
{//3列 间隙是 0.5,1,0.5,1,0.5,1,0.5,
|
float waterMark_width2 = ImageWidth / 5.0f;
|
|
waterMarkImageRatio = waterMark_width2 * 0.1f / waterMark_width;
|
|
var space = waterMark_width2 * 0.5;
|
var x_posi1 = space;
|
var x_posi2 = space + waterMark_width2 + space;
|
var x_posi3 = space + waterMark_width2 + space + waterMark_width2 + space;
|
|
foreach (var y in y_list)
|
{
|
all_posi.Add((int)x_posi1); all_posi.Add(y);
|
all_posi.Add((int)x_posi2); all_posi.Add(y);
|
all_posi.Add((int)x_posi3); all_posi.Add(y);
|
}
|
}
|
else if (ImageWidth > waterMark_width * 3.5)
|
{//两列
|
float waterMark_width2 = ImageWidth / 3.5f;
|
|
waterMarkImageRatio = waterMark_width2 * 0.1f / waterMark_width;
|
|
var space = waterMark_width2 * 0.5;
|
var x_posi1 = space;
|
var x_posi2 = space + waterMark_width2 + space;
|
|
foreach (var y in y_list)
|
{
|
all_posi.Add((int)x_posi1); all_posi.Add(y);
|
all_posi.Add((int)x_posi2); all_posi.Add(y);
|
}
|
}
|
else
|
{//一列
|
float waterMark_width2 = ImageWidth / 2.0f;
|
waterMarkImageRatio = waterMark_width2 * 0.1f / waterMark_width;
|
|
var x_posi1 = (ImageWidth / 2 - waterMark_width2 / 2);
|
|
foreach (var y in y_list)
|
{
|
all_posi.Add((int)x_posi1); all_posi.Add(y);
|
}
|
}
|
|
return all_posi;
|
}
|
}
|
|
//计算位置
|
public static List<Rectangle> CalcLogoImagePosiF(int ImageWidth, int ImageHeight, bool isWaterMarkLogo, out string waterMarkLogoFilePath, out float waterMark_ratio)
|
{
|
waterMark_ratio = 1;
|
waterMarkLogoFilePath = null;
|
if (!GetLogoFilePath(isWaterMarkLogo, out waterMarkLogoFilePath))
|
return null;
|
|
using (var img_waterMark = Image.FromFile(waterMarkLogoFilePath))
|
{
|
var waterMark_width = img_waterMark.Width;
|
var waterMark_height = img_waterMark.Height;
|
if (ImageWidth <= waterMark_width || ImageHeight <= waterMark_height)
|
{
|
return null;
|
}
|
|
|
return CalcLogoImagePosiF(ImageWidth, ImageHeight, img_waterMark, out waterMark_ratio);
|
}
|
}
|
//计算位置
|
public static List<Rectangle> CalcLogoImagePosiF(int ImageWidth, int ImageHeight, Image img_waterMark, out float waterMark_ratio)
|
{
|
waterMark_ratio = 1;
|
var waterMark_width = img_waterMark.Width;
|
var waterMark_height = img_waterMark.Height;
|
if (ImageWidth <= waterMark_width || ImageHeight <= waterMark_height)
|
{
|
return null;
|
}
|
|
var y_list = CalcOneColumnLogoPosi(ImageHeight, waterMark_height, 1);
|
if (y_list == null || y_list.Count() == 0)
|
return null;
|
|
List<Rectangle> all_posi = new List<Rectangle>();
|
if (ImageWidth > waterMark_width * 5)
|
{//3列
|
var space = (ImageWidth - waterMark_width * 3) / 4;
|
var x_posi1 = space;
|
var x_posi2 = space + waterMark_width + space;
|
var x_posi3 = space + waterMark_width + space + waterMark_width + space;
|
|
foreach (var y in y_list)
|
{
|
all_posi.Add(new Rectangle(x_posi1, y, waterMark_width, waterMark_height));
|
all_posi.Add(new Rectangle(x_posi2, y, waterMark_width, waterMark_height));
|
all_posi.Add(new Rectangle(x_posi3, y, waterMark_width, waterMark_height));
|
}
|
}
|
else if (ImageWidth > waterMark_width * 2.5)
|
{//两列
|
var space = (ImageWidth - waterMark_width * 2) / 3;
|
var x_posi1 = space;
|
var x_posi2 = space + waterMark_width + space;
|
|
foreach (var y in y_list)
|
{
|
all_posi.Add(new Rectangle(x_posi1, y, waterMark_width, waterMark_height));
|
all_posi.Add(new Rectangle(x_posi2, y, waterMark_width, waterMark_height));
|
}
|
}
|
else
|
{//一列
|
var x_posi1 = (ImageWidth / 2 - waterMark_width / 2);
|
|
foreach (var y in y_list)
|
{
|
all_posi.Add(new Rectangle(x_posi1, y, waterMark_width, waterMark_height));
|
}
|
|
}
|
|
return all_posi;
|
|
}
|
|
|
//计算位置(排列2x2)
|
public static List<Rectangle> CalcLogoImagePosiF2x2(int ImageWidth, int ImageHeight, bool isWaterMarkLogo, out string waterMarkLogoFilePath)
|
{
|
waterMarkLogoFilePath = null;
|
if (!GetLogoFilePath(isWaterMarkLogo, out waterMarkLogoFilePath))
|
return null;
|
|
using (var img_waterMark = Image.FromFile(waterMarkLogoFilePath))
|
{
|
var waterMark_width = img_waterMark.Width;
|
var waterMark_height = img_waterMark.Height;
|
if (ImageWidth <= waterMark_width || ImageHeight <= waterMark_height)
|
{
|
return null;
|
}
|
double bl = 0.2;
|
double r_by_width = ImageWidth / (waterMark_width * (2 + 3 * bl));
|
double r_by_height = ImageHeight / (waterMark_height * (2 + 3 * bl));
|
|
double ratio = Math.Min(r_by_height, r_by_width);
|
|
|
|
|
|
List<Rectangle> all_posi = new List<Rectangle>();
|
|
var space_width = (ImageWidth - waterMark_width * ratio * 2) / 3;
|
var space_height = (ImageHeight - waterMark_height * ratio * 2) / 3;
|
|
|
|
all_posi.Add(new Rectangle((int)space_width, (int)space_height, (int)(waterMark_width * ratio), (int)(waterMark_height * ratio)));
|
all_posi.Add(new Rectangle((int)space_width, (int)(space_height * 2 + waterMark_height * ratio), (int)(waterMark_width * ratio), (int)(waterMark_height * ratio)));
|
|
all_posi.Add(new Rectangle((int)(space_width * 2 + waterMark_width * ratio), (int)space_height, (int)(waterMark_width * ratio), (int)(waterMark_height * ratio)));
|
all_posi.Add(new Rectangle((int)(space_width * 2 + waterMark_width * ratio), (int)(space_height * 2 + waterMark_height * ratio), (int)(waterMark_width * ratio), (int)(waterMark_height * ratio)));
|
|
return all_posi;
|
}
|
}
|
|
#endregion
|
|
|
public static bool IsIndexedPixelFormat(System.Drawing.Imaging.PixelFormat imagePixelFormat)
|
{
|
PixelFormat[] pixelFormatArray = {
|
PixelFormat.Format1bppIndexed
|
,PixelFormat.Format4bppIndexed
|
,PixelFormat.Format8bppIndexed
|
,PixelFormat.Undefined
|
,PixelFormat.DontCare
|
,PixelFormat.Format16bppArgb1555
|
,PixelFormat.Format16bppGrayScale
|
};
|
foreach (PixelFormat pf in pixelFormatArray)
|
{
|
if (imagePixelFormat == pf)
|
{
|
return true;
|
}
|
}
|
return false;
|
}
|
|
|
#region 添加水印 代码备份
|
/// <param name="imgSource">原图</param>
|
/// <param name="textWaterMark">水印文字</param>
|
/// <param name="widthPercent">文字块在图片中所占宽度比例</param>
|
//public static Image AddWaterMark(Image imgSource, string textWaterMark, int widthPercent, Color colorWaterMark, ref string createStatus)
|
//{
|
// if (imgSource == null)
|
// return null;
|
// try
|
// {
|
// var width = imgSource.Width;
|
// var height = imgSource.Height;
|
// if (width < 200 || height < 60)
|
// {
|
// createStatus = "图片过小不需要添加水印";
|
// return imgSource;
|
// }
|
|
// var bmp = new Bitmap(width, height);
|
// bmp.SetResolution(imgSource.HorizontalResolution, imgSource.VerticalResolution);
|
// using (Graphics g = Graphics.FromImage(bmp))
|
// using (Brush brush = new SolidBrush(colorWaterMark))
|
// {
|
// g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
|
// g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
// g.DrawImage(imgSource, new Rectangle(0, 0, width, height), 0, 0, width, height, GraphicsUnit.Pixel);
|
// int[] sizes = { 50, 48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2 };
|
// System.Drawing.SizeF sizef = new SizeF();
|
// Font font = null;
|
// for (int i = 0; i < sizes.Length; i++)
|
// {
|
// font = new Font("微软雅黑", sizes[i], FontStyle.Bold);
|
// sizef = g.MeasureString(textWaterMark, font);
|
// if ((ushort)sizef.Width < (ushort)(width * widthPercent / 100))
|
// break;
|
// }
|
|
// //StringFormat strFormat = new StringFormat();
|
// //strFormat.Alignment = System.Drawing.StringAlignment.Center;
|
|
|
// //如果高度200,只添加一个水印
|
// if (height <= 200)
|
// {
|
// float xr = width / 2;
|
// float yr = height * 0.5f;
|
// float x0 = -sizef.Width / 2;
|
// float y0 = -sizef.Height / 2;
|
// g.ResetTransform();
|
// g.TranslateTransform(xr, yr);
|
// g.RotateTransform(30);
|
// g.DrawString(textWaterMark, font, brush, new PointF(x0, y0));
|
// }
|
|
// //如果高度在200-400之间,添加两个水印
|
// else if (height <= 400 && height > 200)
|
// {
|
// float[] ps = { 0.35f, 0.65f };
|
// for (int i = 0; i < ps.Length; i++)
|
// {
|
// float xr = width / 2;
|
// float yr = height * ps[i];
|
|
// float x0 = -sizef.Width / 2;
|
// float y0 = -sizef.Height / 2;
|
|
// g.ResetTransform();
|
// g.TranslateTransform(xr, yr);
|
// g.RotateTransform(30);
|
// g.DrawString(textWaterMark, font, brush, new PointF(x0, y0));
|
// }
|
// }
|
|
// //其他情况添加三个水印
|
// else
|
// {
|
// float[] ps = { 0.3f, 0.5f, 0.7f };
|
// for (int i = 0; i < ps.Length; i++)
|
// {
|
// float xr = width / 2;
|
// float yr = height * ps[i];
|
|
// float x0 = -sizef.Width / 2;
|
// float y0 = -sizef.Height / 2;
|
|
// g.ResetTransform();
|
// g.TranslateTransform(xr, yr);
|
// g.RotateTransform(30);
|
// g.DrawString(textWaterMark, font, brush, new PointF(x0, y0));
|
|
// }
|
// }
|
// }
|
|
// createStatus = null;
|
// return bmp;
|
// }
|
// catch (Exception ex)
|
// {
|
// createStatus = ex.Message;
|
// return imgSource;
|
// }
|
//}
|
|
//public static Image AddWaterMark(Image imgSource, Image imgWaterMark, ref string createStatus)
|
//{
|
// if (imgSource == null || imgWaterMark == null)
|
// return null;
|
// try
|
// {
|
// var source_image_width = imgSource.Width;
|
// var source_image_height = imgSource.Height;
|
// if (source_image_width < 200 || source_image_height < 60)
|
// {
|
// createStatus = "图片过小不需要添加水印";
|
// return imgSource;
|
// }
|
// if (source_image_width < imgWaterMark.Width || source_image_height < imgWaterMark.Height)
|
// {
|
// createStatus = "图片过小不需要添加水印";
|
// return imgSource;
|
// }
|
// //插入水印宽度和高度
|
// int water_mark_image_width = imgWaterMark.Width;
|
// int water_mark_image_height = imgWaterMark.Height ;
|
|
// //水印数量
|
// int water_image_number_x = (int)(source_image_width / (water_mark_image_width * 2.2));
|
// if (water_image_number_x < 0)
|
// water_image_number_x = 1;
|
// if (water_image_number_x > 3)
|
// water_image_number_x = 3;
|
|
// int water_image_number_y = (int)(source_image_height / (water_mark_image_height * 4.0));
|
// if (water_image_number_y < 0)
|
// water_image_number_y = 1;
|
// if (water_image_number_y > 3)
|
// water_image_number_y = 3;
|
|
// var bmp = new Bitmap(source_image_width, source_image_height);
|
// bmp.SetResolution(imgSource.HorizontalResolution, imgSource.VerticalResolution);
|
// using (Graphics g = Graphics.FromImage(bmp))
|
// {
|
// g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
|
// g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
// g.DrawImage(imgSource, new Rectangle(0, 0, source_image_width, source_image_height), 0, 0, source_image_width, source_image_height, GraphicsUnit.Pixel);
|
|
|
// //添加水印
|
// for (int i = 0; i < water_image_number_x; i++)
|
// {
|
// for (int j = 0; j < water_image_number_y; j++)
|
// {
|
// Rectangle rt1 = new Rectangle(
|
// source_image_width * (i + 1) / (water_image_number_x + 1) - water_mark_image_width / 2,
|
// source_image_height * (j + 1) / (water_image_number_y + 1) - water_mark_image_height / 2,
|
// water_mark_image_width, water_mark_image_height);
|
|
// g.DrawImage(imgWaterMark, rt1);
|
// }
|
// }
|
// }
|
|
// createStatus = null;
|
// return bmp;
|
// }
|
// catch (Exception ex)
|
// {
|
// createStatus = ex.Message;
|
// return imgSource;
|
// }
|
//}
|
|
|
#endregion
|
|
|
|
|
#region 给某个系列的文件夹都加上水印 代码备份
|
//产生系列文件夹的水印图片,为空就是所有系列文件的图片都会生产
|
//public List<string> CreateWaterMarkImage(string subFolder)
|
//{
|
// var color = Color.FromArgb(60, Color.Blue);
|
// string text = TProduct.GlobeParas.CorpName.ToString();
|
// string rootFolder = System.IO.Path.Combine(TProduct.GlobeParas.DataFolder, subFolder);
|
|
// List<string> statusInfo = new List<string>();
|
// CreateWaterMarkImage1(rootFolder, text, color, ref statusInfo);
|
|
// return statusInfo;
|
//}
|
|
|
//private void CreateWaterMarkImage1(string rootFolder, string text, Color color, ref List<string> statusInfo)
|
//{
|
// string[] dirs = Directory.GetDirectories(rootFolder);
|
// foreach (string dir in dirs)
|
// {
|
// CreateWaterMarkImage1(dir, text, color, ref statusInfo);
|
// }
|
|
|
// string[] files = Directory.GetFiles(rootFolder);
|
// foreach (string file in files)
|
// {
|
// try
|
// {
|
// var ext = Path.GetExtension(file);
|
// if (!ext.Contains("png"))
|
// {
|
// continue;
|
// }
|
// string watermarkImgPath = file.Replace(".png", "_wm.png");
|
// if (System.IO.File.Exists(watermarkImgPath))
|
// {
|
// System.IO.File.Delete(watermarkImgPath);
|
// }
|
// System.Drawing.Image imgage = System.Drawing.Image.FromFile(file);
|
// string createStatus = null;
|
// var iamge2 = TProduct.Common.ImageHelper.AddWaterMark(imgage, text, 8, color, ref createStatus);
|
// if (string.IsNullOrEmpty(createStatus) && iamge2 != null)
|
// {
|
// iamge2.Save(watermarkImgPath);
|
// iamge2.Dispose();
|
// }
|
// imgage.Dispose();
|
// }
|
// catch (Exception ex)
|
// {
|
// statusInfo.Add(string.Format("{0} 失败,原因:{1}", file, ex.Message));
|
// continue;
|
// }
|
|
// }
|
//}
|
|
|
|
#endregion
|
|
}
|
}
|