精华内容
下载资源
问答
  • 下面小编就为大家带来一篇java字符串数组进行大小排序的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 关于string字符大小比较以及运算符重载  今天写项目的时候遇到两个时间字符串需要比较大小的情况,例:"20181023"和"20181020"比较大小,想都没想就写出了下面的代码,这里有人会问为什么...

                            关于string字符串大小比较以及运算符重载

     今天在写项目的时候遇到两个时间字符串需要比较大小的情况,例:"20181023"和"20181020"比较大小,想都没想就写出了下面的代码,这里有人会问为什么不转换成DataTime类型在进行比较因为要取的时间格式为 "HH:mm:ss" 这个样子滴:

     
                string str1 = "2018-10-20 21:49:12.783";
                string str2 = "2018-10-20 20:49:12.783";
                if (str2 > str1)//这里会有一个编译错误
                {
                    Console.WriteLine("str2大于str1");
                }
                else if(str2 < str1) //这里会有一个编译错误
                {
                    Console.WriteLine("str1大于str2");
                }
                else
                {
                    Console.WriteLine("相等");
                }

     结果在demo中有注释的地方无法编译通过,左思右想难道.net core不允许这样写了?又拿.net framework试了一下依然不行,看来真的是基础需要巩固了...

    这样写不行,那就换一种写法吧总之新实现了需求再说,之后写出了如下代码:

                string str1 = "2018-10-20 21:49:12.783";
                string str2 = "2018-10-20 20:49:12.783";
                if (str1.CompareTo(str2) < 0)
                {
                    Console.WriteLine("str2大于str1");
                }
                else if (str1.CompareTo(str2) > 0)
                {
                    Console.WriteLine("str1大于str2");
                }
                else
                {
                    Console.WriteLine("str1与str2相等");
                }	

    此种方式是string实现了IComparable接口才得以实现此处不做深究

    完成了工作之后试想了一下为什么int类型可以实现比较大小而string却不可以

    查看一下string的源码发现只有 == 和 != 的重载

    源码查看:https://referencesource.microsoft.com/

            public static bool operator == (String a, String b) {
               return String.Equals(a, b);
            }
     
            public static bool operator != (String a, String b) {
               return !String.Equals(a, b);
            }

    于是乎本着试试看的态度写出了如下代码

        public class A
        {
            public static bool operator < (A a1,A a2)
            {
                return true;
            }
            public static bool operator >(A a1, A a2)
            {
                return false;
            }
        }

    在没有以上重载的情况下 class A是无法进行比较的,也许string没有"<"和">"运算的原因就是因为这个吧,搞到这里又去查了一下关于运算符重载相关的东西如下:

            允许用户定义的类型通过使用 operator 关键字定义静态成员函数来重载运算符。但是必须用public修饰且必须是类的静态的方法。而且不是所有的运算符都可以重载,同样需要注意的某些运算符重载必须成对出现。

    运算符

    可重载性

     +、-、!、~、++、--、true、false

     可以重载这些一元运算符, true和false运算符必须成对重载

     +、-、*、/、%、&、|、^、<<、>>

     可以重载这些二元运算符

     ==、!=、<、>、<=、>=

     可以重载比较运算符,必须成对重载

     &&、||

     不能重载条件逻辑运算符,但可以使用能够重载的&和|进行计算

     []

     不能重载数组索引运算符,但可以定义索引器

     ()

     不能重载转换运算符,但可以定义新的转换运算符(请参见 explicit 和 implicit)

     +=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=

     不能显式重载赋值运算符,在重写单个运算符如+、-、%时,它们会被  隐式重写

     =、.、?:、->、new、is、sizeof、typeof

     不能重载这些运算符

    关于运算符重载找了一篇介绍的更详细的想了解的可以去这里看看:https://www.cnblogs.com/52XF/p/yunsuanfuchognzai.html

    本文主要研究为何string等一些私密类无法进行运算符运算的原因

    记录一下工作遇到的小问题。如有问题,还请大牛不吝赐教。

    展开全文
  • 下面是简单的例子: function tab(date1,date2){ var oDate1 = new Date(date1); var oDate2 = new Date(date2); if(oDate1.getTime() > oDate2.getTime()){ console.log('第一个大'); } else 真的在乎一个...

    思路: 先都转换成日期。然后再用毫秒数进行比较。 下面是简单的例子: function tab(date1,date2){ var oDate1 = new Date(date1); var oDate2 = new Date(date2); if(oDate1.getTime() > oDate2.getTime()){ console.log('第一个大'); } else 真的在乎一个人的时候只要他对你冷淡一点你的心就好像在流血

    javascript怎样比较两个时间的大小?

    请问如何在EXCEL中比较两个时间点的大小?早上好,人生短短几十年,不要给自己留下了什么遗憾,想笑就笑,想哭就哭,该爱的时候就去爱,无需压抑自己,新的一天总有新的活法!

    比如如果打卡时间早于8:00显示“OK”否则显示"迟到”

    假设打卡时间在A1中,则公式为: =IF(A1="","",IF(TIME(HOUR(A1),MINUTE(A1),SECOND(A1))人总是会变的,不变的人需要很多人的付出来保护。

    Java怎样比较两个时间的大小别人给的,是人情和依赖,自强独立的,才是安全感。

    public static int compare_date(String date1, String date2) { DateFo不是所有的伤痛都需要呐喊,不是所有的遗憾都非要填满。

    小编刚刚写了一段代码你参考一下 希望对你有帮助 import java.text.SimpleDateFormat; import java.util.Date; public class Date_Test { public static void main(String[] args)

    展开全文
  • 需要解决的问题: 1. 怎么用opencv 输出中文字符?...2. 怎么控制输出字符大小? 环境: vs2010 + opencv2.4.9 因此,想要修改字体大小,就得自己写一个接口,调用 FT_Set_Pixel_Sizes() 函数去修改字体大小

    转载请注明出处:http://blog.csdn.net/yiqiudream/article/details/76216433


    需要解决的问题:

    1. 怎么用opencv 输出中文字符?

    2. 怎么控制输出字符的大小?

    环境:

    vs2010 + opencv2.4.9 + freetype2.8

    本文所使用的文件打包后下载地址:http://download.csdn.net/detail/yiqiudream/9913839



    首先找到了这篇博文 http://blog.csdn.net/zmdsjtu/article/details/53133223 并下载了博主的文件,包含以下内容:


    直接新建了工程,把文件放进去,编译,发现缺少文件而无法编译。按照博客方法操作,但是我不知道怎么在我的vs2010中一键安装freetype,所以放弃安装。


    后来参考这些博文:

    http://blog.csdn.net/huixingshao/article/details/43563853

    http://blog.csdn.net/wanrenwangxuejing/article/details/39895595

    http://blog.csdn.net/xufeng0991/article/details/40735651

    发现需要自己下载 freetype库

    我的下载地址:http://download.savannah.gnu.org/releases/freetype/ 

    版本是 freetype-2.8.tar.gz 。解压后得到 ft28 文件夹。

    该版本的API手册:FreeType-2.8 API Reference


    编译:

    找到路径:***\ft28\freetype-2.8\builds\windows\vc2010\freetype.sln   

    用vs2010打开该工程文件,分别在 debug 和 release 环境下编译,得到两个文件:

    freetype28.lib  和 freetype28d.lib

    这两个文件的位置在:***\ft28\freetype-2.8\objs\vc2010\Win32\


    新建一个工程,将freetype库添加到工程:

    添加包含目录:右键属性->VC++目录->包含目录->添加

    • ***\ft28\freetype-2.8\include
    • ***\ft28\freetype-2.8\include\opencv
    • ***\ft28\freetype-2.8\include\opencv2

    添加库目录:右键属性->VC++目录->库目录->添加 ***\ft28\freetype-2.8\objs\vc2010\Win32

    添加附加依赖项:freetype28.lib   freetype28d.lib


    在新建工程目录下,添加一个字体文件,该文件从C:\Windows\Fonts\文件夹下的.tff文件中选择一个,复制到工程目录下。我添加了simhei.tff


    下载 CvxText.h   CvxText.cpp文件,放在工程scan1文件夹下,并添加进工程中来。

    (我忘记当时下载的链接了,这里有一个:http://download.csdn.net/detail/jacky_ponder/9680241


    最终工程结构:



    测试:

    在main_CvxText.cpp中输入:

    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include <math.h>
    #include <iostream>
    #include "CvxText.h"
    
    
    using namespace cv;
    using namespace std;
    
    int main()
    {
    	Mat src( Size(800, 600), CV_8UC3, Scalar(220,220,220));
    	imwrite("src.bmp", src);
    
    	//格式转换
    	IplImage oldImg = IplImage(src);
    	IplImage *oldImg1 = &oldImg;
    
    	//指定字体
    	CvxText text("simhei.ttf");   //黑体
    
    	//打印第一行字
    	const char* msg = "黑体字(50,50)(100,0.5,0.1,0)";
    	float p=1;  //暂时不考虑透明度
    	double my_val[4] = {100, 0.5, 0.1, 0};  //这里第一个参数并不能设置字体大小,只是设置了字符之间的距离。
    	CvScalar *my_size = (CvScalar *)(my_val);
    	text.setFont(NULL, my_size, NULL, 0);
    	text.putText(oldImg1, msg, cvPoint(50, 100), CV_RGB(0,0,0));
    	//cvSaveImage("oldImg1.bmp", oldImg1);
    
    	//打印第二行字
    	const char* msg2 = "黑体字(50,50)(80,0.5,0.1,0)";
    	float p2=1;  //暂时不考虑透明度
    	double my_val_2[4] = {80, 0.5, 0.1, 0};  //这里第一个参数并不能设置字体大小,只是设置了字符之间的距离。
    	CvScalar *my_size2 = (CvScalar *)(my_val_2);
    	text.setFont(NULL, my_size2, NULL, 0);
    	text.putText(oldImg1, msg2, cvPoint(50, 200), CV_RGB(0,0,0));
    	//cvSaveImage("oldImg1.bmp", oldImg1);
    
    	//打印第三行字
    	const char* msg3 = "黑体字(50,50)(60,0.5,0.1,0)";
    	float p3=1;  //暂时不考虑透明度
    	double my_val_3[4] = {60, 0.5, 0.1, 0};  //这里第一个参数并不能设置字体大小,只是设置了字符之间的距离。
    	CvScalar *my_size3 = (CvScalar *)(my_val_3);
    	text.setFont(NULL, my_size3, NULL, 0);
    	text.putText(oldImg1, msg3, cvPoint(50, 300), CV_RGB(0,0,0));
    	cvSaveImage("oldImg1.bmp", oldImg1);
    
    
    	//格式转换
    	Mat dst = Mat(oldImg1);
    	imwrite("dst.bmp", dst);
    
    	while(1)
    	{
    		int key = waitKey();                 // 等待按键按下
    		if( (key & 255) == 27)            // 如果按下了Esc键
    			break;
    	}
    
    	return 0;
    
    }

    由于我需要在opencv2的环境下用到打印中文字符的功能,所以进行了格式转换。不需要的可以直接用IplImage载入图片。

    输出图片效果:



    存在问题:

    这三行字之间的差别就在于 text.setFont(NULL,my_size,NULL, 0); 第二个参数my_size,其中my_size[0] 分别设置成了100、80、60.  在该函数定义中这个参数控制字体大小,但实际情况是,字体大小并没有改变,只是字符之间的距离变化了。那要如何控制字符大小呢? 如何控制字符间距呢?


    查看源码:

    在工程scan1中查看 CvxText.h 及 CvxText.cpp中的函数,比如FT_Set_Pixel_Sizes()函数,右键选择“转到定义”,结果找不到该定义。猜测原因是我自己建的这个工程并没有把所有需要的源文件都组织起来。

    解决办法:

    找到最初编译 ft28 的工程,地址是***\ft28\freetype-2.8\builds\windows\vc2010\freetype.sln, 打开该.sln文件。并且把CvxText.h及 CvxText.cpp 复制到解决方案文件夹下,并添加进工程freetype中。从这里打开这两个文件,选中某个函数再右键选择“转到定义”就可以找到该函数的定义了。

    freetype工程下有这么多文件:



    先看设置字体的函数setFont()

       /**
        * 设置字体。目前有些参数尚不支持。
        *
        * \param font        字体类型, 目前不支持
        * \param size        字体大小/空白比例/间隔比例/旋转角度
        * \param underline   下画线
        * \param diaphaneity 透明度
        *
        * \sa getFont, restoreFont
        */
    
       void setFont(int *type,
          CvScalar *size=NULL, bool *underline=NULL, float *diaphaneity=NULL);
    从注释上看,第二个参数 CvScalar *size  负责设置字体大小/空白比例/间隔比例/旋转角度。但从前面的测试结果看,size[0]并不能改变字体大小。

    从参考的文献来看,FT_Set_Pixel_Sizes()函数是用来设置字体大小的。

    FT_Set_Pixel_Sizes()  函数只有在 restoreFont()函数中被调用一次,其他地方都没有用到。

    restoreFont() 函数的目的是设置一个默认的字符参数,如果我在setFont()函数中的参数都写Null 也没关系,会使用这里默认的参数。

    restoreFont() 函数只在 构造函数 CvxText::CvxText()中被调用,其他地方没有出现。也就是说在我新建对象的时候(main_CvxText.cpp中:     CvxText text("simhei.ttf");   //黑体),内部完成的步骤有:打开字体库,创建一个字体,设置字体输出参数(默认参数),设置C语言的字符集环境。    其中,在执行 restoreFont() 的时候,就执行了FT_Set_Pixel_Sizes() 。也是整个程序中唯一执行FT_Set_Pixel_Sizes()的一次。也就是说新建对象的时候,字体大小已经确定了,后面再也没有调用该函数去修改字体大小,所以最终输出结果的字体大小是固定的,不能修改。


    CvxText::CvxText(const char *freeType)
    {
    	assert(freeType != NULL);
    	
    	// 打开字库文件, 创建一个字体
    	
    	if(FT_Init_FreeType(&m_library)) throw;   //打开字库文件
    	if(FT_New_Face(m_library, freeType, 0, &m_face)) throw;    //创建一个字体
    	
    	// 设置字体输出参数
    	
    	restoreFont();
    	
    	// 设置C语言的字符集环境  (C语言默认采用的是ASCII字符集,转换成Unicode)
    	
    	setlocale(LC_ALL, "");
    }

    // 恢复原始的字体设置
    
    void CvxText::restoreFont()
    {
    	m_fontType = 0;            // 字体类型(不支持)
    	
    	m_fontSize.val[0] = 50;      // 字体大小
    	m_fontSize.val[1] = 0.5;   // 空白字符大小比例
    	m_fontSize.val[2] = 0.1;   // 间隔大小比例
    	m_fontSize.val[3] = 0;      // 旋转角度(不支持)
    	
    	m_fontUnderline   = false;   // 下画线(不支持)
    	
    	m_fontDiaphaneity = 1.0;   // 色彩比例(可产生透明效果)
    	
    	// 设置字符大小
    	
    	FT_Set_Pixel_Sizes(m_face, (int)m_fontSize.val[0], 0);
    }
    FT_Set_Pixel_Sizes() 函数有点复杂,还要追踪到下一个函数,没有搞清楚细节,目前只需要直到它是用来设置字体大小的。


    因此,想要修改字体大小,就得自己写一个接口,调用 FT_Set_Pixel_Sizes() 函数去修改字体大小。

    在CvxText.h文件中添加 setMySize 函数的声明

       // 我发现要改变字体的大小,必须是在FT_Set_Pixel_Sizes()函数中设置,所以额外写一个函数来修改字体大小。
       void setMySize( int a, int b);


    在CvxText.cpp文件中添加setMySize 函数的定义

    // 我发现要改变字体的大小,必须是在FT_Set_Pixel_Sizes()函数中设置,所以额外写一个函数来修改字体大小。
    void CvxText::setMySize( int a, int b)
    {
    	FT_Set_Pixel_Sizes(m_face, a , b);
    }
    其中,参数a 和参数b分别对应字符的高和宽,两者可以分别设置(将字体压扁或者拉长);如果设置一个,另一个为0,则默认两者相等。



    在 main_CvxText.cpp中每次打印字体之前添加一行: text.setMySize(100, 50);   //设置默认的字体大小

    修改后的main_CvxText.cpp如下

    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include <math.h>
    #include <iostream>
    #include "CvxText.h"
    
    using namespace cv;
    using namespace std;
    
    int main()
    {
    	Mat src( Size(800, 600), CV_8UC3, Scalar(220,220,220));
    	imwrite("src.bmp", src);
    
    	//格式转换
    	IplImage oldImg = IplImage(src);
    	IplImage *oldImg1 = &oldImg;
    
    	//指定字体
    	CvxText text("simhei.ttf");   //黑体
    	text.setMySize(80, 80);   //设置默认的字体大小
    	//打印第一行字
    	const char* msg = "黑体字(80,80)(80,0.5,0.1,0)";
    	float p=1;  //暂时不考虑透明度
    	double my_val[4] = {100, 0.5, 0.1, 0};  //这里第一个参数并不能设置字体大小,只是设置了字符之间的距离。
    	CvScalar *my_size = (CvScalar *)(my_val);
    	text.setFont(NULL, my_size, NULL, 0);
    	text.putText(oldImg1, msg, cvPoint(50, 100), CV_RGB(0,0,0));
    	//cvSaveImage("oldImg1.bmp", oldImg1);
    
    	//打印第二行字
    	text.setMySize(60, 60);   //设置默认的字体大小
    	const char* msg2 = "黑体字(60,60)(80,0.5,0.1,0)";
    	float p2=1;  //暂时不考虑透明度
    	double my_val_2[4] = {80, 0.5, 0.1, 0};  //这里第一个参数并不能设置字体大小,只是设置了字符之间的距离。
    	CvScalar *my_size2 = (CvScalar *)(my_val_2);
    	text.setFont(NULL, my_size2, NULL, 0);
    	text.putText(oldImg1, msg2, cvPoint(50, 200), CV_RGB(0,0,0));
    	//cvSaveImage("oldImg1.bmp", oldImg1);
    
    	//打印第三行字
    	text.setMySize(40, 40);   //设置默认的字体大小
    	const char* msg3 = "黑体字(40,40)(80,0.5,0.1,0)";
    	float p3=1;  //暂时不考虑透明度
    	double my_val_3[4] = {60, 0.5, 0.1, 0};  //这里第一个参数并不能设置字体大小,只是设置了字符之间的距离。
    	CvScalar *my_size3 = (CvScalar *)(my_val_3);
    	text.setFont(NULL, my_size3, NULL, 0);
    	text.putText(oldImg1, msg3, cvPoint(50, 300), CV_RGB(0,0,0));
    	cvSaveImage("oldImg1.bmp", oldImg1);
    
    
    	//格式转换
    	Mat dst = Mat(oldImg1);
    	//imwrite("dst.bmp", dst);
    
    	while(1)
    	{
    		int key = waitKey();                 // 等待按键按下
    		if( (key & 255) == 27)            // 如果按下了Esc键
    			break;
    	}
    
    	return 0;
    }
    输出结果图:




    那么 setFont() 函数的作用是什么呢?

    void CvxText::setFont(int *type, CvScalar *size, bool *underline, float *diaphaneity)
    {
    	// 参数合法性检查
    	
    	if(type)
    	{
    		if(type >= 0) m_fontType = *type;
    	}
    	if(size)
    	{
    		m_fontSize.val[0] = fabs(size->val[0]);
    		m_fontSize.val[1] = fabs(size->val[1]);
    		m_fontSize.val[2] = fabs(size->val[2]);
    		m_fontSize.val[3] = fabs(size->val[3]);
    	}
    	if(underline)
    	{
    		m_fontUnderline   = *underline;
    	}
    	if(diaphaneity)
    	{
    		m_fontDiaphaneity = *diaphaneity;
    	}
    
    }

    在 setFont() 函数中设置了 m_fontSize.val[4] 的四个值。m_fontSize在打印字符的时候用到,下一个字符从哪里开始打印就根据这个参数计算得到。

    // 输出当前字符, 更新m_pos位置
    
    void CvxText::putWChar(IplImage *img, wchar_t wc, CvPoint &pos, CvScalar color)
    {
    	// 根据unicode生成字体的二值位图
    	
    	FT_UInt glyph_index = FT_Get_Char_Index(m_face, wc);  //根据字符的编码得到字符的索引位置
    	FT_Load_Glyph(m_face, glyph_index, FT_LOAD_DEFAULT);  //根据字符在字库中的索引得到字符轮廓
    	FT_Render_Glyph(m_face->glyph, FT_RENDER_MODE_MONO);  //根据字符的轮廓渲染字符的二值位图。
    	
    	//
    	
    	FT_GlyphSlot slot = m_face->glyph;
    	
    	// 行列数
    	
    	int rows = slot->bitmap.rows ;   //怎么确定的?
    	int cols = slot->bitmap.width ;
    	
    	//
    	
    	for(int i = 0; i < rows; ++i)
    	{
    		for(int j = 0; j < cols; ++j)
    		{
    			int off  = ((img->origin==0)? i: (rows-1-i))    //origin!=0的时候从最后一行开始?
                    * slot->bitmap.pitch + j/8;
    			
    			if(slot->bitmap.buffer[off] & (0xC0 >> (j%8)))
    			{
                    int r = (img->origin==0)? pos.y - (rows-1-i): pos.y + i;;
                    int c = pos.x + j;
    				
                    if(r >= 0 && r < img->height
    					&& c >= 0 && c < img->width)
                    {
    					CvScalar scalar = cvGet2D(img, r, c);
    					
    					// 进行色彩融合
    					
    					float p = m_fontDiaphaneity;
    					for(int k = 0; k < 4; ++k)
    					{
    						scalar.val[k] = scalar.val[k]*(1-p) + color.val[k]*p;
    					}
    					
    					cvSet2D(img, r, c, scalar);
                    }
    			}
    		} // end for
    	} // end for
    	
    	// 修改下一个字的输出位置
    	
    	double space = m_fontSize.val[0]*m_fontSize.val[1];
    	double sep   = m_fontSize.val[0]*m_fontSize.val[2];
    	
    	pos.x += (int)((cols? cols: space) + sep);
    }

    看最下面的几行,

    double space = m_fontSize.val[0]*m_fontSize.val[1];

    double sep   =m_fontSize.val[0]*m_fontSize.val[2];

    pos.x += (int)((cols? cols: space) + sep);

    由 space 和 sep 计算出pos.x  也就是计算出下一个要打印字符的位置。space是由 m_fontSize.val[0]和 m_fontSize.val[1] 相乘得到的,sep 是由 m_fontSize.val[0]和 m_fontSize.val[2] 相乘得到的。所以我理解为,m_fontSize.val[0]是一个基数,m_fontSize.val[1]和 m_fontSize.val[2] 是比例,合起来控制字符间距。



    测试一下。修改main_CvxText.cpp中 my_size 的参数(my_val[4])。text.setMySize(40,40)不变。

    	//指定字体
    	CvxText text("simhei.ttf");   //黑体
    	text.setMySize(40, 40);   //设置默认的字体大小
    	//打印第一行字
    	const char* msg = "黑体字(40,40)(150,0.5,0.1,0)";
    	float p=1;  //暂时不考虑透明度
    	double my_val[4] = {200, 0.5, 0.1, 0};  //这里第一个参数并不能设置字体大小,只是设置了字符之间的距离。
    	CvScalar *my_size = (CvScalar *)(my_val);
    	text.setFont(NULL, my_size, NULL, 0);
    	text.putText(oldImg1, msg, cvPoint(50, 100), CV_RGB(0,0,0));
    	//cvSaveImage("oldImg1.bmp", oldImg1);
    
    	//打印第二行字
    	text.setMySize(40, 40);   //设置默认的字体大小
    	const char* msg2 = "黑体字(40,40)(100,0.5,0.1,0)";
    	float p2=1;  //暂时不考虑透明度
    	double my_val_2[4] = {100, 0.5, 0.1, 0};  //这里第一个参数并不能设置字体大小,只是设置了字符之间的距离。
    	CvScalar *my_size2 = (CvScalar *)(my_val_2);
    	text.setFont(NULL, my_size2, NULL, 0);
    	text.putText(oldImg1, msg2, cvPoint(50, 200), CV_RGB(0,0,0));
    	//cvSaveImage("oldImg1.bmp", oldImg1);
    
    	//打印第三行字
    	text.setMySize(40, 40);   //设置默认的字体大小
    	const char* msg3 = "黑体字(40,40)(100,0.1,0.05,0)";
    	float p3=1;  //暂时不考虑透明度
    	double my_val_3[4] = {100, 0.1, 0.05, 0};  //这里第一个参数并不能设置字体大小,只是设置了字符之间的距离。
    	CvScalar *my_size3 = (CvScalar *)(my_val_3);
    	text.setFont(NULL, my_size3, NULL, 0);
    	text.putText(oldImg1, msg3, cvPoint(50, 300), CV_RGB(0,0,0));
    	cvSaveImage("oldImg1.bmp", oldImg1);
    输出结果图:


    因为text.setMySize(40,40)不变,所以字体大小不变,my_val[4]中的前三个参数的改变使得字符间距改变了。



    CvxText.h 去掉注释整理一下,看得清楚一点。

    #ifndef OPENCV_CVX_TEXT_2007_08_31_H
    #define OPENCV_CVX_TEXT_2007_08_31_H
    
    #include <ft2build.h>
    #include FT_FREETYPE_H
    
    #include <cv.h>
    #include <highgui.h>
    
    class CvxText 
    {
       // 禁止copy
       CvxText& operator=(const CvxText&);
    
    public:
       CvxText(const char *freeType);   //构造函数
       virtual ~CvxText();     //析构函数
       
       void getFont(int *type,      
          CvScalar *size=NULL, bool *underline=NULL, float *diaphaneity=NULL);    //获得字体参数
    
       void setFont(int *type,
          CvScalar *size=NULL, bool *underline=NULL, float *diaphaneity=NULL);   //设置字体参数
    
       void restoreFont();    //设置默认的参数,包括字体、下划线等
    
       void setMySize( int a, int b);    //为了修改字体大小,自定义的一个函数
    
       int putText(IplImage *img, const char    *text, CvPoint pos);  //打印字符重载函数,里面都调用了putWchar
       int putText(IplImage *img, const wchar_t *text, CvPoint pos);
       int putText(IplImage *img, const char    *text, CvPoint pos, CvScalar color);
       int putText(IplImage *img, const wchar_t *text, CvPoint pos, CvScalar color);
    
    private:
       void putWChar(IplImage *img, wchar_t wc, CvPoint &pos, CvScalar color);  //执行打印字符的具体函数
    
    private:
    
       FT_Library   m_library;   // 字库
       FT_Face      m_face;      // 字体
    
       int         m_fontType;   //字体格式
       CvScalar   m_fontSize;    //字体尺寸
       bool      m_fontUnderline;  //下划线
       float      m_fontDiaphaneity;  //透明度
    };
    
    #endif
    


    本文还欠考虑的问题:m_fontSize.val[4] 值如何设置才能够得到想要的字体大小、间隔?目前只知道调大一点,调小一点,不知道具体的数值和像素点的准确关系。


    展开全文
  • 今天keil上写代码时,使用strlen和strcmp一直会有警告,所以就有了下面的东西,自己写一个判断数组大小字符数组比较的代码。仅供参考。keil对一些库函数的编译会一直有警告,作为一个写bug 的程序员,警告,不...

    C语言实现字符串比较(非库函数)

    今天在keil上写代码时,使用strlen和strcmp一直会有警告,所以就有了下面的东西,自己写一个判断数组大小和字符数组比较的代码。仅供参考。keil对一些库函数的编译会一直有警告,作为一个写bug 的程序员,警告,不存在的。这辈子都不会让警告出现在我的代码里面。
    

    代码

    #include <stdio.h>
    char flag=0;
    int size_1=0;
    int size_str(char * arr)//求字符串大小的函数
    {
        size_1=0;
        while(*arr++!='\0')
            size_1++;
        return size_1;
    }
    char str_cmp(char * Str,char * Str1,char flag)
    {
        flag=1;//flag要是从零开始,记录的则是数组的下标位置
        int size_str1=size_str(Str),size_str2=size_str(Str1);
        while((*Str++==*Str1++)&&((*Str!='\0')&&(*Str1!='\0')))//判断数组str1和str2相等或者有没有结束,
        {
            flag++;
            if(size_str1==size_str2)//如果数组大小相等,则判断两个数组相同元素的个数,如果相同元素的个数与数组大小相同,则两个数组相同
            {
                if(size_str1==flag)
                return 1;//相同返回1
            } 
            //else if((*Str=='\0')||(*Str1=='\0'))
            //break;
        }
        return 0;//其他情况返回0
    }
    int main()
    {
        char str1[10]={"123456"};
        char str2[10]={"12345"};
        printf("%d\n%d\n",str_cmp(str1,str2,flag),size_str(str2));
        return 0;
    }
    
    展开全文
  • 如何比较两个时间字符串的大小 现在有两个字符串, 是从表单读取来的日期性,“2003-10-12”与“2003-10-21”, 现在如何判断他们的大小。如果不想再转为date类型比较有一种简单的方法String a=“2003-10-12”; ...
  • 用指针处理比较字符串的大小

    千次阅读 2020-12-26 11:33:01
    要求使用指针处理下面的问题,输入四个整数,按由小到大的顺序输出;然后将程序改为:输入四个字符串,按由小到大顺序输出。 整数大小比较 #include<iostream> using namespace std; void swap(int*, int*); ...
  • java编程中,我们会偶尔遇到字符大小比较的问题,compareTo()方法很简单就实现这种功能。该方法用于判断一个字符串是大于、等于还是小于另一个字符串。判断字符大小的依据是根据它们字典中的顺序决定的。 ...
  • C++中字符串如何比大小

    千次阅读 2021-02-28 11:28:03
    char类型就直接比较ASCLL值。 字符串类型比较大小: 1:首先比较字符串中的第一个字符的ASCLL值。 2:如果第一个字符相同,则比较第二个字符仍相同,则比较第三……比较第N...下面介绍三种字符串比较大小的方法: 1..
  • Java字符串比较大小,A字符串比B大的比较办法。Java字符串比较大小,A字符串比B大的比较办法。任务描述:程序代码:运行结果:功能分析: Java字符串比较大小,A字符串比B大的比较办法。 任务描述: 使用if语句和...
  • DAX进行字符大小比较

    千次阅读 2018-10-25 17:22:46
    DAX进行字符大小比较
  • AD16批量更改PCB字符大小

    千次阅读 2021-04-26 16:33:47
    1.选中任意字符,右键–>Find Similar Objects 2.将String Type后的下拉框改为Same,然后点击最下面的OK 3.更改高度和宽度
  • java编程中,我们会偶尔遇到字符大小比较的问题,compareTo()方法很简单就实现这种功能。该方法用于判断一个字符串是大于、等于还是小于另一个字符串。判断字符大小的依据是根据它们字典中的顺序决定的。 ...
  • 下面小编就为大家带来一篇java判断中文字符串长度的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • //宏定义之间只能由一个空格,并且末尾不能添加分号 //,否则会造成宏定义出错,因为分号也成为宏替换的一部分 int compare(char str1[], char str2[]);//具体实现的函数 int main(void)//主函数 { char str1
  • strcmp()函数首先将s1字符串的第一个字符值减去s2第一个字符,若差值为零则继续比较下去;若差值不为零,则返回差值。 直到出现不同的字符或遇’\0’为止。 参数: s1 – 要进行比较的第一个字符串。 s2 – 要进行...
  • 比较两个时间字符串的大小

    千次阅读 2019-02-28 17:35:19
    有两个日期字符串,“2019-01-21”和“2019-02-12”,现在需要比较这两个字符串的大小。 比较简单的方法是可以使用String类中的compareTo()方法比较,例如: public class Test { public static void main...
  • 大小端 -- 字符

    千次阅读 2018-06-22 22:35:28
    小端字节序和大端字节序中,区别在于地地址存低位还是高位的区别...内存的单位是字节,对于字符来说,char是1个字节,不受主机字节序和网络字节序的影响,内存中就一个单元,没有前后之分。但是当是组合内存空间时...
  • Java字符串比较(3种方法)

    千次阅读 2021-02-12 21:44:20
    字符串比较是常见的操作,包括比较相等、比较大小、比较前缀和后缀串等。 Java 中,比较字符串的常用方法有 3 个:equals() 方法、equalsIgnoreCase() 方法、 compareTo() 方法。下面详细介绍这 3 个方法的使用。...
  • 以下选项中,关于Python字符串的描述错误的答:Python字符串提供区间访问方式,采用[N:M]格式,表示字符串中从N到M的索引子字符串(包含N和M)寒武纪生物大爆发的原因可能是答:间断平衡论 生物收割者假说 地质记录的...
  • 自定义函数比较两个字符串的大小

    千次阅读 2019-12-03 10:02:29
    #include <stdio.h> int mystrcmp(char *str1,char *str2) ...0即第一个字符串大于第二个字符串 c<0即第一个字符串小于第二个字符串 */ int i,c; for(i=0;str1[i]||str2[i];i++) { if(...
  • C语言关于字符串和字符数组的转化问题

    千次阅读 多人点赞 2020-11-21 11:33:36
    C语言关于字符串和字符数组的转化问题 小菜鸡CS本科生一枚,第一次写博客,如果有什么写的不对或者不好的欢迎大家批评指正, 写这篇博客的原因是我今天遇到的一道题,题目很简单,leetcode中等难度,可是这道题却...
  • 很简单的例子,Sql中我么可以轻松的实现字符串的比较,但是我们Linq,Lambda中似乎没有。其实不然,我们可以用CompareTo来实现! 比如下面的SQL例子: 但是我们如何C#中去实现了,我也想了很久,平时没...
  • 下面小编就为大家带来一篇java中建立0-10m的消息(字符串)实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • (1)什么是字符数组? 字符数组是指用来存放字符数据的数组。其定义的一般形式为: char 数组名[数据长度] 。字符数组用于存放字符字符串,...(2)关于字符数组的初始化 直接逐个初始化字符数组: char ch[11...
  • 字符转换为指定大小的点阵。将一个或者一串字符转换为指定大小的点阵,并屏幕上输出。从分利用windows下面的API,转换的点阵保存BYTE数组里面
  • 三个字符串中找出最小的

    千次阅读 2019-05-23 21:17:09
    /*三个字符串中找出最小的*/ #include<stdio.h> #include<stdlib.h> #include<string.h> #define N 20 #define M 3 void main() { char s[N],str[M][N]; int i; for(i=0;i<M;i++) { ...
  • ASCII,Utf8,Unicode编码下的中英文字符大小

    千次阅读 热门讨论 2015-05-21 23:37:23
    一,测试Demo namespace 不同编码下的中英文字符大小 { class Program { static void Main(string[] args) { ShowCode(); } private static void ShowCode() {
  • 举个例子:如果开始时间和结束时间都是varchar类型,那么可以利用下面的方式去获取时间范围 <if test="startTime != null"> <![CDATA[ and o.STARTTIME >= #{startTime}]]> </if> <if ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 723,640
精华内容 289,456
关键字:

在下列关于字符大小