-
2020-06-22 10:18:58
手写签字并保存图片
网上找了点现成的代码,又自己改了下...(前人方法)首先新建一个PPSSignatureView继承GLKView
然后再使用的时候,创建一个继承GLKViewController的控制器,这里是关键,避免入坑,UIView addSubView的时候, glkView是无法显示的...
简单说,代码如下:
.h文件
#import <UIKit/UIKit.h> #import <GLKit/GLKit.h> @interface PPSSignatureView : GLKView @property (nonatomic, strong) GLKBaseEffect *effect; @property (nonatomic, assign) CGFloat colorR; @property (nonatomic, assign) CGFloat colorG; @property (nonatomic, assign) CGFloat colorB; @property (nonatomic, assign) CGFloat alpha; @property (nonatomic, assign) float maxFontSize; @property (assign, nonatomic) UIColor *strokeColor; @property (assign, nonatomic) BOOL hasSignature; @property (strong, nonatomic) UIImage *signatureImage; @property (nonatomic, strong) NSMutableArray *pointMArray; /** 清除所有线条*/ - (void)erase; @end
.m文件
#import "PPSSignatureView.h" #import <OpenGLES/ES2/glext.h> #define STROKE_WIDTH_MIN 0.004 // Stroke width determined by touch velocity #define STROKE_WIDTH_SMOOTHING 0.3 // Low pass filter alpha #define VELOCITY_CLAMP_MIN 20 #define VELOCITY_CLAMP_MAX 5000 #define QUADRATIC_DISTANCE_TOLERANCE 3.0 // Minimum distance to make a curve #define MAXIMUM_VERTECES 100000 static GLKVector3 StrokeColor = { 0, 0, 0 }; static float clearColor[4] = { 1, 1, 1, 0 }; // Vertex structure containing 3D point and color struct PPSSignaturePoint { GLKVector3 vertex; GLKVector3 color; }; typedef struct PPSSignaturePoint PPSSignaturePoint; // Maximum verteces in signature static const int maxLength = MAXIMUM_VERTECES; // Append vertex to array buffer static inline void addVertex(uint *length, PPSSignaturePoint v) { if ((*length) >= maxLength) { return; } GLvoid *data = glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES); memcpy(data + sizeof(PPSSignaturePoint) * (*length), &v, sizeof(PPSSignaturePoint)); glUnmapBufferOES(GL_ARRAY_BUFFER); (*length)++; } static inline CGPoint QuadraticPointInCurve(CGPoint start, CGPoint end, CGPoint controlPoint, float percent) { double a = pow((1.0 - percent), 2.0); double b = 2.0 * percent * (1.0 - percent); double c = pow(percent, 2.0); return (CGPoint) { a * start.x + b * controlPoint.x + c * end.x, a * start.y + b * controlPoint.y + c * end.y }; } static float generateRandom(float from, float to) { return random() % 10000 / 10000.0 * (to - from) + from; } static float clamp(float min, float max, float value) { return fmaxf(min, fminf(max, value)); } // Find perpendicular vector from two other vectors to compute triangle strip around line static GLKVector3 perpendicular(PPSSignaturePoint p1, PPSSignaturePoint p2) { GLKVector3 ret; ret.x = p2.vertex.y - p1.vertex.y; ret.y = -1 * (p2.vertex.x - p1.vertex.x); ret.z = 0; return ret; } static PPSSignaturePoint ViewPointToGL(CGPoint viewPoint, CGRect bounds, GLKVector3 color) { return (PPSSignaturePoint) { { (viewPoint.x / bounds.size.width * 2.0 - 1), ((viewPoint.y / bounds.size.height) * 2.0 - 1) * -1, 0 }, color }; } @interface PPSSignatureView () { // OpenGL state EAGLContext *context; GLuint vertexArray; GLuint vertexBuffer; GLuint dotsArray; GLuint dotsBuffer; // Array of verteces, with current length PPSSignaturePoint SignatureVertexData[maxLength]; uint length; PPSSignaturePoint SignatureDotsData[maxLength]; uint dotsLength; // Width of line at current and previous vertex float penThickness; float previousThickness; // Previous points for quadratic bezier computations CGPoint previousPoint; CGPoint previousMidPoint; PPSSignaturePoint previousVertex; PPSSignaturePoint currentVelocity; } @property (nonatomic, strong) NSMutableArray *drawPointArray; @end @implementation PPSSignatureView - (NSMutableArray *)pointMArray { if(nil == _pointMArray) { _pointMArray = [NSMutableArray array]; } return _pointMArray; } - (void)commonInit { context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; if (context) { time(NULL); self.backgroundColor = [UIColor whiteColor]; self.opaque = NO; self.context = context; self.drawableDepthFormat = GLKViewDrawableDepthFormat24; self.enableSetNeedsDisplay = YES; // Turn on antialiasing self.drawableMultisample = GLKViewDrawableMultisample4X; [self setupGL]; // Capture touches UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; pan.maximumNumberOfTouches = pan.minimumNumberOfTouches = 1; pan.cancelsTouchesInView = YES; [self addGestureRecognizer:pan]; // For dotting your i's UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)]; tap.cancelsTouchesInView = YES; [self addGestureRecognizer:tap]; #warning 这个地方是长按删除的操作 // Erase with long press UILongPressGestureRecognizer *longer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)]; longer.cancelsTouchesInView = YES; [self addGestureRecognizer:longer]; } else [NSException raise:@"NSOpenGLES2ContextException" format:@"Failed to create OpenGL ES2 context"]; } - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super initWithCoder:aDecoder]) [self commonInit]; return self; } - (id)initWithFrame:(CGRect)frame context:(EAGLContext *)ctx { if (self = [super initWithFrame:frame context:ctx]) [self commonInit]; return self; } - (void)dealloc { [self tearDownGL]; if ([EAGLContext currentContext] == context) { [EAGLContext setCurrentContext:nil]; } context = nil; } - (void)drawRect:(CGRect)rect { // 清空当前所有颜色缓存 glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]); glClear(GL_COLOR_BUFFER_BIT); [self.effect prepareToDraw]; // Drawing of signature lines if (length > 2) { glBindVertexArrayOES(vertexArray); glDrawArrays(GL_TRIANGLE_STRIP, 0, length); } if (dotsLength > 0) { glBindVertexArrayOES(dotsArray); glDrawArrays(GL_TRIANGLE_STRIP, 0, dotsLength); } } #warning 清除的操作 - (void)erase { length = 0; dotsLength = 0; self.hasSignature = NO; [self setNeedsDisplay]; } - (UIImage *)signatureImage { if (!self.hasSignature) return nil; // self.hidden = YES; // // self.strokeColor = [UIColor whiteColor]; // [self setNeedsDisplay]; UIImage *screenshot = [self snapshot]; // self.strokeColor = nil; // // self.hidden = NO; return screenshot; } #pragma mark - Gesture Recognizers - (void)tap:(UITapGestureRecognizer *)t { CGPoint l = [t locationInView:self]; if (t.state == UIGestureRecognizerStateRecognized) { glBindBuffer(GL_ARRAY_BUFFER, dotsBuffer); PPSSignaturePoint touchPoint = ViewPointToGL(l, self.bounds, (GLKVector3){1, 1, 1}); addVertex(&dotsLength, touchPoint); PPSSignaturePoint centerPoint = touchPoint; centerPoint.color = StrokeColor; addVertex(&dotsLength, centerPoint); static int segments = 20; GLKVector2 radius = (GLKVector2){ clamp(0.00001, 0.02, penThickness * generateRandom(0.5, 1.5)), clamp(0.00001, 0.02, penThickness * generateRandom(0.5, 1.5)) }; GLKVector2 velocityRadius = radius; float angle = 0; for (int i = 0; i <= segments; i++) { PPSSignaturePoint p = centerPoint; p.vertex.x += velocityRadius.x * cosf(angle); p.vertex.y += velocityRadius.y * sinf(angle); addVertex(&dotsLength, p); addVertex(&dotsLength, centerPoint); angle += M_PI * 2.0 / segments; } addVertex(&dotsLength, touchPoint); glBindBuffer(GL_ARRAY_BUFFER, 0); } [self setNeedsDisplay]; } - (void)longPress:(UILongPressGestureRecognizer *)lp { [self erase]; } - (void)pan:(UIPanGestureRecognizer *)p { glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); CGPoint v = [p velocityInView:self]; CGPoint l = [p locationInView:self]; //[self.drawPointArray addObject:]; currentVelocity = ViewPointToGL(v, self.bounds, (GLKVector3){0,0,0}); float distance = 0.; if (previousPoint.x > 0) { distance = sqrtf((l.x - previousPoint.x) * (l.x - previousPoint.x) + (l.y - previousPoint.y) * (l.y - previousPoint.y)); } float velocityMagnitude = sqrtf(v.x*v.x + v.y*v.y); float clampedVelocityMagnitude = clamp(VELOCITY_CLAMP_MIN, VELOCITY_CLAMP_MAX, velocityMagnitude); float normalizedVelocity = (clampedVelocityMagnitude - VELOCITY_CLAMP_MIN) / (VELOCITY_CLAMP_MAX - VELOCITY_CLAMP_MIN); float lowPassFilterAlpha = STROKE_WIDTH_SMOOTHING; float newThickness = (self.maxFontSize - STROKE_WIDTH_MIN) * (1 - normalizedVelocity) + STROKE_WIDTH_MIN; penThickness = penThickness * lowPassFilterAlpha + newThickness * (1 - lowPassFilterAlpha); if ([p state] == UIGestureRecognizerStateBegan) { previousPoint = l; previousMidPoint = l; PPSSignaturePoint startPoint = ViewPointToGL(l, self.bounds, (GLKVector3){1, 1, 1}); previousVertex = startPoint; previousThickness = penThickness; addVertex(&length, startPoint); addVertex(&length, previousVertex); self.hasSignature = YES; } else if ([p state] == UIGestureRecognizerStateChanged) { CGPoint mid = CGPointMake((l.x + previousPoint.x) / 2.0, (l.y + previousPoint.y) / 2.0); if (distance > QUADRATIC_DISTANCE_TOLERANCE) { // Plot quadratic bezier instead of line unsigned int i; int segments = (int) distance / 1.5; float startPenThickness = previousThickness; float endPenThickness = penThickness; previousThickness = penThickness; for (i = 0; i < segments; i++) { penThickness = startPenThickness + ((endPenThickness - startPenThickness) / segments) * i; CGPoint quadPoint = QuadraticPointInCurve(previousMidPoint, mid, previousPoint, (float)i / (float)(segments)); PPSSignaturePoint v = ViewPointToGL(quadPoint, self.bounds, StrokeColor); [self addTriangleStripPointsForPrevious:previousVertex next:v]; previousVertex = v; } } else if (distance > 1.0) { PPSSignaturePoint v = ViewPointToGL(l, self.bounds, StrokeColor); [self addTriangleStripPointsForPrevious:previousVertex next:v]; previousVertex = v; previousThickness = penThickness; } previousPoint = l; previousMidPoint = mid; } else if (p.state == UIGestureRecognizerStateEnded | p.state == UIGestureRecognizerStateCancelled) { PPSSignaturePoint v = ViewPointToGL(l, self.bounds, (GLKVector3){1, 1, 1}); addVertex(&length, v); previousVertex = v; addVertex(&length, previousVertex); } [self setNeedsDisplay]; } - (void)setStrokeColor:(UIColor *)strokeColor { _strokeColor = strokeColor; [self updateStrokeColor]; } #pragma mark - Private - (void)updateStrokeColor { self.effect.constantColor = GLKVector4Make(_colorR, _colorG, _colorB, _alpha); } - (void)setBackgroundColor:(UIColor *)backgroundColor { [super setBackgroundColor:backgroundColor]; CGFloat red, green, blue, alpha, white; if ([backgroundColor getRed:&red green:&green blue:&blue alpha:&alpha]) { clearColor[0] = red; clearColor[1] = green; clearColor[2] = blue; } else if ([backgroundColor getWhite:&white alpha:&alpha]) { clearColor[0] = white; clearColor[1] = white; clearColor[2] = white; } } - (void)bindShaderAttributes { glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(PPSSignaturePoint), 0); // glEnableVertexAttribArray(GLKVertexAttribColor); // glVertexAttribPointer(GLKVertexAttribColor, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (char *)12); } - (void)setupGL { [EAGLContext setCurrentContext:context]; self.effect = [[GLKBaseEffect alloc] init]; [self updateStrokeColor]; glDisable(GL_DEPTH_TEST); // Signature Lines glGenVertexArraysOES(1, &vertexArray); glBindVertexArrayOES(vertexArray); glGenBuffers(1, &vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(SignatureVertexData), SignatureVertexData, GL_DYNAMIC_DRAW); [self bindShaderAttributes]; // Signature Dots glGenVertexArraysOES(1, &dotsArray); glBindVertexArrayOES(dotsArray); glGenBuffers(1, &dotsBuffer); glBindBuffer(GL_ARRAY_BUFFER, dotsBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(SignatureDotsData), SignatureDotsData, GL_DYNAMIC_DRAW); [self bindShaderAttributes]; glBindVertexArrayOES(0); // Perspective GLKMatrix4 ortho = GLKMatrix4MakeOrtho(-1, 1, -1, 1, 0.1f, 2.0f); self.effect.transform.projectionMatrix = ortho; GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -1.0f); self.effect.transform.modelviewMatrix = modelViewMatrix; length = 0; penThickness = 0.003; previousPoint = CGPointMake(-100, -100); } - (void)addTriangleStripPointsForPrevious:(PPSSignaturePoint)previous next:(PPSSignaturePoint)next { float toTravel = penThickness / 2.0; for (int i = 0; i < 2; i++) { GLKVector3 p = perpendicular(previous, next); GLKVector3 p1 = next.vertex; GLKVector3 ref = GLKVector3Add(p1, p); float distance = GLKVector3Distance(p1, ref); float difX = p1.x - ref.x; float difY = p1.y - ref.y; float ratio = -1.0 * (toTravel / distance); difX = difX * ratio; difY = difY * ratio; PPSSignaturePoint stripPoint = { { p1.x + difX, p1.y + difY, 0.0 }, StrokeColor }; addVertex(&length, stripPoint); toTravel *= -1; } } - (void)tearDownGL { [EAGLContext setCurrentContext:context]; glDeleteVertexArraysOES(1, &vertexArray); glDeleteBuffers(1, &vertexBuffer); glDeleteVertexArraysOES(1, &dotsArray); glDeleteBuffers(1, &dotsBuffer); self.effect = nil; } @end
更多相关内容 -
冯杰的手写艺术签名怎么写好看
2021-01-12 20:05:11在这种时候,想要一个与众不同的签名,可以从自己名字的笔画入手,加一点连笔和草书,或者将部分的笔画夸张化,达到某种美的直观感受。 比如普通的名字“冯杰”,这时候把“冯”这个字的的上面的笔画加以夸张化,...导读:今天来给大家分享【冯杰的手写艺术签名怎么写好看】有叫这个名字的人可以来看看了!
一、学习签名首先是要决定是写在哪些地方;
(1)用在普通的场合,想要一个比较独特的签名;
在这种时候,想要一个与众不同的签名,可以从自己名字的笔画入手,加一点连笔和草书,或者将部分的笔画夸张化,达到某种美的直观感受。
比如普通的名字“冯杰”,这时候把“冯”这个字的的上面的笔画加以夸张化,连笔增多,看上去就比较好。
(2)用在比较正式的场合,签名端正让人印象深刻。
在这种时候其实不是很赞同用很夸张的笔触去写,比较赞同凸显出笔锋,这时候用水性笔写较好。 比如:杨潇潇
(3)特别想要把签名写好,可以随时的写出来,要求很漂亮。
这个要求比较高,需要经过比较长时间的练习。当然,还有必不可少的一些小技巧,比如写完后在字上加以描边,把笔锋描得细腻等等。
二、决定好以后要有一个专门的训练加强。
(1)笔画的架子
这个是要经过长期的训练形成的。现在大多数人认为楷体过于简单不好看而不去练楷体,但是楷体是一个用来练笔画的架子的好字体,建议每天拿出点时间来进行临摹和练习,只有将架子搭的好看,字体本身才能好看。
(2)笔锋
笔锋在硬笔里并不是特别着重,但是确实是很能影响一个字的美观程度。一个单调的笔画,不管架子多好看都是不好字,更不是好签名。
要练习笔锋,还是建议多临摹软笔书法的每一个比划结构,就是“逆锋起笔,回锋收笔”。
(3)笔画的灵便,随意变化性。
这就需要去学习其他的字体,特别是英语字体。这里推荐圆体,因为圆体的笔画很好看,很灵活,而且用于中文也同样适合。
三、注意事项
练好签名绝不是一朝一夕就可以的,比较扎实的书写基础才能让你随心所欲的写出好签名。
如果真的是非常想要拥有好签名,可以找人设计然后临摹。
笔的选择同样重要,但是具体是要自己去研究,毕竟适合个人的不一样。
文章来源:超简单签名设计一笔签 -
姓名签名设计手写简单自己名字怎么写
2020-11-28 13:01:21导读:很多人都在寻找【姓名签名设计手写简单自己名字怎么写】的方法,其实,这是非常简单的一件事,小学生肯定是不行的,但是只要你肯努力是什么都不会难道你的,要相信自己,网上也有很多免费的,也是可以试试的吗...导读:很多人都在寻找【姓名签名设计手写简单自己名字怎么写】的方法,其实,这是非常简单的一件事,小学生肯定是不行的,但是只要你肯努力是什么都不会难道你的,要相信自己,网上也有很多免费的,也是可以试试的吗。
说起这个姓名签名,大家都会想到那种飘逸,挥洒自如的感觉,但是很少有人能做到的,当然,有些名字和字是不允许那样去写的,如果你经常给人写签名你就知道了。
其实设计签名,其实就是一个把自己名字连笔,然后在简化的过程。具体最终能做到哪种程度,这就需要看设计老师的水平了。
设计签名和写字也一样,每个人经历的不同,所以,写出来的签名也是不一样的。
我就见过很多设计大师的作品,好的东西我都会留下学习,然后融入给大家手写签名之中。
这也是一种简单学习的过程,所以。想要练好签名,不单单死练习就行了,还需要多看多去学习,发现美的所在,这样,你才会越来越优秀的。
好了,可能介绍的有些啰嗦了。现在来看看一些手写简单的签名设计图片吧。
以上就是三秒签名网给大家分享的内容,大家是否喜欢呢,好了,就介绍到这来了,大家拜拜! -
数码知识:钉钉手写签名如何设置开启手写签名教程
2020-12-30 08:40:58如今使用IT数码设备的小伙伴们是越来越多了,那么IT数码设备当中是有很多小技巧的,这些技巧很多小伙伴一般都是不知道如何来实用的,就好比最近就有很多小伙伴们想要知道钉钉手写签名如何设置开启手写签名教程,那么...如今使用IT数码设备的小伙伴们是越来越多了,那么IT数码设备当中是有很多小技巧的,这些技巧很多小伙伴一般都是不知道如何来实用的,就好比最近就有很多小伙伴们想要知道钉钉手写签名如何设置开启手写签名教程,那么既然现在大家对于钉钉手写签名如何设置开启手写签名教程都感兴趣,小编就来给大家分享下关于钉钉手写签名如何设置开启手写签名教程的一些信息吧。
1、手机端:【工作台】-【智能填表】-【新建】-【添加】-【手写签名】
2、电脑端:左侧任务栏点击【工作】-【智能填表】-【创建】或者选择现有的模板-左侧选择手写签名
【温馨提示】:
1、针对之前已创建好的表单,可以通过手机端/电脑端-【工作台】-【智能填表】-【统计】-找到对应的表单-【…】-【修改表单】即可添加【手写签名】功能;
2、表单创建者还可以将手写签名设置是否必填、标题、签名方式(若选择【可使用上次签名】,选择后就不需要每次都重新签名),
注:本文适用于钉钉V5.1.31版本。
-
Android屏幕手写签名的实现-详细篇
2020-08-03 15:12:22老规矩先看一下效果图 【实现思路】 (1)创建画笔 private void init(Context context) { this.mContext = context;... //设置签名笔画样式 mGesturePaint.setStyle(Paint.Style.STROKE); //设置笔画宽度 -
教我怎么写连笔字签名胡彦清
2021-01-17 13:45:13在这种时候,想要一个与众不同的签名,可以从自己名字的笔画入手,加一点连笔和草书,或者将部分的笔画夸张化,达到某种美的直观感受。 比如普通的名字“胡彦清”,这时候把“胡”这个字的的上面的笔画加以夸张化,... -
Word文档电子版“手写签名”!替代手写直接打印
2021-04-18 11:25:44保存签名 签名,我们现在就已经制作好了。下面教大家保存签名,以便日后随时调出使用。 单击图片,选择签名,进入「文件」-「选项」-「校对」,点击右侧的「自动更正选项」按钮,在「替换」框中输入一个快捷短语,... -
CAD手写签名是如何实现的?
2021-02-23 23:27:02可以在网上找、也可以用PS做一张、或者自己在纸上手写,然后拍下来。注意,如果是手写拍照,一定要保证照片中的字体足够大,足够清晰。愚者这里采用的就是手写拍照的方式,但由于愚者的字过于狂草,所以这里从网上找... -
如何在PDF文档中添加手写签名?
2020-08-25 16:45:33方式2:可以用纸笔写好之后手机拍照为图片保存。 2、在PDF中添加签名 这里我们需要用到PDF编辑器,比如用极速PDF编辑器打开需要添加图章的文档,在添加之前我们需要先将上一步中保存的图片签名转成PDF格式,直接将... -
你竟然还不知道在微信上就可以手写签名、签文件了~
2020-12-20 12:31:03原标题:你竟然还不知道在微信上就可以手写签名、签...为大家推荐一款可以在微信上传送文件,原笔迹手写签字的小程序——好签,只需三步,随时随地轻松签名。1.用小程序打开文件:「好签」小程序支持 3 种导入文件的... -
一笔一划教你写一签名
2020-11-22 21:39:22首语:很多人都想可以有人把自己的名字可以找到【一笔一划教你写一签名】的...这样估计在你学习自己签名的时候,就会更加方便和有效了。 虽然不能亲自给你们做示范,但是有视频在我想大家都是聪明人一定会自己学会的。 -
Android中手写签名的实现
2018-06-06 09:14:45前言本来这篇文章应该很早就发出来了,因为最近一直在忙项目,直到现在才发出来。...自己参考资料写了一个SignatureView继承View,实现签名public class SignatureView extends View { // View state pr... -
签名设计手写简单
2020-11-22 21:27:20其次是说到简单,其实写签名就是要让名字变得简单,好写,这样才会让人感觉,舒畅。 但是不是什么字都能被写的简单的,这需要考虑一个文字的笔画多少程度,举个例子“饕餮”这两个字就不好去做简化。 像,明啊,等啊... -
签名设计一笔教写过程
2020-12-19 23:13:25导读:签名设计一笔教写过程,以前发文章都是图片,今天学会往网站上加视频了,所以想要学习【签名设计一笔教写过程】详细解说的,可以来看看视频效果了。而且也还有图片的,所以很是方便的。大家可以尽情的看看了。... -
对于手写签名生成图片储存和回显的实现
2017-08-16 10:00:01对于网页上手写签名 获取图片 储存和回显的实现 -
[系统安全] 二十.PE数字签名之(上)什么是数字签名及Signtool签名工具详解
2021-02-07 17:15:31本文将详细介绍什么是数字签名,并采用Signtool工具对EXE文件进行签名,后续深入分析数字签名的格式及PE病毒内容。这些基础性知识不仅和系统安全相关,同样与我们身边常用的软件、文档、操作系统紧密联系,希望这些... -
基于vue使用canvas实现移动端手写签名!
2020-09-20 16:53:10之前自己开发有这么一个需求,需要实现手写签名,然后以图片的形式保存生成图片的base64数据流 。自己在网上找了一堆,都不是很完美。然后参考网上的加自己的优化和修改做了一版。希望有需要的朋友可以拿来直接用。 ... -
邮件个性签名大全_邮件的经典个性签名模板
2021-06-26 07:27:46我们每个人都需要这样的励志句子作为个性签名激励自己,那么下面一起来看看学习啦小编为大家精心推荐的邮件个性签名,希望能够对您有所帮助。邮件个性签名【热门篇】1. 毅力可以征服任何一座高峰。2. 不经历风雨,怎... -
Android手写签名 附带加载pdf合同 及可拖动签名(二)
2018-06-11 15:59:39可以正常加载1.9a版本的pdf文件,签名(我没用这个版本自带的)可拖动,悬浮按钮,pdf的盖章签名的保存,当然这个demo是我随便写的 ,随便看看就好,可根据自己的需求做出相应的修改。下面是预览图: 集成步骤也很... -
OutLook邮件中设计添加个性签名
2022-04-04 11:00:12新建一个电子邮件,并且在邮件正文内容中设计自己签名模板内容。 2.2、设计签名 在新建的邮件内容里面设计邮件的签名内容: 注意:我们除了可以自己设计外,更便捷的方式是可以从微软官网获取签名模板来... -
白纸不够白,签名照片还需要ps去除背景?Python大法半完美解决电子签名背景问题(20行代码去除签名背景)
2020-05-24 20:19:38毕业季又来了,今年受疫情影响,毕业答辩基本都在网上进行。...由于受到纸张、光线和手机等外部环境的影响,并不是每个人都有完美的条件拍出比较好的签名照片。本文主要是利用python来对签名背景去除,提取签名照片。 -
Android手写签名 附带加载pdf合同 及可拖动签名
2018-05-29 10:45:28注:打不开,异常问题Cannot open document 是因为6.0+的权限没有配置,要么自己动态申请下,要么换成6.0以下系统的测试机就好了 然后我就说一下不同的地方吧 在该基础之上做了些修改。gif做残了,不太清楚,凑合看... -
邮箱个人签名 邮箱个人签名模板
2021-06-26 07:29:481、好友之间祝福语风儿吹过,纷扬我的思念,小雨洒落,浸润我的牵挂,雷声哄响,共鸣所有的记忆,想你了,我的朋友,无论你身处何方,都祝愿你天天开心,幸福无限,常联系!...还好有你这个朋友陪在身... -
抖音签名大全2020最新版-抖音个性签名男生女生-抖音个性签名霸气-腾牛个性网
2021-01-17 12:45:41写给2021的霸气微信签名 2021最经典的霸气签名2020马上就要成为过去式了,2021对自己有什么展望和目标了,一组写给2021的霸气签名送给大家。(10)人喜欢2020-12-31抖音最火霸气签名简短 喜欢你没有以后今天到头很多人... -
PS和AI矢量电子签名制作(详细)
2020-07-10 22:18:14调整好角度,Ctrl+Shift+S另存为PNG格式图片,此时已经做好了电子签名,可以在word中使用了。 但是我想复制到word中可以直接使用,不需要再去调整大小,接下来就需要到AI中制作矢量图片了。 4、在AI中制作矢量签名 ... -
如何对pdf电子文档进行手写签名
2016-05-26 18:20:34在某些情况下,我们可能需要对某一份电子pdf文档进行手写签名,通常的做法是将文档打印出来,签好名字后再扫描回去,费时费力费费金钱,略显麻烦。事实上,我们用Adobe Acrobat就可以签名了。这里不建议使用Adobe ... -
【电子签名】如何使用Adobe Acrobat Pro DC给PDF文件添加自己的电子签名、选项勾选和日期填写
2022-03-16 10:35:30如何使用Adobe Acrobat Pro DC给PDF文件添加自己的电子签名、选项勾选和日期填写 -
手写签名插件—jSignature使用心得
2017-12-27 16:44:04最近需要做一个移动端手写签名的功能,上网搜了一下基本都是jSignature这个插件,几乎没得第二选择,于是照着网上的各个版本copy测试,在PC端测试是没什么问题的,很easy。 问题1::在移动端改变了canvas的父盒子... -
聚合签名,门限签名
2021-04-12 22:59:10聚合签名:将多个签名聚合成一个 门限签名:也称多重签名,m of n门限签名,即任意m个用户聚在一起可以恢复出secret,任意少于m...一篇很好的介绍门限签名的文章!门限签名介绍 <后续有好的文章会继续补充> ... -
Android 微信支付遇到的相关坑点-签名失败
2022-03-24 10:23:19// 应用ID (可本地写死,也可服务器返回) request.appId = PayConstants.WX_APP_ID; // 商户号 (可本地写死,也可服务器返回) request.partnerId = PayConstants.WX_APP_MICID; // 预支付交易会话ID