最近有个.net core的项目要绘制印章功能,一个公司印章,一个个人印章,于是抽了点时间自己写了一个,现在分享出来    

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Text; namespace DemoConsole
{
public class SealHelper
{
public static MechanismSealHelper Mechanism()
{
return new MechanismSealHelper();
}
public static PersonalSealHelper Personal()
{
return new PersonalSealHelper();
}
public class MechanismSealHelper : IDisposable
{
string star = "★";
int size = 160;
Image map;
Graphics g;
int defaultWidth;
float defaultStarSize;
float defaultTitleSize;
float defaultHorizontalSize;
float defaultChordSize; public Color Color { get; set; } = Color.Red;
public string DefaultFontName { get; set; } = "SimSun"; public MechanismSealHelper()
{
map = new Bitmap(size, size);
g = Graphics.FromImage(map);//实例化Graphics类
g.SmoothingMode = SmoothingMode.AntiAlias; //System.Drawing.Drawing2D;
g.Clear(Color.Transparent); defaultWidth = size / 40;
defaultStarSize = size / 5;
defaultTitleSize = (float)Math.Sqrt(size);
defaultHorizontalSize = (float)Math.Sqrt(size);
defaultChordSize = size / 20;
} /// <summary>
/// 绘制圆
/// </summary>
public void DrawCircle()
{
DrawCircle(defaultWidth);
}
/// <summary>
/// 绘制圆
/// </summary>
/// <param name="width">画笔粗细</param>
public void DrawCircle(int width)
{
Rectangle rect = new Rectangle(width, width, size - width * 2, size - width * 2);//设置圆的绘制区域
Pen pen = new Pen(Color, width); //设置画笔(颜色和粗细)
g.DrawEllipse(pen, rect); //绘制圆
}
/// <summary>
/// 绘制星星
/// </summary>
public void DrawStar()
{
DrawStar(defaultStarSize, defaultWidth);
}
/// <summary>
/// 绘制星星
/// </summary>
/// <param name="emSize"></param>
public void DrawStar(float emSize)
{
DrawStar(emSize, defaultWidth);
}
/// <summary>
/// 绘制星星
/// </summary>
/// <param name="emSize">字体大小</param>
/// <param name="width">画笔粗细</param>
public void DrawStar(float emSize, int width)
{
Font starFont = new Font(DefaultFontName, emSize, FontStyle.Bold);//设置星号的字体样式
var starSize = g.MeasureString(star, starFont);//对指定字符串进行测量
//要指定的位置绘制星号
PointF starXy = new PointF(size / 2 - starSize.Width / 2, size / 2 - starSize.Height / 2);
g.DrawString(star, starFont, new SolidBrush(Color), starXy);
} /// <summary>
/// 绘制主题
/// </summary>
/// <param name="title">主题(公司名称)</param>
/// <param name="startAngle">开始角度</param>
public void DrawTitle(string title, float startAngle = 160)
{
DrawTitle(title, startAngle, defaultTitleSize);
}
/// <summary>
/// 绘制主题
/// </summary>
/// <param name="title">主题(公司名称)</param>
/// <param name="startAngle">开始角度,必须是左半边,推荐(135-270)</param>
/// <param name="emSize">字体大小</param>
public void DrawTitle(string title, float startAngle, float emSize)
{
DrawTitle(title, startAngle, emSize, defaultWidth);
}
/// <summary>
/// 绘制主题
/// </summary>
/// <param name="title">主题(公司名称)</param>
/// <param name="startAngle">开始角度,必须是左半边,推荐(135-270)</param>
/// <param name="emSize">字体大小</param>
/// <param name="width">画笔粗细</param>
public void DrawTitle(string title, float startAngle, float emSize, int width)
{
Font font = new Font(DefaultFontName, emSize, FontStyle.Bold);
DrawTitle(title, startAngle, font, width);
}
/// <summary>
/// 绘制主题
/// </summary>
/// <param name="title">主题(公司名称)</param>
/// <param name="startAngle">开始角度,必须是左半边,推荐(135-270)</param>
/// <param name="font">字体</param>
/// <param name="width">画笔粗细</param>
public void DrawTitle(string title, float startAngle, Font font, int width)
{
if (string.IsNullOrEmpty(title))
{
return;
}
if (Math.Cos(startAngle / 180 * Math.PI) > 0)
{
throw new ArgumentException($"初始角度错误:{startAngle}(建议135-270)", nameof(startAngle));
} startAngle = startAngle % 360;//起始角度 var length = title.Length;
float changeAngle = (270 - startAngle) * 2 / length;//每个字所占的角度,也就是旋转角度
var circleWidth = size / 2 - width * 3;//字体圆形的长度
var fontSize = g.MeasureString(title, font);//测量一下字体
var per = fontSize.Width / length;//每个字体的长度 //在指定的角度绘制字符
void action(string t, float a)
{
var angleXy = a / 180 * Math.PI;
var x = size / 2 + Math.Cos(angleXy) * circleWidth;
var y = size / 2 + Math.Sin(angleXy) * circleWidth; DrawChar(t, (float)x, (float)y, a + 90, font, width);
} //起始绘制角度=起始角度+旋转角度/2-字体所占角度的一半
var angle = startAngle + changeAngle / 2 - (float)(Math.Asin(per / 2 / circleWidth) / Math.PI * 180);//起始绘制角度
for (var i = 0; i < length; i++)
{
action(title[i].ToString(), angle);
angle += changeAngle;
}
}
/// <summary>
/// 绘制横向文
/// </summary>
/// <param name="text">横向文</param>
public void DrawHorizontal(string text)
{
DrawHorizontal(text, defaultHorizontalSize);
}
/// <summary>
/// 绘制横向文
/// </summary>
/// <param name="text">横向文</param>
/// <param name="emSize">字体大小</param>
public void DrawHorizontal(string text, float emSize)
{
Font font = new Font(DefaultFontName, emSize, FontStyle.Bold);//定义字体的字体样式
DrawHorizontal(text, font);
}
/// <summary>
/// 绘制横向文
/// </summary>
/// <param name="text">横向文</param>
/// <param name="font">字体</param>
public void DrawHorizontal(string text, Font font)
{
int length = text.Length;
SizeF textSize = g.MeasureString(text, font);//对指定字符串进行测量
while (textSize.Width > size * 2 / 3)
{
DrawHorizontal(text, new Font(font.Name, font.Size - 1, font.Style));
return;
}
//要指定的位置绘制中间文字
PointF point = new PointF(size / 2 - textSize.Width / 2, size * 2 / 3); g.ResetTransform();
g.DrawString(text, font, new SolidBrush(Color), point);
} /// <summary>
/// 绘制下弦文
/// </summary>
/// <param name="text">下弦文</param>
/// <param name="startAngle">开始角度,必须是左下半边,推荐(90-180)</param>
public void DrawChord(string text, float startAngle = 135)
{
DrawChord(text, startAngle, defaultChordSize);
}
/// <summary>
/// 绘制下弦文
/// </summary>
/// <param name="text">下弦文</param>
/// <param name="startAngle">开始角度,必须是左下半边,推荐(90-180)</param>
/// <param name="emSize">字体大小</param>
public void DrawChord(string text, float startAngle, float emSize)
{
DrawChord(text, startAngle, emSize, defaultWidth);
}
/// <summary>
/// 绘制下弦文
/// </summary>
/// <param name="text">下弦文</param>
/// <param name="startAngle">开始角度,必须是左下半边,推荐(90-180)</param>
/// <param name="emSize">字体大小</param>
/// <param name="width">画笔粗细</param>
public void DrawChord(string text, float startAngle, float emSize, int width)
{
Font font = new Font(DefaultFontName, emSize, FontStyle.Bold);//定义字体的字体样式
DrawChord(text, startAngle, font, width);
}
/// <summary>
/// 绘制下弦文
/// </summary>
/// <param name="text">下弦文</param>
/// <param name="startAngle">开始角度,必须是左下半边,推荐(90-180)</param>
/// <param name="font">字体</param>
/// <param name="width">画笔粗细</param>
public void DrawChord(string text, float startAngle, Font font, int width)
{
if (string.IsNullOrEmpty(text))
{
return;
}
if (Math.Cos(startAngle / 180 * Math.PI) > 0)
{
throw new ArgumentException($"初始角度错误:{startAngle}(建议90-135)", nameof(startAngle));
} startAngle = startAngle % 360;//起始角度 var length = text.Length;
float changeAngle = (startAngle - 90) * 2 / length;//每个字所占的角度,也就是旋转角度
var fontSize = g.MeasureString(text, font);//测量一下字体
var per = fontSize.Width / length;//每个字体的长度
var circleWidth = size / 2 - width * 2 - fontSize.Height;//字体圆形的长度 //在指定的角度绘制字符
void action(string t, float a)
{
var angleXy = a / 180 * Math.PI;
var x = size / 2 + Math.Cos(angleXy) * circleWidth;
var y = size / 2 + Math.Sin(angleXy) * circleWidth; DrawChar(t, (float)x, (float)y, a - 90, font, width);
} //起始绘制角度=起始角度-旋转角度/2+字体所占角度的一半
var angle = startAngle - changeAngle / 2 + (float)(Math.Asin(per / 2 / circleWidth) / Math.PI * 180);//起始绘制角度
for (var i = 0; i < length; i++)
{
action(text[i].ToString(), angle);
angle -= changeAngle;
}
}
/// <summary>
/// 绘制单个字符
/// </summary>
/// <param name="char">字符</param>
/// <param name="x">距离画布左边的距离</param>
/// <param name="y">距离画布上边的距离</param>
/// <param name="emSize">字体大小</param>
/// <param name="width">画笔粗细</param>
public void DrawChar(string @char, float x, float y, float emSize)
{
DrawChar(@char, x, y, 0, emSize);
}
/// <summary>
/// 绘制单个字符
/// </summary>
/// <param name="char">字符</param>
/// <param name="x">距离画布左边的距离</param>
/// <param name="y">距离画布上边的距离</param>
/// <param name="angle">选中角度,0度为右方,顺时针增加</param>
/// <param name="emSize">字体大小</param>
/// <param name="width">画笔粗细</param>
public void DrawChar(string @char, float x, float y, float angle, float emSize)
{
DrawChar(@char, x, y, angle, emSize, defaultWidth);
}
/// <summary>
/// 绘制单个字符
/// </summary>
/// <param name="char">字符</param>
/// <param name="x">距离画布左边的距离</param>
/// <param name="y">距离画布上边的距离</param>
/// <param name="angle">选中角度,0度为右方,顺时针增加</param>
/// <param name="emSize">字体大小</param>
/// <param name="width">画笔粗细</param>
public void DrawChar(string @char, float x, float y, float angle, float emSize, int width)
{
Font font = new Font(DefaultFontName, emSize, FontStyle.Bold);
DrawChar(@char, x, y, angle, font, width);
}
/// <summary>
/// 绘制单个字符
/// </summary>
/// <param name="char">字符</param>
/// <param name="x">距离画布左边的距离</param>
/// <param name="y">距离画布上边的距离</param>
/// <param name="angle">选中角度,0度为右方,顺时针增加</param>
/// <param name="fontName">字体</param>
/// <param name="width">画笔粗细</param>
public void DrawChar(string @char, float x, float y, float angle, Font font, int width)
{
if (string.IsNullOrEmpty(@char) || @char.Length != 1)
{
throw new ArgumentException("only one char is supported", nameof(@char));
} g.ResetTransform();//重置
g.TranslateTransform(x, y);//调整偏移
g.RotateTransform(angle);//旋转角度
g.DrawString(@char, font, new SolidBrush(Color), 0, 0);//绘制,因为使用了偏移,所以这里的坐标是相对偏移的,所以是0
} /// <summary>
/// 保存图片
/// </summary>
/// <param name="fileName"></param>
public void Save(string fileName)
{
map.Save(fileName);
}
/// <summary>
/// 保存图片
/// </summary>
/// <param name="stream"></param>
/// <param name="format"></param>
public void Save(Stream stream, ImageFormat format)
{
map.Save(stream, format);
} public void Dispose()
{
try
{
if (map != null)
{
map.Dispose();
}
if (g != null)
{
g.Dispose();
}
}
catch { }
}
}
public class PersonalSealHelper : IDisposable
{
int size = 160;
Image map;
Graphics g;
int defaultWidth;
float defaultSquareSize;
float defaultNameSize;
bool isSquare = false; public Color Color { get; set; } = Color.Red;
public string DefaultFontName { get; set; } = "SimSun"; public PersonalSealHelper()
{
map = new Bitmap(size, size);
g = Graphics.FromImage(map);//实例化Graphics类
g.SmoothingMode = SmoothingMode.AntiAlias; //System.Drawing.Drawing2D;
g.Clear(Color.Transparent); defaultWidth = size / 40;
defaultSquareSize = size / 4;
defaultNameSize = size / 4;
} /// <summary>
/// 绘制方形之印
/// </summary>
public void DrawSquare()
{
DrawSquare(defaultSquareSize);
}
/// <summary>
/// 绘制方形之印
/// </summary>
/// <param name="emSize">字体大小</param>
public void DrawSquare(float emSize)
{
DrawSquare(emSize, defaultWidth);
}
/// <summary>
/// 绘制方形之印
/// </summary>
/// <param name="font">字体</param>
public void DrawSquare(Font font)
{
DrawSquare(font, defaultWidth);
}
/// <summary>
/// 绘制方形之印
/// </summary>
/// <param name="emSize">字体大小</param>
/// <param name="width">画笔粗细</param>
public void DrawSquare(float emSize, int width)
{
Font font = new Font(DefaultFontName, emSize, FontStyle.Bold);//设置之印的字体样式
DrawSquare(font, width);
}
/// <summary>
/// 绘制方形之印
/// </summary>
/// <param name="font">字体</param>
/// <param name="width">画笔粗细</param>
public void DrawSquare(Font font, int width)
{
isSquare = true; var pen = new Pen(Color, width);//设置画笔的颜色
Rectangle rect = new Rectangle(width, width, size - width * 2, size - width * 2);//设置绘制区域
g.DrawRectangle(pen, rect); var textSize = g.MeasureString("之印", font);//对指定字符串进行测量
var left = (size / 2 - width * 2 - textSize.Width / 2) / 2;
var perHeght = (size - width * 4 - textSize.Height * 2) / 3; PointF point1 = new PointF(left + width * 2, perHeght + width * 2);
g.DrawString("之", font, pen.Brush, point1); PointF point2 = new PointF(left + width * 2, perHeght * 2 + width * 2 + textSize.Height);
g.DrawString("印", font, pen.Brush, point2);
}
/// <summary>
/// 绘制带边框的姓名
/// </summary>
/// <param name="name">姓名</param>
public void DrawNameWithBorder(string name)
{
DrawNameWithBorder(name, defaultNameSize, defaultWidth);
}
/// <summary>
/// 绘制带边框的姓名
/// </summary>
/// <param name="name">姓名</param>
/// <param name="font">字体</param>
public void DrawNameWithBorder(string name, Font font)
{
DrawNameWithBorder(name, font, defaultWidth);
}
/// <summary>
/// 绘制带边框的姓名
/// </summary>
/// <param name="name">姓名</param>
/// <param name="emSize">字体大小</param>
public void DrawNameWithBorder(string name, float emSize)
{
DrawNameWithBorder(name, emSize, defaultWidth);
}
/// <summary>
/// 绘制带边框的姓名
/// </summary>
/// <param name="name">姓名</param>
/// <param name="emSize">字体大小</param>
/// <param name="width">画笔粗细</param>
public void DrawNameWithBorder(string name, float emSize, int width)
{
Font font = new Font(DefaultFontName, emSize, FontStyle.Bold);//设置字体样式
DrawNameWithBorder(name, font, width);
}
/// <summary>
/// 绘制带边框的姓名
/// </summary>
/// <param name="name">姓名</param>
/// <param name="font">字体</param>
/// <param name="width">画笔粗细</param>
public void DrawNameWithBorder(string name, Font font, int width)
{
var nameSize = g.MeasureString(name, font);//对指定字符串进行测量
while (nameSize.Width > size - width * 6)
{
DrawNameWithBorder(name, new Font(font.Name, font.Size - 1, font.Style), width);
return;
}
var left = (int)(size - nameSize.Width - width * 4) / 2;
var height = (int)(size - nameSize.Height - width * 4) / 2; var pen = new Pen(Color, width);//设置画笔的颜色
Rectangle rect = new Rectangle(width, height, size - width * 2, size - height * 2);//设置绘制区域
g.DrawRectangle(pen, rect); PointF point = new PointF(width + width * 2, height + width * 2);
g.DrawString(name, font, pen.Brush, point);
}
/// <summary>
/// 绘制带边框的姓名
/// </summary>
/// <param name="name">姓名</param>
public void DrawName(string name)
{
DrawName(name, defaultNameSize, defaultWidth);
}
/// <summary>
/// 绘制带边框的姓名
/// </summary>
/// <param name="name">姓名</param>
/// <param name="font">字体</param>
public void DrawName(string name, Font font)
{
DrawName(name, font, defaultWidth);
}
/// <summary>
/// 绘制带边框的姓名
/// </summary>
/// <param name="name">姓名</param>
/// <param name="emSize">字体大小</param>
public void DrawName(string name, float emSize)
{
DrawName(name, emSize, defaultWidth);
}
/// <summary>
/// 绘制带边框的姓名
/// </summary>
/// <param name="name">姓名</param>
/// <param name="emSize">字体大小</param>
/// <param name="width">画笔粗细</param>
public void DrawName(string name, float emSize, int width)
{
Font font = new Font(DefaultFontName, emSize, FontStyle.Bold);//设置字体样式
DrawName(name, font, width);
}
/// <summary>
/// 绘制姓名
/// </summary>
/// <param name="name">姓名</param>
/// <param name="font">字体</param>
/// <param name="width">画笔粗细</param>
public void DrawName(string name, Font font, int width)
{
var nameSize = g.MeasureString(name, font);//对指定字符串进行测量
while (nameSize.Width > size - width * 6)
{
DrawName(name, new Font(font.Name, font.Size - 1, font.Style), width);
return;
}
if (isSquare)
{
int length = name.Length;//获取字符串的长度
var left = (size / 2 - width - nameSize.Width / length) / 2;
var height = (size - width * 4 - nameSize.Height * length) / (length + 1);
if (left <= 0 || height <= 0)
{
return;
} for (var i = 0; i < length; i++)
{
PointF point = new PointF(width + size / 2, height * (i + 1) + width * 2 + nameSize.Height * i);
g.DrawString(name[i].ToString(), font, new SolidBrush(Color), point);
}
}
else
{
var left = (size - nameSize.Width) / 2;
var height = (size - nameSize.Height) / 2;
PointF point = new PointF(width, height);
g.DrawString(name, font, new SolidBrush(Color), point);
}
} /// <summary>
/// 保存图片
/// </summary>
/// <param name="fileName"></param>
public void Save(string fileName)
{
map.Save(fileName);
}
/// <summary>
/// 保存图片
/// </summary>
/// <param name="stream"></param>
/// <param name="format"></param>
public void Save(Stream stream, ImageFormat format)
{
map.Save(stream, format);
}
public void Dispose()
{
try
{
if (map != null)
{
map.Dispose();
}
if (g != null)
{
g.Dispose();
}
}
catch { }
}
}
}
}

  注意了,.net core没有System.Drawing,替代方案是使用第三方的依赖,这里推荐使用Nuget的System.Drawing.Common。

  另外,代码使用的是最新版本的C#,如果使用旧版本的可能会报错,相对于的调整一下就好了

  这个辅助类还能生成不同颜色和字体的印章,可随需求而变

  如果在Linux下发现中文乱码,那应该是没有安装相应的字体,可以将windows下的C:\Windows\Fonts的字体拷贝到linux对应目录下(Ubuntu是/usr/share/fonts),在安装,清空缓存,重启后就可以了

  生成公司印章:   

using System;
using System.Collections.Generic;
using System.IO;
using System.Text; namespace DemoConsole
{
class Program
{
static void Main(string[] args)
{
using (var helper = SealHelper.Mechanism())
{
helper.DrawCircle();//绘制圆
helper.DrawStar();//绘制星星
helper.DrawTitle("某某科技股份有限公司");//绘制公司名称
helper.DrawHorizontal("练习专用");//绘制横向文
helper.DrawChord("20191016094709");//绘制下弦文
helper.Save(Path.Combine(Directory.GetCurrentDirectory(), "公司印章.png"));
}
}
}
}

   生成的印章:

  

  生成个人印章:  

using System;
using System.Collections.Generic;
using System.IO;
using System.Text; namespace DemoConsole
{
class Program
{
static void Main(string[] args)
{
//绘制方形印章
using (var helper = SealHelper.Personal())
{
helper.DrawSquare();
helper.DrawName("张三");
helper.Save(Path.Combine(Directory.GetCurrentDirectory(), "张三.png"));
}
//绘制姓名带边框
using (var helper = SealHelper.Personal())
{
helper.DrawNameWithBorder("李四");
helper.Save(Path.Combine(Directory.GetCurrentDirectory(), "李四.png"));
}
//绘制姓名
using (var helper = SealHelper.Personal())
{
helper.DrawName("王五");
helper.Save(Path.Combine(Directory.GetCurrentDirectory(), "王五.png"));
}
}
}
}

  生成的印章:

       

C# 绘制印章的更多相关文章

  1. html5 canvas绘制圆形印章,以及与页面交互

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. HTML5印章绘制电子签章图片,中文英文椭圆章、中文英文椭圆印章

    原文:HTML5印章绘制电子签章图片,中文英文椭圆章.中文英文椭圆印章 电子签章图片采集 印章图片的采集两种互补方式: 方式1:在线生成印章图片方式,但是这种方式有个弊端,对印章中公司名称字数有限制, ...

  3. JavaScript和html5 canvas生成圆形印章

    代码: function createSeal(id,company,name){ var canvas = document.getElementById(id); var context = ca ...

  4. C# 在PDF中绘制动态图章

    我们知道,动态图章,因图章中的时间.日期可以动态的生成,因而具有较强的时效性.在本篇文章中将介绍通过C#编程在PDF中绘制动态图章的方法,该方法可自动获取当前系统登录用户名.日期及时间信息并生成图章. ...

  5. [转]JavaScript和html5 canvas生成圆形印章

    本文转自:http://www.cnblogs.com/dragondean/p/6013529.html 代码: function createSeal(id,company,name){ var ...

  6. C#如何在PDF文件添加图片印章

    文档中添加印章可以起一定的作用,比如,防止文件随意被使用,或者确保文档内容的安全性和权威性.C#添加图片印章其实也有很多实现方法,这里我使用的是免费的第三方软件Free Spire.PDF,向大家阐述 ...

  7. Java 处理PDF图章(印章)——图片图章、动态图章

    图章(印章)是一种在合同.票据.公文等文件中表明法律效应.部门机关权威的重要指示物,常见于各种格式的文件.文档中.对于纸质文档可以手动盖章,但对于电子文档,则需要通过特定的方法来实现.本篇文档分享通过 ...

  8. 探索canvas画布绘制技术

    图片来自KrzysztofBanaś 下面我们开始尝试研究不同的绘图风格和技术 - 边缘平滑,贝塞尔曲线,墨水和粉笔,笔和印章和图案 -等等.事实证明,网上没有太多关于此的内容.在下面的示例中,您请大 ...

  9. iOS可视化动态绘制连通图

    上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...

随机推荐

  1. 【Java 基础】Java日期格式问题

    1. Use SimpleDateFormat to format Date. Watch out, SDF is NOT THREAD-SAFE, it might not be important ...

  2. Java poi导出设置 Excel某些单元格不可编辑

    小白的总结,大神勿喷:需要转载请说明出处,如果有什么问题,欢迎留言 一.需求: 1.某一列 .某一行或某些单元格不可编辑,其他列可以编辑 二.期间遇到的问题 1.无法设置成不可编辑 2.设置为不可编辑 ...

  3. python自带性能强悍的标准库 itertools

    可迭代对象就像密闭容器里的水,有货倒不出 itertools是python内置的标准模块,提供了很多简洁又高效的专用功能,使用得当能够极大的简化代码行数,同时所有方法都是实现了生成器函数,这就意味着极 ...

  4. pipeline 步骤

    目录 一.简介 二.文件相关 删除当前目录 切换到目录 判断文件是否存在 判断是否为类Unix 返回当前目录 将内容写入文件 读取文件内容 二.制品相关 存取临时文件 三.命令相关 script sh ...

  5. Jenkins制品管理

    目录 一.简介 二.Jenkins管理制品 三.Nexus maven上传 jenkins上传 管理Docker镜像 管理raw 四.拷贝制品 五.版本号 Version Number 一.简介 制品 ...

  6. [BUUCTF]PWN——jarvisoj_fm

    jarvisoj_fm 附件 步骤: 例行检查,32位,开启了canary和nx保护 运行一下程序,看看大概的情况 32位ida载入,shift+f12检索程序里的字符串,看见了 " /bi ...

  7. 逻辑判断(Power Query 之 M 语言)

    逻辑真:true 逻辑假:false 与函数:and true and true,结果为TRUE true and false,结果为FALSE false and false,结果为FALSE 或函 ...

  8. 洛谷八月月赛 II T2 题解

    Content 现有 \(T\) 次询问. 每次询问给定一个长度为 \(n\) 的 01 串,记为 \(A\).回答应是一个字符串 \(B\),满足: \(B\) 是长度为 \(m\) 的 01 串. ...

  9. java 多线程 集合的包装方法Collections.synchronizedXXXXX;线程安全的集合类:Java.util.concurrent.ConcurrentXXX;java.util.concurrent.CopyOnWriteXXXX

    问题:ArrayList  等线程不安全 当多线程并发修改一个集合数据时,可能同一个下标位置被覆盖. 示例代码: 一个List,我们创建10个线程,每个线程往这个List中添加1000条数据,结果往往 ...

  10. javascript中的12种循环遍历方法

    1.for (自定义条件) 循环 let arr = [1,2,3]; for(let i =0;i<arr.length;i++){ console.log(i,arr[i]) } 2.for ...