Zi 字媒體
2017-07-25T20:27:27+00:00
C# 圖片(圖像/影像) 基礎(基本) 運算/處理
資料來源:
https://blog.csdn.net/qq_42170268/article/details/82259029
https://dotblogs.com.tw/ricochen/2009/12/07/12324
code:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lib
{
//https://blog.csdn.net/qq_42170268/article/details/82259029
//https://dotblogs.com.tw/ricochen/2009/12/07/12324
public class ImageCalc
{
public static Image MarkImage(Image img1, Image img2)//圖片浮水印
{
Image MergedImage = default(Image);
//設定背景圖片
Graphics gr = System.Drawing.Graphics.FromImage(img1);
//新建logo浮水印圖片
Bitmap Logo = new Bitmap(img2.Width, img2.Height);
Graphics tgr = Graphics.FromImage(Logo);
ColorMatrix cmatrix = new ColorMatrix();
//設定圖片色彩(透明度)
cmatrix.Matrix33 = 0.5F;
ImageAttributes imgattributes = new ImageAttributes();
imgattributes.SetColorMatrix(cmatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
tgr.DrawImage(img2, new Rectangle(0, 0, Logo.Width, Logo.Height), 0, 0, Logo.Width, Logo.Height, GraphicsUnit.Pixel, imgattributes);
tgr.Dispose();
//logo圖片位置
gr.DrawImage(Logo, img1.Width / 3, 10);
gr.Dispose();
MergedImage = img1;
return MergedImage;
}
public static Image VerticalMergeImages(Image img1, Image img2)//垂直合併
{
Image MergedImage = default(Image);
Int32 Wide = 0;
Int32 High = 0;
High = img1.Height + img2.Height;//設定高度
if (img1.Width >= img2.Width)
{
Wide = img1.Width;
}
else
{
Wide = img2.Width;
}
Bitmap mybmp = new Bitmap(Wide, High);
Graphics gr = Graphics.FromImage(mybmp);
//處理第一張圖片
gr.DrawImage(img1, 0, 0);
//處理第二張圖片
gr.DrawImage(img2, 0, img1.Height);
MergedImage = mybmp;
gr.Dispose();
return MergedImage;
}
public static Image HorizontalMergeImages(Image img1, Image img2)//水平合併
{
Image MergedImage = default(Image);
Int32 Wide = 0;
Int32 High = 0;
Wide = img1.Width + img2.Width;//設定寬度
if (img1.Height >= img2.Height)
{
High = img1.Height;
}
else
{
High = img2.Height;
}
Bitmap mybmp = new Bitmap(Wide, High);
Graphics gr = Graphics.FromImage(mybmp);
//處理第一張圖片
gr.DrawImage(img1, 0, 0);
//處理第二張圖片
gr.DrawImage(img2, img1.Width, 0);
MergedImage = mybmp;
gr.Dispose();
return MergedImage;
}
///
/// 背景透明化
///
/// 原圖
/// 圖片寬度
/// 圖片高度
///
public static Bitmap Conver_1(Bitmap img, int w, int h)
{
Bitmap bg = new Bitmap(w, h);
int alpha = 0;
Color demo;
Color pixel;
for (int x = 0; x < w; x++)
{
for (int y = 0; y < h; y++)
{
demo = img.GetPixel(1, 1);
pixel = img.GetPixel(x, y);
int R = demo.R;
int G = demo.G;
int B = demo.B;
int r1 = pixel.R;
int g1 = pixel.G;
int b1 = pixel.B;
int a = 40; //RGB誤差範圍
if (Math.Abs(R - r1) < a && Math.Abs(G - g1) < a && Math.Abs(B - b1) < a)
{
alpha = 0; //RGB在色差範圍內,透明度為0
}
else
{
alpha = 255;
}
bg.SetPixel(x, y, Color.FromArgb(alpha, r1, g1, b1));
}
}
return bg;
}
///
/// 指定顏色透明化
///
/// 原圖
/// 原圖寬度
/// 原圖高度
/// 指定顏色RGB的R值
/// 指定顏色RGB的G值
/// 指定顏色RGB的B值
///
public static Bitmap Conver_2(Bitmap img, int w, int h, int R, int G, int B)
{
Bitmap bg = new Bitmap(w, h);
int alpha = 0;
Color pixel;
for (int x = 0; x < w; x++)
{
for (int y = 0; y < h; y++)
{
pixel = img.GetPixel(x, y);
int r1 = pixel.R;
int g1 = pixel.G;
int b1 = pixel.B;
int a = 40; //色差範圍值
if (Math.Abs(R - r1) < a && Math.Abs(G - g1) < a && Math.Abs(B - b1) < a)
{
alpha = 0; //若兩種顏色比較接近,透明度設為0
}
else
{
alpha = 255;
}
bg.SetPixel(x, y, Color.FromArgb(alpha, r1, g1, b1));
}
}
return bg;
}
///
/// 指定顏色替換成另一種顏色
///
/// 原圖
/// 圖寬
/// 圖高
/// 要被替換顏色的RGB的R
/// 要被替換顏色的RGB的G
/// 要被替換顏色的RGB的B
/// 替換色的RGB的R
/// 替換色的RGB的G
/// 替換色的RGB的B
///
public static Bitmap Conver_3(Bitmap img, int w, int h, int R, int G, int B, int r, int g, int b)
{
Bitmap bg = new Bitmap(w, h);
Color pixel;
for (int x = 0; x < w; x++)
{
for (int y = 0; y < h; y++)
{
pixel = img.GetPixel(x, y);
int r1 = pixel.R;
int g1 = pixel.G;
int b1 = pixel.B;
int a = 40;
if (Math.Abs(R - r1) < a && Math.Abs(G - g1) < a && Math.Abs(B - b1) < a)
{
bg.SetPixel(x, y, Color.FromArgb(r, g, b));
}
else
{
bg.SetPixel(x, y, Color.FromArgb(r1, g1, b1));
}
}
}
return bg;
}
///
/// 圖片按比例縮放
///
/// 靶心圖表片
/// 縮放的比例
///
public static Image PictureHandle1(Image SourceImage, float a)
{
int W; //縮放後圖片的寬
int H; //縮放後圖片的高
W = (int)(a * SourceImage.Width);
H = (int)(a * SourceImage.Height);
try
{
ImageFormat format = SourceImage.RawFormat;
Bitmap SaveImage = new Bitmap(W, H);
Graphics g = Graphics.FromImage(SaveImage);
g.Clear(Color.White);
g.DrawImage(SourceImage, 0, 0, W, H);
SourceImage.Dispose();
return SaveImage;
}
catch (Exception e)
{
}
return null;
}
///
/// 圖片旋轉
///
/// 原圖
/// 旋轉後保存路徑
/// 旋轉角度
public static bool RotateImage(Image b, string savePath, float angle)
{
angle = angle % 360; //弧度轉換
double radian = angle * Math.PI / 180.0;
double cos = Math.Cos(radian);
double sin = Math.Sin(radian);
//原圖的寬和高
int w = b.Width;
int h = b.Height;
int W = (int)(Math.Max(Math.Abs(w * cos - h * sin), Math.Abs(w * cos + h * sin)));
int H = (int)(Math.Max(Math.Abs(w * sin - h * cos), Math.Abs(w * sin + h * cos)));
//目標點陣圖
Image dsImage = new Bitmap(W, H);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(dsImage);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//計算偏移量
Point Offset = new Point((W - w) / 2, (H - h) / 2);
//構造圖像顯示區域:讓圖像的中心與視窗的中心點一致
Rectangle rect = new Rectangle(Offset.X, Offset.Y, w, h);
Point center = new Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2);
g.TranslateTransform(center.X, center.Y);
g.RotateTransform(360 - angle);
//恢復圖像在水準和垂直方向的平移
g.TranslateTransform(-center.X, -center.Y);
g.DrawImage(b, rect);
//重至繪圖的所有變換
g.ResetTransform();
g.Save();
g.Dispose();
string extension = Path.GetExtension(savePath);
if (extension == ".jpg")
{
return false;//MessageBox.Show("圖片保存不是png格式,旋轉效果有誤!請重新選擇保存格式!");
}
else
{
dsImage.Save(savePath, ImageFormat.Png);
return true;//MessageBox.Show("圖片旋轉成功!");
}
}
///
/// 圖片更改透明度
///
/// 浮水印圖
/// 透明度值 0—255
///
public static Image ChangeAlpha(Image waterPic, int alpha)
{
Bitmap img = new Bitmap(waterPic);
using (Bitmap bmp = new Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
{
using (Graphics g = Graphics.FromImage(bmp))
{
g.DrawImage(img, 0, 0);
for (int h = 0; h < img.Height; h++)
{
for (int w = 0; w < img.Width; w++)
{
Color color = img.GetPixel(w, h);
bmp.SetPixel(w, h, Color.FromArgb(alpha, color.R, color.G, color.B));
}
}
return (Image)bmp.Clone();
}
}
}
///
/// 圖片添加文字
///
/// 範本路徑
/// 保存路徑
/// 文字內容
/// 字體
/// 字體顏色
/// 文字添加位置的起始座標X
/// 文字添加位置的起始座標Y
public static void templateAddText(string template, string savePath, string text, Font font, Color color, int x, int y)
{
Image image = Image.FromFile(template);
Bitmap bt = new Bitmap(image, image.Width, image.Height);
Graphics g = Graphics.FromImage(bt);
Font f = font;
Brush b = new SolidBrush(color);
g.DrawString(text, f, b, x, y);
string extension = Path.GetExtension(savePath);
if (extension == ".jpg")
{
bt.Save(savePath, ImageFormat.Jpeg);
}
else
{
bt.Save(savePath, ImageFormat.Png);
}
}
///
/// 圖片添加小圖
///
/// 範本圖路徑
/// 小圖路徑
/// 保存路徑
/// 小圖添加位置起始座標X
/// 小圖添加位置起始座標Y
public static void TemplateAddPicture(string template, string pic, string savePath, int x, int y)
{
Image image = Image.FromFile(template);
Bitmap bt = new Bitmap(image, image.Width, image.Height);
Image picture = Image.FromFile(pic);
Bitmap small = new Bitmap(picture, picture.Width, picture.Height);
Graphics g = Graphics.FromImage(bt);
g.DrawImage(small, x, y, picture.Width, picture.Height);
string extension = Path.GetExtension(savePath);
if (extension == ".jpg")
{
bt.Save(savePath, ImageFormat.Jpeg);
}
else
{
bt.Save(savePath, ImageFormat.Png);
}
}
///
/// 橫向合併兩張圖片
///
/// 左圖檔的路徑
/// 右圖的檔路徑
/// 合成圖片保存路徑
public static bool H_merge(string pic1, string pic2, string savePath)
{
Image img1 = Image.FromFile(pic1);
Image img2 = Image.FromFile(pic2);
Bitmap L = new Bitmap(img1, img1.Width, img1.Height);
Bitmap R = new Bitmap(img2, img2.Width, img2.Height);
if (img2.Height == img1.Height)
{
Bitmap bg = new Bitmap(img1.Width + img2.Width, img1.Height);
Graphics g = Graphics.FromImage(bg);
g.DrawImage(L, 0, 0, img1.Width, img1.Height);
g.DrawImage(R, img1.Width, 0, img2.Width, img2.Height);
g.Dispose();
string extension = Path.GetExtension(savePath);
if (extension == ".jpg")
{
bg.Save(savePath, ImageFormat.Jpeg);
}
else
{
bg.Save(savePath, ImageFormat.Png);
}
return true;//MessageBox.Show("圖片合成成功!");
}
else
{
return false;//MessageBox.Show("兩張圖片的高度不一致,請重新選擇!");
}
}
///
/// 縱向合併兩張圖片
///
/// 上圖檔的路徑
/// 下圖的檔路徑
/// 合成圖片保存路徑
public static bool Z_merge(string pic1, string pic2, string savePath)
{
Image img1 = Image.FromFile(pic1);
Image img2 = Image.FromFile(pic2);
Bitmap L = new Bitmap(img1, img1.Width, img1.Height);
Bitmap R = new Bitmap(img2, img2.Width, img2.Height);
if (img2.Width == img1.Width)
{
Bitmap bg = new Bitmap(img1.Width, img1.Height + img2.Height);
Graphics g = Graphics.FromImage(bg);
g.DrawImage(L, 0, 0, img1.Width, img1.Height);
g.DrawImage(R, 0, img1.Height, img2.Width, img2.Height);
g.Dispose();
string extension = Path.GetExtension(savePath);
if (extension == ".jpg")
{
bg.Save(savePath, ImageFormat.Jpeg);
}
else
{
bg.Save(savePath, ImageFormat.Png);
}
return true;//MessageBox.Show("圖片合成成功!");
}
else
{
return false;//MessageBox.Show("兩張圖片的寬度不一致,請重新選擇!");
}
}
///
/// 圖片切割
///
/// 原圖路徑
/// 切割圖保存路徑
/// 切割起始位置的座標X
/// 切割起始位置的座標Y
/// 切割寬度
/// 切割高度
public static void pic_cut(string template, string savePath, int x, int y, int w, int h)
{
Image image = Image.FromFile(template);
Bitmap b = new Bitmap(image, image.Width, image.Height);
Bitmap bmpOut = new Bitmap(w, h, PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(bmpOut);
g.DrawImage(b, new Rectangle(0, 0, w, h), new Rectangle(x, y, w, h), GraphicsUnit.Pixel);
g.Dispose();
string extension = Path.GetExtension(savePath);
if (extension == ".jpg")
{
bmpOut.Save(savePath, ImageFormat.Jpeg);
}
else
{
bmpOut.Save(savePath, ImageFormat.Png);
}
}
}
}
寫了
5860316篇文章,獲得
23313次喜歡