From 1a1c8e71fcd14858f595029f089b2d4a00202b32 Mon Sep 17 00:00:00 2001
From: ogi <Administrator@S-OGI-PC>
Date: Fri, 05 Dec 2025 09:24:16 +0900
Subject: [PATCH] プロジェクトファイルを追加。
---
HotelPms.Share.Windows/GraphicsApi/GdiPlus.cs | 175 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 175 insertions(+), 0 deletions(-)
diff --git a/HotelPms.Share.Windows/GraphicsApi/GdiPlus.cs b/HotelPms.Share.Windows/GraphicsApi/GdiPlus.cs
new file mode 100644
index 0000000..cf46b81
--- /dev/null
+++ b/HotelPms.Share.Windows/GraphicsApi/GdiPlus.cs
@@ -0,0 +1,175 @@
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Drawing.Imaging;
+
+namespace HotelPms.Share.Windows.GraphicsApi
+{
+ /// <summary>
+ /// UTF8中文转码
+ /// </summary>
+ public static class GdiPlus
+ {
+ /// <summary>
+ /// 等比缩放图片,画到目标区域
+ /// </summary>
+ /// <param name="g"></param>
+ /// <param name="img"></param>
+ /// <param name="tagRect"></param>
+ public static void DrawImage(Graphics g, Bitmap img, Rectangle tagRect)
+ {
+ int width = tagRect.Width;
+ int height = tagRect.Height;
+
+ //Zoom
+ if ((double)img.Width / (double)tagRect.Width < (double)img.Height / (double)tagRect.Height) // image is wider
+ {
+ //例1: img(w=100,h=100) → tag(w=10,h=5) w缩小10倍,h缩小20倍 → 全体缩小20倍 → w=5,h=5
+ width = (int)((double)img.Width / ((double)img.Height / (double)tagRect.Height));
+ }
+ else
+ {
+ //例2: img(w=100,h=100) → tag(w=100,h=500) w缩小1倍,h缩小0.5倍 → 全体缩小1倍 → w=100,h=100
+ height = (int)((double)img.Height / (double)img.Width * (double)tagRect.Width);
+ }
+
+ //居中
+ Rectangle imgRect = new Rectangle(tagRect.X, tagRect.Y, width, height);
+ ImageAttributes vAttr = new ImageAttributes();
+ vAttr.SetColorKey(img.GetPixel(0, 0), img.GetPixel(0, 0));
+ g.DrawImage(img, imgRect, 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, vAttr);
+ }
+
+ public static void FillRectangle(Graphics g, Color color, RectangleF rect)
+ {
+ bool newflag = color.IsSystemColor;
+ SolidBrush brush = newflag ? SystemBrushes.FromSystemColor(color) as SolidBrush : new SolidBrush(color);
+ g.FillRectangle(brush, rect);
+ if (!newflag) { brush.Dispose(); }
+ }
+
+ /// <summary>
+ /// 円角長方形
+ /// </summary>
+ /// <param name="g"></param>
+ /// <param name="pen"></param>
+ /// <param name="rect"></param>
+ /// <param name="cornerRadius"></param>
+ public static void DrawRoundRectangle(Graphics g, Pen pen, RectangleF rect, int cornerRadius)
+ {
+ using (GraphicsPath path = CreateRoundedRectanglePath(rect, cornerRadius))
+ {
+ g.SmoothingMode = SmoothingMode.AntiAlias; //使绘图质量最高,即消除锯齿
+ //g.InterpolationMode = InterpolationMode.HighQualityBicubic; //要らない!!!
+ //g.CompositingQuality = CompositingQuality.HighQuality; //要らない!!!
+ g.DrawPath(pen, path);
+ g.SmoothingMode = SmoothingMode.Default;
+ //g.InterpolationMode = InterpolationMode.Default; //要らない!!!
+ ///g.CompositingQuality = CompositingQuality.Default; //要らない!!!
+ }
+ }
+
+ /// <summary>
+ /// 円角長方形
+ /// </summary>
+ /// <param name="g"></param>
+ /// <param name="brush"></param>
+ /// <param name="rect"></param>
+ /// <param name="cornerRadius"></param>
+ public static void FillRoundRectangle(Graphics g, Brush brush, RectangleF rect, int cornerRadius)
+ {
+ using (GraphicsPath path = CreateRoundedRectanglePath(rect, cornerRadius))
+ {
+ g.SmoothingMode = SmoothingMode.AntiAlias; //使绘图质量最高,即消除锯齿
+ //g.InterpolationMode = InterpolationMode.HighQualityBicubic; //要らない!!!
+ //g.CompositingQuality = CompositingQuality.HighQuality; //要らない!!!
+ g.FillPath(brush, path);
+ g.SmoothingMode = SmoothingMode.Default;
+ //g.InterpolationMode = InterpolationMode.Default; //要らない!!!
+ //g.CompositingQuality = CompositingQuality.Default; //要らない!!!
+ }
+ }
+
+ /// <summary>
+ ///角丸長方形のGraphicsPathを作成します。
+ /// </summary>
+ /// <param name="rect">長方形</param>
+ /// <param name="radius">角丸の半径</param>
+ /// <param name="leftTop">左上は角丸:true 直角:false</param>
+ /// <param name="rightYop">右上は角丸:true 直角:false</param>
+ /// <param name="rightBottom">右下は角丸:true 直角:false</param>
+ /// <param name="leftBottom">左下は角丸:true 直角:false</param>
+ /// <returns></returns>
+ public static GraphicsPath GetRoundRect(RectangleF rect, float radius, bool leftTop, bool rightYop, bool rightBottom, bool leftBottom)
+ {
+ GraphicsPath path = new GraphicsPath();
+ path.StartFigure();
+
+ // 左上の角丸(※枠は正方形、枠の中心は円心)
+ if (leftTop) { path.AddArc(rect.Left, rect.Top, radius * 2, radius * 2, 180, 90); }
+
+ // 上の線
+ path.AddLine(rect.Left + (leftTop ? radius : 0), rect.Top, rect.Right - (rightYop ? radius : 0), rect.Top);
+
+ // 右上の角丸
+ if (rightYop) { path.AddArc(rect.Right - radius * 2, rect.Top, radius * 2, radius * 2, 270, 90); }
+
+ // 右の線
+ path.AddLine(rect.Right, rect.Top + (rightYop ? radius : 0), rect.Right, rect.Bottom - (rightBottom ? radius : 0));
+
+ // 右下の角丸
+ if (rightBottom) { path.AddArc(rect.Right - radius * 2, rect.Bottom - radius * 2, radius * 2, radius * 2, 0, 90); }
+
+ // 下の線
+ path.AddLine(rect.Right - (rightBottom ? radius : 0), rect.Bottom, rect.Left + (leftBottom ? radius : 0), rect.Bottom);
+
+ // 左下の角丸
+ if (leftBottom) { path.AddArc(rect.Left, rect.Bottom - radius * 2, radius * 2, radius * 2, 90, 90); }
+
+ // 左の線
+ path.AddLine(rect.Left, rect.Bottom - (leftBottom ? radius : 0), rect.Left, rect.Top + (leftTop ? radius : 0));
+
+ path.CloseFigure();
+ return path;
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="rect"></param>
+ /// <param name="cornerRadius">角丸の半径</param>
+ /// <returns></returns>
+ public static GraphicsPath CreateRoundedRectanglePath(RectangleF rect, int cornerRadius)
+ {
+ GraphicsPath Rect = new GraphicsPath();
+ Rect.StartFigure();
+ Rect.AddArc(rect.X, rect.Y, cornerRadius * 2, cornerRadius * 2, 180, 90);
+ Rect.AddArc(rect.X + rect.Width - cornerRadius * 2 - 1, rect.Y, cornerRadius * 2, cornerRadius * 2, -90, 90);
+ Rect.AddArc(rect.X + rect.Width - cornerRadius * 2 - 1, rect.Y + rect.Height - cornerRadius * 2 - 1, cornerRadius * 2, cornerRadius * 2, 0, 90);
+ Rect.AddArc(rect.X, rect.Bottom - cornerRadius * 2 - 1, cornerRadius * 2, cornerRadius * 2, 90, 90);
+ Rect.CloseFigure();
+ return Rect;
+ }
+
+ /// <summary>
+ /// 対象画像の目標領域より丸い画像を切り出し
+ /// </summary>
+ /// <param name="img">対象画像</param>
+ /// <param name="rec">対象画像の目標領域</param>
+ /// <param name="size">必要な画像サイズ</param>
+ /// <returns></returns>
+ public static Image CutEllipse(Image img, Rectangle rec, Size size)
+ {
+ Bitmap bitmap = new Bitmap(size.Width, size.Height);
+ using (Graphics g = Graphics.FromImage(bitmap))
+ {
+ using (TextureBrush br = new TextureBrush(img, System.Drawing.Drawing2D.WrapMode.Clamp, rec))
+ {
+ br.ScaleTransform(bitmap.Width / (float)rec.Width, bitmap.Height / (float)rec.Height);
+ g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
+ g.FillEllipse(br, new Rectangle(Point.Empty, size));
+ }
+ }
+ return bitmap;
+ }
+ }
+}
--
Gitblit v1.10.0