请问ps路径工具相对于画笔工具而言的最大优势是什么?

感觉路径工具主要不是直接的进行画图,而是先画路径边缘,再填充,

而画笔工具是直接作图。
好像路径工具相比画笔工具,并没有很大的优势啊?

1个回答

这个问题回答不了啊,本来PS就只是随便用用,路径也不怎么接触。
但是有一点值得一提,PS的强大毋庸置疑,路径工具的水有多深题主可自行百度谷歌相关精深内容,知乎上也有非常漂亮的答案。
Adobe公司,确实了得!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
请问ps中的路径工具就是钢笔工具吗?
路径工具在ps用得多吗,主要用在哪些方面呢, 平时一般好像直接使用画笔与矩形工具,用钢笔工具挺少。
ps中只能用钢笔画路径,而不能用画笔画路径吗?
感觉在ps中,好像只能用ps的钢笔画路径,而且钢笔画的自动默认为路径。 画笔能画路径吗?
mfc画笔绘制的路径运用反色重新删除
运用mfc画笔,绘制了一条红色rgb(255,0,0)的路线,又重新用反色rgb (0,255,255)绘制了一遍,但是并没有消除之前的路线,只是单纯的路径颜色变成了rgb(0,255,255 ``` CClientDC dc(this); CPen penNew; penNew.CreatePen(PS_SOLID, 4, RGB(255,0,0)); CPen* Old = dc.SelectObject(&penNew); m=way[i]; n=way[j]; dc.MoveTo(xx[m],yy[m]); dc.LineTo(xx[n],yy[n]); ; dc.SetROP2(R2_NOTCOPYPEN); m=way[i]; n=way[j]; dc.MoveTo(xx[m],yy[m]); dc.LineTo(xx[n],yy[n]); ```)
ps画笔笔尖的样式,直径硬度,画笔的翻转,角度与圆度都需要了解吗?
ps的画笔笔尖样式比较多,而且直径,翻转,角度,圆度也多。 这些都需要了解吗?
问一个UI画板的问题【类似windows自带的画图工具】
打算使用一个UI工具做一个画板工具(类似于window自带的画图工具),实现以下2个功能: 1、画笔工具,使用画笔工具可以画出任意曲线。(这一条会做,关键是第二条) 2、橡皮擦工具,使用橡皮擦工具可以擦除已经画出的曲线。 注意:画板的背景是透明色。 想问一下,橡皮擦工具怎么做呢?有人告诉我说,可以把橡皮擦的颜色设置为透明色,来覆盖已经画好的曲线,这样就能达到橡皮擦工具的效果,但是实际验证不可用( **因为透明色的RGBA值未知,无法设定** )。 **想知道一般网络上的画图软件的橡皮擦工具是怎么做到擦除效果的?** 希望知道的大神不吝赐教,鞠躬感谢!
怎么动态的设置画笔颜色?
现在有二进制的数组,或者十六进制的数组,请问应该怎么设置画笔颜色,让接收到的动态数值表示颜色的不同,从而画出彩色图像
C#创建画笔时由CustomStartCap,CustomEndCap,DashPattern三个参数抛出了ArgumentException异常,线段无法画出来,请问是怎么回事?
![图片说明](https://img-ask.csdn.net/upload/201912/04/1575469024_766962.png)![图片说明](https://img-ask.csdn.net/upload/201912/04/1575469032_49664.png) C#创建画笔时由CustomStartCap,CustomEndCap,DashPattern三个参数抛出了ArgumentException异常,线段无法画出来
请问画笔中模式中的溶解就是边缘比较柔和吗?
请问画笔中模式中的溶解就是边缘比较柔和吗, 这个是不是就是画笔的硬度与软度啊?
【小白求助】安卓opencv用分类器对人脸进行识别的一些问题
小白入门,最近在看opencv的人脸识别(分类) 然后按照网上的代码,学习了之后,自己写了一段,发现运行的时候会卡很久,甚至直接退出,并且越用越卡。 我想实现的是对一张图片进行读入,然后加载多个分类器对图片内容进行识别,从而达到分类的目的。 我那个问题困扰了我一天,想来求助大神 我加载人脸识别的模型没问题,但是同时加载两个模型,比如说人脸和上身,就会卡死。 代码分3个部分,分别是MainActivity.java , execDetect.java , Detector.java 以下是MainActivity.java ``` package com.RinGo.IMGfenlei; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageButton; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import org.opencv.android.Utils; import org.opencv.core.Mat; import org.opencv.core.MatOfRect; import org.opencv.core.Rect; import org.opencv.core.Scalar; import org.opencv.imgproc.Imgproc; import org.opencv.objdetect.CascadeClassifier; public class MainActivity extends AppCompatActivity { private Detector frontfaceDetector; private Detector smileDetector; private static String CAMERAIMAGENAME = "image.jpg"; private ImageButton imageButton; private ImageButton imageButton2; private TextView textView; private Bitmap bitmap; private Bitmap rectBitmap; private Bitmap resizeBitmap; private Toast toast; private Button addFile; private Button startDetect; private Button check; private execDetect toDetcet; private String show; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.tv_face); // imageButton = (ImageButton) findViewById(R.id.iv_face); //imageButton.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL); // imageButton2 = (ImageButton) findViewById(R.id.iv_face2); // imageButton2.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL); toDetcet=new execDetect(); addFile=(Button)findViewById(R.id.addPic); startDetect=(Button)findViewById(R.id.startDetect); check=(Button)findViewById(R.id.check); startDetect.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // startDetect.setClickable(false); textView.setText("正在检测"); // detect(); Thread d =new Thread(new Runnable() { @Override public void run() { toDetcet.initExecDetect(MainActivity.this,bitmap); // Toast.makeText(MainActivity.this, "initialize succeed", Toast.LENGTH_SHORT).show(); show= toDetcet.startDetect(); // Toast.makeText(MainActivity.this, " succeed", Toast.LENGTH_SHORT).show(); } }); d.run(); textView.setText(show); // startDetect.setClickable(true); } }); check.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // startDetect.setClickable(false); textView.setText(toDetcet.getReturntoMain()); // startDetect.setClickable(true); } }); addFile.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 添加照片 // 打开本地相册 Intent intent1 = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent1, 101); //startActivity(intent1); } }); String strLibraryName = "opencv_java3"; // 不需要添加前缀 libopencv_java3 { try { Log.e("loadLibrary", strLibraryName); System.loadLibrary(strLibraryName); //System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // couldn't find "libopencv_java320.so" } catch (UnsatisfiedLinkError e) { Log.e("loadLibrary", "Native code library failed to load.\n" + e); } catch (Exception e) { Log.e("loadLibrary", "Exception: " + e); } } // frontfaceDetector = new Detector(this, R.raw.haarcascade_frontalface_alt, 6, 0.2F, 0.2F, new Scalar(255, 0, 0, 255)); } /** * 点击添加照片事件 * * @param v */ public void onClick(View v) { int bt_id = v.getId(); switch (bt_id) { /* case R.id.takePhoto: // 拍照 // 打开本地相机 Intent intent2 = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), CAMERAIMAGENAME)); intent2.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent2, 102); break; */ case R.id.back: this.finish(); break; default: break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 加判断 不选择照片或者不拍照时不闪退 //Log.e("data", String.valueOf(data)); //if (data == null) //return; bitmap = null; switch (requestCode) { // 选择图片库的图片 case 101: if (resultCode == RESULT_OK) { try { Uri uri = data.getData(); bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); } catch (Exception e) { e.printStackTrace(); } } break; // 表示调用本地照相机拍照 case 102: if (resultCode == RESULT_OK) { //Bundle bundle = data.getExtras(); //bm = (Bitmap) bundle.get("data"); bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/" + CAMERAIMAGENAME); } break; default: break; } Log.e("bitmap", String.valueOf(bitmap)); if (bitmap == null) { toast = Toast.makeText(MainActivity.this, "未选择图像", Toast.LENGTH_SHORT); toast.show(); return; } // 识别图片 并画框 /* Thread detect=new Thread(new Runnable() { @Override public void run() { } }); detect.run(); */ // 将照片剪裁 bitmap将被释放重新赋值 //int ibWidth = imageButton.getWidth(); // int ibHeight = imageButton.getHeight(); //resizeBitmap = imageButton.resizeBitmap(bitmap, ibWidth, ibHeight); //imageButton.setBitmap(resizeBitmap); //imageButton2.setBitmap(rectBitmap); } private void detect() { MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { toDetcet.initExecDetect(MainActivity.this,bitmap); // Toast.makeText(MainActivity.this, "initialize succeed", Toast.LENGTH_SHORT).show(); String show= toDetcet.startDetect(); // Toast.makeText(MainActivity.this, " succeed", Toast.LENGTH_SHORT).show(); textView.setText(show); } }); //textView.setText(toDetcet.getReturntoMain()); } } ``` 以下是activity_main.xml ``` <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/tv_face" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="16dp" android:text="未检测到人脸" android:textColor="@color/colorAccent" app:layout_constraintBottom_toTopOf="@+id/ll1" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" /> <LinearLayout android:id="@+id/ll1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent"> <com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton android:id="@+id/addPic" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="5dp" android:layout_weight="1" android:onClick="onClick" android:text=" 选择图片(CV) " android:textSize="16sp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" /> <com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton android:id="@+id/startDetect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="5dp" android:layout_weight="1" android:onClick="onClick" android:text=" 开始识别 " android:textSize="16sp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" /> <com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton android:id="@+id/check" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="5dp" android:layout_weight="1" android:onClick="onClick" android:text=" 结果 " android:textSize="16sp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" /> <com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton android:id="@+id/back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="0dp" android:layout_weight="1" android:onClick="onClick" android:text=" 返回 " android:textSize="16sp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" /> </LinearLayout> </LinearLayout> ``` 以下是execDetect.java ``` package com.RinGo.IMGfenlei; import android.content.Context; import android.graphics.Bitmap; import android.util.Log; import org.opencv.android.Utils; import org.opencv.core.Mat; import org.opencv.core.MatOfRect; import org.opencv.core.Rect; import org.opencv.core.Scalar; import org.opencv.imgproc.Imgproc; import org.opencv.objdetect.CascadeClassifier; import com.RinGo.IMGfenlei.R; import com.RinGo.IMGfenlei.Detector; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; public class execDetect { private Detector frontfaceDetector; private Detector smilefaceDetector; private Detector[] detectors=new Detector[10]; private Detector detector; private Bitmap bitmap; private Bitmap rectBitmap; private String returntoMain=""; private String[] detectorNames=new String[10]; private CascadeClassifier mFrontalFaceClassifier = null; //正脸 级联分类器 private CascadeClassifier mProfileFaceClassifier = null; //侧脸 级联分类器 private int smilefacenum=0; private Context mcontext; private int[] cascades=new int[10]; public void initExecDetect(Context _context,Bitmap _bitmap) { bitmap=_bitmap; mcontext=_context; cascades[0]=R.raw.haarcascade_frontalface_alt; detectors[0] = new Detector(_context,R.raw.haarcascade_frontalface_alt, 1, 0.2F, 0.2F, new Scalar(255, 0, 0, 255)); detectorNames[0]="正面人脸"; cascades[1]=R.raw.lbpcascade_frontalface; detectors[1] = new Detector(_context,R.raw.lbpcascade_frontalface, 1, 0.2F, 0.2F, new Scalar(255, 0, 0, 255)); detectorNames[1]="正面人脸2"; } public String startDetect() { // bitmapToMat Mat toMat = new Mat(); Utils.bitmapToMat(bitmap, toMat); // Mat copyMat = new Mat(); // toMat.copyTo(copyMat); // 复制 // togray Mat gray = new Mat(); MatOfRect mRect = new MatOfRect(); Imgproc.cvtColor(toMat, gray, Imgproc.COLOR_RGBA2GRAY); for (int id = 0; id < detectors.length; id++) { //detector = new Detector(mcontext,cascades[id], 3, 0.1F, 0.1F, new Scalar(255, 0, 0, 255)); try { int num = 0; mRect=new MatOfRect(); Rect[] object = detectors[id].detectObjectImage( gray, mRect); Log.e("objectLength", object.length + ""); num=object.length; /* for (Rect rect : object) { num++; } */ returntoMain =returntoMain+ String.format("检测到%1$d个" + detectorNames[id], num) + "\n"; } catch (Exception e) { e.printStackTrace(); } //textView.setText(String.format("检测到%1$d个人脸", facenum)); //Utils.matToBitmap(toMat, bitmap); } return returntoMain; } public String getReturntoMain() { return returntoMain; } } ``` 以下是Detector.java,定义了我的级联分类器的设置 ``` package com.RinGo.IMGfenlei; import android.content.Context; import org.opencv.core.Mat; import org.opencv.core.MatOfRect; import org.opencv.core.Rect; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.objdetect.CascadeClassifier; import org.opencv.objdetect.Objdetect; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; /** * Created by think-hxr on 17-10-12. */ public class Detector { private CascadeClassifier mCascadeClassifier; private int mMinNeighbors; private float mRelativeObjectWidth; private float mRelativeObjectHeight; private Scalar mRectColor; /** * 构造方法 * * @param context 上下文 * @param id 级联分类器ID * @param minNeighbors 连续几帧确认目标 * @param relativeObjectWidth 最小宽度屏占比 * @param relativeObjectHeight 最小高度屏占比 * @param rectColor 画笔颜色 */ public Detector(Context context, int id, int minNeighbors, float relativeObjectWidth, float relativeObjectHeight, Scalar rectColor) { context = context.getApplicationContext(); mCascadeClassifier = createDetector(context, id); mMinNeighbors = minNeighbors; mRelativeObjectWidth = relativeObjectWidth; mRelativeObjectHeight = relativeObjectHeight; mRectColor = rectColor; } /** * 创建检测器 * * @param context 上下文 * @param id 级联分类器ID * @return 检测器 */ private CascadeClassifier createDetector(Context context, int id) { CascadeClassifier javaDetector; InputStream is = null; FileOutputStream os = null; try { is = context.getResources().openRawResource(id); File cascadeDir = context.getDir("cascade", Context.MODE_PRIVATE); File cascadeFile = new File(cascadeDir, id + ".xml"); os = new FileOutputStream(cascadeFile); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = is.read(buffer)) != -1) { os.write(buffer, 0, bytesRead); } javaDetector = new CascadeClassifier(cascadeFile.getAbsolutePath()); //javaDetector=new CascadeClassifier(); // javaDetector.load(cascadeFile.getAbsolutePath()); if (javaDetector.empty()) { javaDetector = null; } boolean delete = cascadeDir.delete(); return javaDetector; } catch (IOException e) { e.printStackTrace(); return null; } finally { try { if (null != is) { is.close(); } if (null != os) { os.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * 目标检测 视频 * * @param gray 灰度图像 * @param object 识别结果的容器 * @return 检测到的目标位置集合 */ public Rect[] detectObject(Mat gray, MatOfRect object) { // 使用Java人脸检测 mCascadeClassifier.detectMultiScale( gray, // 要检查的灰度图像 object, // 检测到的人脸 1.1, // 表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%; mMinNeighbors, // 默认是3 控制误检测,表示默认几次重叠检测到人脸,才认为人脸存在 Objdetect.CASCADE_SCALE_IMAGE, getSize(gray, mRelativeObjectWidth, mRelativeObjectHeight), // 目标最小可能的大小 gray.size()); // 目标最大可能的大小 return object.toArray(); } /** * 目标检测 图片 * * @param gray 灰度图像 * @param object 识别结果的容器 * @return */ public Rect[] detectObjectImage(Mat gray, MatOfRect object) { mCascadeClassifier.detectMultiScale(gray,object); return object.toArray(); } /** * 根据屏占比获取大小 * * @param gray gray * @param relativeObjectWidth 最小宽度屏占比 * @param relativeObjectHeight 最小高度屏占比 * @return 大小 */ private Size getSize(Mat gray, float relativeObjectWidth, float relativeObjectHeight) { Size size = gray.size(); int cameraWidth = gray.cols(); int cameraHeight = gray.rows(); int width = Math.round(cameraWidth * relativeObjectWidth); int height = Math.round(cameraHeight * relativeObjectHeight); size.width = 0 >= width ? 0 : (cameraWidth < width ? cameraWidth : width); // width [0, cameraWidth] size.height = 0 >= height ? 0 : (cameraHeight < height ? cameraHeight : height); // height [0, cameraHeight] return size; } /** * 获取画笔颜色 * * @return 颜色 */ public Scalar getRectColor() { return mRectColor; } } ```
Android Canvas绘制的Path ,如何高效的拆分成两个线段?
如题: 1.通过贝塞尔曲线绘制了一条很长的线段。 2.通过设置画笔的Mode.DST.OUT 将线断进行了擦断效果(但是实际坐标没有变化) 3.现在需要将擦断的两个线断进行分别移动。 现在如果擦除的时候橡皮擦碰见了绘制的像素点,那么可以进行擦除。(但是线断会产生比较大的长短变化)如果没有碰见像素点,那么不会产生擦除效果。 我当前的手段: 1.将橡皮擦轨迹存储为Region 。将线段轨迹也存储为Region 2.通过region.quickReject(region1) 判断两个轨迹是否有相交。 3.遍历线段轨迹的坐标(x,y)是否在橡皮擦Region之中。有就删除,没有就跳过。 4.通过删除,将存储线段坐标的数组,拆分成多个数组。 现在的问题是: 如果擦除时没有碰见线段中的实际节点,将无法进行擦除。 而手机中绘制速度很快时,坐标点于点之间间距较高。 请问这种情况时,该如何判断? 或者有其他更好的判断和拆分手段么?
屏幕画笔 的js 怎么获得呢
屏幕画笔 的js 怎么获得呢,就是能够在手机上画画的那种,求给个详细的解答,谢谢
C# PPT 墨迹工具插件,放映模式下,画一个按钮点击启动墨迹工具
PPT 放映模式下,画一个图标,点击启动墨迹工具(一个画笔工具),不需要右击选择!!!
2015flashcc 画笔工具出现的问题,有大神能提供详细的解决办法吗
![图片说明](https://img-ask.csdn.net/upload/201605/10/1462866066_113775.png)
关于java画图获取画笔的问题
我用Graphics g=getGraphics()获取画笔,却报错说g指向空,这时为什么啊![图片说明](https://img-ask.csdn.net/upload/201611/26/1480153009_954456.png)
用freetype转换字符串成位图数据问题?
这是我的转化代码,转换出来的效果图: ![图片说明](https://img-ask.csdn.net/upload/202001/22/1579661860_266102.png) 我是转换一个字符串:HELLO,但是为什么最后成了两个,而且宽和高似乎都给成了两倍,以下是代码,请大神分析下下面的代码有问题吗?如何修改 ``` static int GetBitmap( char* szFontFile, wchar_t* swText, int ulLen, int nFontSize, int nSpace, BITMAP_S *stBitmap) { FT_Library ftLib = NULL; FT_Face ftFace = NULL; FT_Error ftError = 0; FT_Bitmap ftBitmap; FT_BitmapGlyph ftBmpGlyph; FT_Glyph ftGlyph; FT_GlyphSlot ftGlyphslot; int i, j, k, temp; int start_x = 0, start_y = 0; int nChHeight = 0, nChWidth = 0, nTextWidth = 0; size_t size = 0; unsigned char** pTextAlpha = NULL; int BgHeight = nFontSize + 5; /* 背景图形的高度,这个高度要大于字体的高度,所以是+5 */ ftError = FT_Init_FreeType(&ftLib); if (ftError) { printf("FT_Init_FreeType() Failed!\n"); ftLib = 0; return -1; } printf("========fontfile=%s\n", szFontFile); ftError = FT_New_Face(ftLib, szFontFile, 0, &ftFace); /*if (ftError == FT_Err_Unknown_File_Format) { printf("FT_New_Face() Failed! FT_Err_Unknown_File_Format\n"); return -2; } else */if (ftError) { printf("FT_New_Face() Failed %d! Other Error!\n", ftError); return -3; } pTextAlpha = (uint8_t**)malloc(sizeof(uint8_t*)*BgHeight); //分配内存,用于存储字体背景的数据 if (NULL == pTextAlpha) { printf("malloc() Failed!\n"); return -1; } for (i=0; i < BgHeight; i++) { pTextAlpha[i] = (uint8_t*)malloc(sizeof(uint8_t)*1); //为背景图的每一行分配内存 if (NULL == pTextAlpha[i]) { printf("malloc() Failed! %d\n", i); return -1; } } ftError = FT_Select_Charmap(ftFace, FT_ENCODING_UNICODE); //设置字体的编码方式 if (ftError) { printf("FT_Select_Charmap() Failed! error=%d\n", ftError); return ftError; } ftError = FT_Set_Pixel_Sizes(ftFace, 0, nFontSize); //设置字体大小 if (ftError) { printf("FT_Set_Pixel_Sizes() Failed! error=%d\n",ftError); return ftError; } uint8_t *data; ftGlyphslot = ftFace->glyph; printf("======================ulen = %d\n", ulLen); for (temp = 0; temp < ulLen; temp++) { printf("#######################swText[%d]=%04x\n", temp,swText[temp]); ftError = FT_Load_Char(ftFace, swText[temp], FT_LOAD_RENDER | FT_LOAD_NO_AUTOHINT);//提取一个字形图像 if (ftError) { printf("FT_Load_Char() Failed!, ftError=%d\n", ftError); continue; } ftError = FT_Get_Glyph(ftFace->glyph, &ftGlyph); if (ftError) { printf("FT_Get_Glyph() Failed!"); return ftError; } if (swText[temp] == L' ')//如果取得的为空格 { printf("M MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM M\n"); k = 0; nChWidth = (nFontSize - 2) / 2; nChHeight = nFontSize; nTextWidth = start_x + nChWidth; start_y = 0; for (i = 0; i < BgHeight; i++) { pTextAlpha[i] = (uint8_t*)realloc(pTextAlpha[i], sizeof(uint8_t)*nTextWidth); memset(pTextAlpha[i], 0 ,sizeof(uint8_t)*nTextWidth); for (j = start_x - nSpace; j < nTextWidth; j++) { pTextAlpha[i][j] = 0; } } for (i = 0; i < nChHeight; i++) { for (j=0; j< nChWidth; j++) { pTextAlpha[start_y+i][start_x+j] = 0; k++; } } start_x += (nChWidth + nSpace); /* 画笔向右边移动 */ } else { /* 256级灰度字形转换成位图 */ ftError = FT_Glyph_To_Bitmap(&ftGlyph, FT_RENDER_MODE_NORMAL , NULL, 1); if (ftError) { printf("FT_Glyph_To_Bitmap() Failed!\n"); } ftBmpGlyph = (FT_BitmapGlyph)ftGlyph; ftBitmap = ftBmpGlyph->bitmap; k = 0; printf("XXXXXXXXXX:nFontSize = %d, bitmap_top = %d\n", nFontSize, ftGlyphslot->bitmap_top); printf("XXXXXXXXXX:ftBitmap.rows = %d, BgHeight = %d\n", ftBitmap.rows, BgHeight); start_y = nFontSize - ftGlyphslot->bitmap_top + 2; /* 获取起点的y轴坐标 */ //start_y = nFontSize - ftBitmap.rows + 2; if(start_y < 0) { start_y = 0; } if (ftBitmap.rows > BgHeight) { nChHeight = nFontSize; } else { nChHeight = ftBitmap.rows; } if (nChHeight + start_y > BgHeight) { nChHeight = BgHeight - start_y; } nChWidth = ftBitmap.width; nTextWidth = start_x + ftBitmap.width; printf("XXXXXXXXXX:nChHeight = %d, nChWidth = %d, nTextWidth = %d\n",nChHeight, nChWidth, nTextWidth); for (i=0; i<BgHeight; i++) { pTextAlpha[i] = (uint8_t*)realloc(pTextAlpha[i], nTextWidth); for (j = start_x - nSpace; j < nTextWidth; j++) { if(j < 0) j = 0; pTextAlpha[i][j] = 0; } } for (i = 0; i < BgHeight; i++) { for (j = 0; j < nChWidth; j++) { if (i >= start_y && i < start_y + nChHeight) { pTextAlpha[i][start_x + j] = ftBitmap.buffer[k]; k++; } else { pTextAlpha[i][start_x + j] = 0; } } } start_x += (nChWidth + nSpace); FT_Done_Glyph(ftGlyph); printf("FT_Done_Glyph() Success!\n"); ftGlyph = NULL; } } FT_Done_Face(ftFace); ftFace = NULL; FT_Done_FreeType(ftLib); ftLib = NULL; stBitmap->u32Width = nTextWidth; stBitmap->u32Height = BgHeight; size = sizeof(uint8_t) * nTextWidth * BgHeight; stBitmap->pData = (uint8_t*)malloc(size); memset(stBitmap->pData, 0, size); printf("===================nTextWidth = %d\n", nTextWidth); printf("===================BgHeight = %d\n", BgHeight); printf("===================nChHeight = %d\n", nChHeight); k = 0; for (i = 0; i < BgHeight; i++) { memcpy(((char*)stBitmap->pData) + k, pTextAlpha[i], nTextWidth); k += nTextWidth; free(pTextAlpha[i]); pTextAlpha[i] = NULL; } free(pTextAlpha); pTextAlpha = NULL; return 0; } ```
JAVA的Frame问题,关于画笔颜色和字体设置?
java窗口里的画笔,改变颜色后要变回来,以免影响别的地方的画笔颜色,那么改变字体后需要变回原来的字体吗? ![图片说明](https://img-ask.csdn.net/upload/201707/31/1501483113_326758.png)
关于安卓中的paint画笔问题
不好意思我又来了~上次的问题我怕我没表达清楚,所以再问一次。就是我想在一个view界面中使用画笔来画几个黑色的实心矩形,然后让这些矩形不断的进行黑白交替的功能。但是前提是,这些矩形的黑白交替是有一定的频率的。比如说,我想设置这个频率为1hz,那么我的黑色就要停留0.5s,白色也是停留0.5s。但是,我想让这些小方块的频率不同,比如说第一个小方块我想设置1hz,第二个小方块我想设置5hz。这应该怎么做呢?我现在不会的就是不会设置这些不同的频率,只会让他们都停留同样的时间。求求各路大神帮帮忙![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/9.gif)![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/9.gif)![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/9.gif)![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/9.gif)![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/9.gif)
安卓 Paint画笔颜色设置
调用jni接口返回int型结果,然后根据结果值将画笔设置为不同颜色画线。 一种是直接设置不同颜色,另外一种是更换画笔,但都不起作用。 代码: if (testFront == 0) { canvas.drawLine(x, y, x, sfv.getHeight() - y, mPaint);// 中间出波形 } else if (testFront == 1) { canvas.drawLine(x, y, x, sfv.getHeight() - y,frontPaint); }
mfc实现用菜单修改画笔的粗细、颜色等功能,实现视图的自动刷新,在视窗大小改变时能自动绘制线条
mfc实现用菜单修改画笔的粗细、颜色等功能,实现视图的自动刷新,在视窗大小改变时能自动绘制线条
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
《阿里巴巴开发手册》读书笔记-编程规约
Java编程规约命名风格 命名风格 类名使用UpperCamelCase风格 方法名,参数名,成员变量,局部变量都统一使用lowerCamelcase风格 常量命名全部大写,单词间用下划线隔开, 力求语义表达完整清楚,不要嫌名字长 ...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
Python绘图,圣诞树,花,爱心 | Turtle篇
1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle.shape('circle') circle.color('red') circle.speed('fastest') circle.up() square = turtle.Turtle()
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
为什么听过很多道理,依然过不好这一生?
记录学习笔记是一个重要的习惯,不希望学习过的东西成为过眼云烟。做总结的同时也是一次复盘思考的过程。 本文是根据阅读得到 App上《万维钢·精英日课》部分文章后所做的一点笔记和思考。学习是一个系统的过程,思维模型的建立需要相对完整的学习和思考过程。以下观点是在碎片化阅读后总结的一点心得总结。
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
Linux 命令(122)—— watch 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] watch(1) manual
Linux 命令(121)—— cal 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] cal(1) manual
记jsp+servlet+jdbc实现的新闻管理系统
1.工具:eclipse+SQLyog 2.介绍:实现的内容就是显示新闻的基本信息,然后一个增删改查的操作。 3.数据库表设计 列名 中文名称 数据类型 长度 非空 newsId 文章ID int 11 √ newsTitle 文章标题 varchar 20 √ newsContent 文章内容 text newsStatus 是否审核 varchar 10 news...
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告(本文) 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问

相似问题

4
请大神帮忙看下,为什么MyPanel中的Paint方法没有被调用
4
我用Ajax向后台发送了个请求,返回的数据是一个List,页面都已经打印出来了,我如何遍历他?
1
mscomm串口波形绘制范例,求大神解析这三个函数,急急急,绘制波形图的原理是什么,拜托了
1
moxa相机字符叠加时候创建画笔和画刷对象失败
1
请问android在webview上用canvas绘制四圆点,拖动后原来的点却无法删除呢?
1
微场景里怎么实现人物以图画方式被画笔图出来,随后身上的色条做出生长动画
5
Android自定义View画笔颜色改变问题(画笔颜色改变了,但是实际上ABCD这些字母的颜色没变)
7
Android 方形图片编程圆形之后,太小了
2
java问题,为什么画出的小球不能动
0
关于手势解锁时的范围问题
2
【Android】View如何实现多个监听以及如何设置Bitmap在视图中的位置?
1
2015flashcc 画笔工具出现的问题,有大神能提供详细的解决办法吗
2
Android无容器绘图的方法
0
C# PPT 墨迹工具插件,放映模式下,画一个按钮点击启动墨迹工具
1
CommandBar 调用PPT墨迹工具对象 C#
1
android SurfaceView.holder造成闪退
1
控制台程序使用鼠标点击画直线 DDA算法 为什么我画的直线不在面板上,而在屏幕左上角上
1
安卓使用socket接收到一帧帧的图片数据后,快速的使用画笔刷在画布上,能否实现视频的播放?
1
JavaWeb图形绘制,图形处理中输出图片用什么类库推荐
1
小喵喵的新家