精华内容
下载资源
问答
  • 提升效率 PhotoShop批处理图片技巧
  • 这款插件并不能直接提高你的开发效率,但是可以让你面对的IDE不再单调,当把背景设置成你自己心仪的的图片, 是不是会感觉很赏心悦目,编码效率会不会因此间接的提高?! 使用方法: 2、Mybatis Log ...

    目录

    一、插件安装方式

    二、常用插件

    1、Background Image Plus

    2、Mybatis Log Plugin

    3、MybatisCodeHelperPro

    4、Grep Console

    5、CodeGlance 

    6、GenerateAllSetter

    7、RestfulToolkit

    8、Maven Helper 

    9、JRebel

    10、 Json Parser

    11、Translation

    12、aiXcode & codota

    福利插件^_^

    三、主题美化插件

    1、Material Theme UI

    2、字体美化 

    四、其他还有一些插件,根据实际情况选择使用 


    一、插件安装方式

    file->settings->plugins->macketplace

    各个版本IDE插件界面略有不同,不一一赘述 


    二、常用插件


    1、Background Image Plus

    推荐指数:


        这款插件并不能直接提高你的开发效率,但是可以让你面对的IDE不再单调,当把背景设置成你自己心仪的的图片,

    是不是会感觉很赏心悦目,编码效率会不会因此间接的提高^_^?!

    设置方法:

    注意:如果是IDEA版本是2020.1版本以上就不需要再额外装这个插件,这个插件是已经内置安装了。


    2、Mybatis Log Plugin

    推荐指数:


    Mybatis现在是java中操作数据库的首选,在开发的时候,我们都会把Mybatis的脚本直接输出在console中,

    但是默认的情况下,输出的脚本不是一个可以直接执行的。

    如果我们想直接执行,还需要在手动转化一下,比较麻烦。
    MyBatis Log Plugin 这款插件是直接将Mybatis执行的sql脚本显示出来,无需处理,可以直接复制出来执行的 。

    注意其转换的SQL不是输出到IDE的控制台!!!

    需要到Tools -- >  Mybatis Log Plugin  打开其日志框(如果Tools下面没有的话,可以看下IDE的底部最右下角是否有"Mybatis Log"Tab按钮),

    再执行, 效果是不是很赞

    插件是收费的,各位在力所能及的情况下请支持正版。如果想学习研究下,可以自行百度→_→。


    3、MybatisCodeHelperPro

    推荐指数:★★★★★


    这款插件我认为基本是目前mybatis相关插件中功能最强大的插件了,插件本身大部分功能都是免费的,也基本能满足日常开发需要,收费功能可以根据个人需要酌情购买。

    ​​​​​​插件未激活与激活状态的功能比较 未激活版的功能可以免费一直使用下去

    功能点未激活版激活版
    接口与xml互相跳转 更换图标
    接口方法名重构
    一键添加param
    xml中的 param的自动提示 resultMap refid 等的自动提示
    resultMap中的property的自动提示
    检测没有使用的xml 可一键删除
    检测mybatis接口中方法是否有实现,没有则报红 可创建一个空的xml方法块
    检测resultmap的property是否有误
    支持spring 将mapper注入到spring中 intellij的spring注入不再报错 支持springboot
    一键生成分页查询
    一键添加resultMap中未被使用的属性
    一键生成mybatis接口的testcase
    通过方法名生成sql
    通过数据库生成crud代码
    通过java类生成crud代码
    xml collection中的 param提示
    识别mybatis的标签 全自动sql补全
    检测#{中的参数是否正确
    if test when test foreach collection $中的OGNL支持
    param重构功能(2.7.2)
    resultMap column提示与检测

     功能演示:mybatisCodeHelper2.6_哔哩哔哩_bilibili

     作者作品的Github:https://github.com/gejun123456/MyBatisCodeHelper-Pro

    搭配Mybatis Log Plugin使用用,基本可以将mybatis的开发使用效率最大化!

    如果平时只使用“接口与xml互相跳转”与“mybatis自动补全及语法错误提示”这两个基本功能,其实free mybatis plugin就可以满足,而且是免费的。


    4、Grep Console

    推荐指数:★★☆☆☆


    由于Intellij idea不支持显示ascii颜色,grep-console插件能很好的解决这个问题, 可以设置不同级别log的字体颜色和背景色.

    自定义设置后,可以运行下项目看下效果 

    加上背景色,错误和警告是不是更清晰了些? 


    5、CodeGlance 

    推荐指数:★★★☆☆


    CodeGlance是一款代码编辑区缩略图插件,可以快速定位代码,使用起来比拖动滚动条方便多了

    并且可以自定义一些设置:


    6、GenerateAllSetter

    推荐指数:★★★☆☆ 


    一款效率插件,它主要有以下功能: 

    • 通过alt+enter对变量类生成对类的所有setter方法的调用
    • 当两个对象具有相同的字段时生成一个转换器
    • 当returnType为List Set Map时生成默认值
    • 在所有getter方法上生成对assertThat的调用

    Screenshot 2

    Screenshot 1


    7、RestfulToolkit

    推荐指数:★★★★★


    一套 RESTful 服务开发辅助工具集。

    • 1.根据 URL 直接跳转到对应的方法定义 ( 快捷键搜索 Ctrl + Alt + N 或者 Ctrl  + \ ); ---这个个人感觉非常好用,和Ctrl + F一样重要。
    • 2.提供了一个 Services tree 的显示窗口;
    • 3.一个简单的 http 请求工具;
    • 4.在请求方法上添加了有用功能: 复制生成 URL;,复制方法参数...
    • 5.其他功能: java 类上添加 Convert to JSON 功能,格式化 json 数据 ( Windows: Ctrl + Enter; Mac: Command + Enter )。


    8、Maven Helper 

    推荐指数:★★★★★


    分析依赖冲突插件

    此插件可用来方便显示maven的依赖树,在没有此插件时,如果想看maven的依赖树需要输入命令行: mvn dependency:tree  才可查看依赖。如果想看是否有依赖包冲突的话也需要输入命令行等等的操作。而如果安装Maven Helper插件就可免去命令行困扰。通过界面即可操作完成。

    使用方式:

    打开项目中的pom文件,在底部会显示一个“Dependency Analyzer”,

    点击此按钮,切换到此工具栏

    可进行相应操作:

    • Conflicts(查看冲突)
    • All Dependencies as List(列表形式查看所有依赖)
    • All Dependencies as Tree(树形式查看所有依赖)
    • 搜索功能

    9、JRebel

    推荐指数:★★★☆☆


    热部署插件,让你在修改完代码后,不用再重新启动,很实用!但是,不是免费的,需要大家继续发挥下自己的聪明才智才能happy的使用(学习研究→_→。)!

    (附一个参考地址:薯条 SpringBoot 在IDEA中实现热部署 (JRebel实用版)_薯条的博客-CSDN博客_jrebel springboot

    安装好之后界面布局: 

     检查几个必要的设置看是否已配置,否则热部署可能没效果:

    1)设置项目自动编译

    2)设置 compiler.automake.allow.when.app.running 

    快捷键ctrl+shift+A 或者 菜单help->find action…打开搜索框搜索“registry”

     

    3)需要热部署的项目在此处是否勾选


    10、 Json Parser

    推荐指数:★★★★☆


    厌倦了打开浏览器格式化和验证JSON?为什么不安装JSON解析器并在IDE中使用离线支持呢?JSON解析器是一个用于验证和格式化JSON字符串的轻量级插件。

    Screenshot 1


    11、Translation

    推荐指数:★★★★★


    中英文翻译工具,之所以要把它也单独列出来,是使用起来真的很方便,不用再和其他翻译工具之间来回切换了。

    官方介绍的特点:

    • 多种翻译引擎.
      • 谷歌翻译.
      • 雅虎翻译.
      • 百度翻译.
    • 多种语音互译.
    • 文档注释翻译
    • 文本转语音
    • 自动选词

    使用方式:

    安装成功后,会在如图区域显示两个图标,

    可以点击图标调出不同的对话框进行搜索翻译
     

    当然也可以选中要翻译的文本,然后右键,

    选择Translate,可以直接调出翻译面板,

    选择Translate and Replace,可以直接将翻译结果显示在下拉框中,选择合适的点击之后会自动替换当前文本

    以上两个右键操作可以使用快捷键 Ctrl + Shift + Y 和 Ctrl + Shift + X来代替

    还有一种非常好用的功能,对于英文不是太好阅读源码英文文档比较吃力的,可以实现一键翻译,very nice!

    就拿阅读java.lang.String的源码来说,进入到内部后,使光标处在文档注释区域,随便任何位置,然后右键,选择Translate Documentation,立马就有翻译出来,并且自动排版,非常易于阅读


    12、aiXcode & codota

    推荐指数:★★★★☆


    aiXcoder是一个强大的代码完成器和代码搜索引擎,基于最新的深度学习技术。 它有可能向您推荐一整套代码,这将帮助您更快地编写代码。 aiXcoder还提供了一个代码搜索引擎,以帮助您在GitHub上搜索API用例。

    类似功能的插件还有codota,
    codota基于数百万个开源Java程序和您的上下文来完成代码行,从而帮助您以更少的错误更快地进行编码。新版本的codota提供以下功能:

    • 全线AI自动完成
    • 内联和相关代码示例
    • 根据用户自己的编码实践进行编码建议

    不用担心你的代码会被公开。 codota不会将你的代码发送到codota服务器,它只会从当前编辑的文件中发送最少的上下文信息,从而使codota能够根据你当前的本地范围进行预测。

    个人觉得代码示例功能要比aiCode的代码搜索引擎要方便好用的多,

     比如我想知道list.stream.map(..)方法的参考使用,只需要光标定位在map上,然后右键选择菜单“Get relevant examples”或者使用快捷键“Ctrl + Shift + O”就可以快速搜索出来很多示例,非常方便。

    其实个人觉得IDEA自带的代码自动提示补全功能就已经非常智能好用,如果只是想使用这一功能,就没必要再装以上两款插件。


    福利插件^_^

    推荐指数:★★★★★★★★★★★


    只要你知道JetBrains全线产品现在已经是由中国CSDN代理的,所以这方面就不多做介绍了,懂得都懂,言多必“失”(┬_┬)


    三、主题美化插件


    1、Material Theme UI

    Material Theme UI是JetBrains IDE(IntelliJ IDEA,WebStorm,Android Studio等)的插件,可将原始外观更改为Material Design外观。
    该插件最初受Sublime Text的Material Theme启发,提供了一系列的设置,可按所需方式调整IDE。 除了令人印象深刻的主题调色板外,它还提供:

    • 漂亮的配色方案支持绝大多数语言
    • 用彩色的“材料设计”图标替换所有图标
    • 自定义大多数IDE的控件和组件

    安装后重启IDE会先进入主题设置导航页,按照提示一步一步设置

    设置好后的效果

     还可以继续在setting中进行自定义设置:


    2、字体美化 


    Intellij IDEA 公司 JetBrains 推出了一种新字体:JetBrains Mono,它是专为开发人员设计的。从 2019.3 版本开始,JetBrains Mono 字体将随 JetBrains 系列 IDEs 一起提供。老版本的话,,安装方式可以参见本博客另一文章介绍:
    IDEA JetBrains Mono字体介绍和安装


    四、其他还有一些插件,根据实际情况选择使用 


    • Java代码格式规范:CheckStyle
    • 自动生成序列图插件:SequenceDiagram
    • 快捷键提示工具:Key promoter X
    • 代码注解插件: Lombok
    • 代码生成工具:CodeMaker
    • 代码质量检查工具:SonarLint
    • 单元测试测试生成工具:JUnitGenerator
    • Mybatis 工具:Free Mybatis plugin
    • JSON转领域对象工具:GsonFormat
    • 字符串工具:String Manipulation
    • Redis可视化:Iedis
    • K8s工具:Kubernetes
    • 彩虹颜色括号:Rainbow Brackets
    • 阿里代码规约检测:Alibaba Java Coding Guidelines

     最后建议^_^,插件宜少不宜多,选择最适合最需要使用的就行,不必贪多,否则可能会适得其反,IDEA会变得臃肿卡顿,反而影响开发效率。 


    欢迎大家留言推荐自己觉得好用的插件#^_^#

    展开全文
  • 动态图片展示一方面能使用AJAX或Flash实现图片数据的异步获取,减少浏览的等待时间;一方面使用JavaScript+CSS定制友好的用户体验模式,是图片展览web应用程序开发的一大利器。这里收集的框架都是经过测试可用的,...
  • 关于提高效率的几点

    千次阅读 2014-08-21 20:36:45
    完美主义倾向越高的教授就越没有效率。 当一位完美主义者有以下问题: 他们在一项花费的时间比任务要求所花费的时间还多。 他们会拖延并等到最佳的时刻。 在企业中,如果这是最完美的时刻,就代表已经太迟...

    有些时候感觉一直没闲着却没看见多少成果。突然看见这篇文章(http://www.cppfans.org/1644.html),虽然不能全部认同,但是的确有些部分还是值得思考的。

    以下为转载:


    一、不要太常说「yes」

    根据80/20 法则(Pareto Principle),20% 的努力创造80% 的成果,20% 的成果消耗80% 的时间。 不是努力工作,我们应该把注意力放在创造80% 的结果并放弃其余的。 我们应该把更多时间放在最重要的任务。 我们应该停止对低效能与无效能的任务说:「好的,我来做」 。

    「成功的人」与「非常成功的人」之间的差异在于,非常成功的人对几乎所有的事情都说不。
    — Warren Buffet

    激发一个问题:什么事情要说yes,什么事情说no? 如果您不能想出某些值得花时间的地方,就考虑作个小测试找出答案:追踪您作的所有事情,可能的话持续优化处理的过程。

    通常人们说「yes」的频率比实际上应该的次数还要多,因为说「yes」比说「no」要简单太多,没有想要当坏人。

    320140512222209

    2012 研究发表在Journal of Consumer Research,研究者将120 个学生分成两组。 一组被训练为说「我不能(I can’t)」,然而其他被训练为「我不要(I don’t)」。 结果很有趣:

    对自己说「我不能吃X」的学生,61% 都会选择吃巧克力糖,同时,对自己说「我不要吃X」的学生,只有36 % 会选择吃巧克力糖。 光是简单的词汇替换,就能显著增加人们选择更健康食品的机率。 (延伸阅读: 拒当YES MAN,说「不」让生活更美好 。)


    二、停止完美主义

    Dalhousie University心理学教授Simon Sherry博士Simon Sherry执行一项完美主义与生产力的研究 ,她指出:我们发现完美主义是绊倒教授的研究生产力的大石头。 完美主义倾向越高的教授就越没有效率。

    当一位完美主义者有以下问题:

    • 他们在一项花费的时间比任务要求所花费的时间还多。
    • 他们会拖延并等到最佳的时刻。 在企业中,如果这是最完美的时刻,就代表已经太迟了。
    • 他们过度聚焦在细节,反而忽略整体。

    三、停止作重复的事情,并使它自动化

    根据一项Tethy Solutions的研究 ,一个5人团队分别花3%、20%、25%、30%与70%的时间处理相同的事情,导入工作自动化软体两个月后,分别将处理重复事情的时间降至3%、10%、15%、15% 与10%。

    520140512222249

    人们时常忘记时间就是金钱,因此经常土法炼钢地处理事情,因为这样比较容易,且不需要花费心力研究。 假设您办了一个Instagram 活动,号召网友上传的照片总数只有30 张,您可以手动一张一张处理。 但如果总共有从5个不同平台上传的30000张照片与影片时,您就需要一个好的数位管理系统了(例如Filemobile)。

    给行销人员的小撇步 :到GitHub或Google app script library,通常会发现免费且可马上使用的开源程式码,让您找到省去手动处理重覆工作的软体/程式。

    四、停止猜测,并开始用数据支撑决策

    如果您可以在搜寻引擎上优化网站,那么您也可以优化您的人生,让它成长并发挥最大的潜能。

    不同领域的研究其实都可供参考,举例来说,宾州州立大学心理系助理教授Robert Matchock 所执行的研究发现,大部分的人们最容易分心的时间是从中午到下午四点。 此数据便提供您作工作相关决策的考量。 假使您无法从现有研究找到答案,那么您也可以自行执行简单的测试。

    举例来说,Filemobile就制定了许多测试,试图找出如何优化Twitter的图片呈现 。

    不断询问您自己:要如何测量并优化所有事情呢?

    五、停止工作,并拥有无所事事的时间

    大部分的人都没有了解到,当我们专注在某件事上,基本上就像是把自己锁在一个箱子里。 很重要的是要每隔一段时间离开工作现场,享受独处的时光。 独处时光对大脑与灵魂都有益处(注四):

    一项哈佛研究指出,当人们相信他们是单独经验某项事情时,脑海的记忆会更持久且更精确。 另外一个研究也指出体验相当程度的孤独会让一个人更能够同理他人……相当程度的孤独可以帮助青少年改善心情与获得好成绩。

    我们不会因为熬夜而更有效率。 就像是生命中的每件事情,需要耗费心力。 如果您什么都不做只是坐着等,不会有什么改变,所以我们要更了解自己的限制与潜能,并将精力作有效的配置,过一个更成功、更快乐的人生。



    展开全文
  • 读取文件夹下所有图片,把像素点分别按r\g\b通道读出来处理,不知道为什么读图很慢,一百多张图等好一会,有没有什么优化代码的建议? ``` import sys import os import time import random import numpy as np...
  • 前一段在做一个功能的时候必须加载外部多张连续的图片,来实现一个简单的小动画。...我们在使用unity的UGUI中的图片的时候,绝大多数人都是使用Image这个组件,而大家基本上很容易忽略掉这个组件的使用效率问题,因为都

    前一段在做一个功能的时候必须加载外部多张连续的图片,来实现一个简单的小动画。本来是一个非常简单的功能,不用两分钟就写好了。但是最终打成apk测试的时候有个非常大的问题就是非常卡,图片播放卡的简直不忍直视,后来去看unity的官方文档,发现了一个非常好用的方法。
    我们在使用unity的UGUI中的图片的时候,绝大多数人都是使用Image这个组件,而大家基本上很容易忽略掉这个组件的使用效率问题,因为都是在unity创建好的sprite直接赋值所以 看不出来有什么问题,但是如果你是直接动态加载外部的或者下载的图片你就会发现加载的时候特别卡,特别是越大,越不规则的图片更是耗时。但是还有个被大家忽略的组件就是RawImage,这个组件可以说是Image的简化版,它的功能虽然少很多但是几个基本的功能都在,最主要的是它可以直接赋值texture图片,这里大家可以不是很清楚,所以没有什么比直接写代码更直接的方式了:

        public void ImageAssignment()  //Image组件赋值方法
        {
            var path = Application.streamingAssetsPath + "/icon.png"; //外部图片地址
            var tex = ResLoader.DownloadSync(path).texture; //使用www加载外部图片(这个方法是自己写的, 不会的话自己上网百度下)
            var sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
            ImageObject.sprite = sprite;
        }
    
        public void RawImageAssignment()  //RawImage组件赋值方法
        {
            var path = Application.streamingAssetsPath + "/icon.png"; //外部图片地址
            var tex = ResLoader.DownloadSync(path).texture; //使用www加载外部图片(这个方法是自己写的, 不会的话自己上网百度下)
            RawImageObject.texture = tex;
        }

    有什么发现么?使用RawImage加载外部图片是不是直接少了一行代码,然道仅仅只是一行代码那么简单么?接下来,我再给大家看一下我做的几个加载时间的对比:
    1、512*512图片两种方式 赋值100次的对比
    image.png
    2、1024*512图片两种方式 赋值100次的对比
    image.png
    3/1112*900图片两种方式 赋值100次的对比
    image.png
    看了这些数据 你会发现我说的 提高百倍以上的效率真的是一点都不夸张啊。
    这里可以看到使用RawImage 不管加载什么分辨率的图片 效率都是基本 差不多快到可以忽略不计,而使用Image却是会因为图片的分辨率大受影响。主要的原因就是在创建sprite这一步特别耗时,而且图片越大、越不规则就会越耗时。所以你应该知道怎么做了吧!
    最后贴上代码 供大家参考,互相学习

    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    using Babybus.Uno;
    
    public class TestImageLoad : MonoBehaviour
    {
        public Image ImageObject;
    
        public RawImage RawImageObject;
    
        public void OnClickImageButton() //Image组件赋值方法
        {
            var path = Application.streamingAssetsPath + "/icon.png";//外部图片地址
            var tex = ResLoader.DownloadSync(path).texture;//使用www加载外部图片(这个方法是自己写的, 不会的话自己上网百度下)
            var time = Time.realtimeSinceStartup;
            for (var i = 0; i < 100; i++)
            {        
                var sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
                ImageObject.sprite = sprite;
            }
            Debug.Log("Image赋值100次使用时间: " + (Time.realtimeSinceStartup-time));
        }
    
    
        public void OnClickRawImageButton()//RawImage组件赋值方法
        {
            var path = Application.streamingAssetsPath + "/icon.png";//外部图片地址
            var tex = ResLoader.DownloadSync(path).texture;//使用www加载外部图片(这个方法是自己写的, 不会的话自己上网百度下)
            var time = Time.realtimeSinceStartup;
            for (var i = 0; i < 100; i++)
                RawImageObject.texture = tex;
            Debug.Log("RawImage赋值100次使用时间: " + (Time.realtimeSinceStartup - time));
        }
    
    }
    using System;
    using System.Collections;
    using UnityEngine;
    
    namespace Babybus.Uno
    {
        public static class ResLoader
        {
            public static WWW DownloadSync(string path, WWWForm form = null)
            {
                WWW www;
                if (form != null)
                    www = new WWW(path.ToWWWUrl(), form);
                else
                    www = new WWW(path.ToWWWUrl());
    
                YieldToStop(www);
    
                return www;
            }
    
            private static void YieldToStop(WWW www)
            {
                var @enum = DownloadEnumerator(www);
                while (@enum.MoveNext()) ;
            }
    
            private static IEnumerator DownloadEnumerator(WWW www)
            {
                while (!www.isDone) ;
    
                yield return www;
            }
        }
    }
    展开全文
  • 转载请说明原出处,谢谢~·http://blog.csdn.net/zhuhongshu/article/details/49026605 好长时间没写duilib博客了,最近在写毕业... Duilib的图片绘制代码中有个影响性能的地方,所有的控件的图片绘制都是调用CCont

    转载请说明原出处,谢谢~·http://blog.csdn.net/zhuhongshu/article/details/51245751


             好长时间没写duilib博客了,最近在写毕业设计,毕设的软件界面自然就用比较熟悉的Duilib来搞了,正好把Duilib的一些地方一起改改。


             Duilib的图片绘制代码中有个影响性能的地方,所有的控件的图片绘制都是调用CControlUI的DrawImage函数,而此函数调用了CRenderEngine的DrawImageString函数。在绘制图片时,DrawImageString会解析图片字符串的属性,然后找到对片的HBITMAP资源,最后调用真正的绘图函数去绘制。问题就在于每绘制一个图片都会再次解析一次字符串,当界面比较复杂,而且图片字符串也比较复杂时,这个解析的过程就影响了程序效率。


             实际上这个字符串在被赋值后,只需要解析一次,然后缓存起来就可以了,在绘制图片时直接用缓存好的图片属性数据。使用内存换效率的方法可以进一步提高Duilib的效率。


            写了一个图片属性解析类,代替原本的图片字符串,并且去掉了原本的DrawImageString函数。


    class UILIB_API CImageAttribute
    {
    public:
    	CImageAttribute();
    	CImageAttribute(const CImageAttribute&);
    	const CImageAttribute& operator=(const CImageAttribute&);
    	virtual ~CImageAttribute();
    
        CDuiString GetAttributeString() const;
    	void SetAttributeString(LPCTSTR pStrImageAttri);
    	void ModifyAttribute(LPCTSTR pStrModify);
    	bool LoadImage(CPaintManagerUI* pManager);
    	bool IsLoadSuccess();
    
    	operator LPCTSTR() const;
    	bool operator ==(LPCTSTR pStrImage) const;
    	const CDuiString& operator=(const CDuiString& src);
    	const CDuiString& operator=(const TCHAR ch);
    	const CDuiString& operator=(LPCTSTR pstr);
    private:
    	void Clone(const CImageAttribute&);
    	void Clear();
    	void ParseAttribute(LPCTSTR pStrImageAttri);
    
    protected:
    	friend class CRenderEngine;
    	CDuiString	m_sImageAttribute;
    
    	CDuiString	m_sImage;
    	CDuiString	m_sResType;
    	TImageInfo	*m_imageInfo;
    	bool		m_bLoadSuccess;
    
    	RECT	m_rcDest;
    	RECT	m_rcSource;
    	RECT	m_rcCorner;
    	BYTE	m_bFade;
    	DWORD	m_dwMask;
    	bool	m_bHole;
    	bool	m_bTiledX;
    	bool	m_bTiledY;
    
    };
    

    	CImageAttribute::CImageAttribute()
    	{
    		Clear();
    	}
    
    	CImageAttribute::CImageAttribute(const CImageAttribute& image)
    	{
    		Clone(image);
    	}
    
    	const CImageAttribute& CImageAttribute::operator=(const CImageAttribute& image)
    	{
    		Clone(image);
    		return *this;
    	}
    
    	void CImageAttribute::Clone(const CImageAttribute& image)
    	{
    		m_sImageAttribute = image.m_sImageAttribute;
    
    		m_sImage = image.m_sImage;
    		m_sResType = image.m_sResType;
    		m_imageInfo = image.m_imageInfo;
    		m_bLoadSuccess = image.m_bLoadSuccess;
    
    		m_rcDest = image.m_rcDest;
    		m_rcSource = image.m_rcSource;
    		m_rcCorner = image.m_rcCorner;
    		m_bFade = image.m_bFade;
    		m_dwMask = image.m_dwMask;
    		m_bHole = image.m_bHole;
    		m_bTiledX = image.m_bTiledX;
    		m_bTiledY = image.m_bTiledY;
    	}
    
    	CImageAttribute::~CImageAttribute()
    	{
    
    	}
    
    	CDuiString CImageAttribute::GetAttributeString() const
    	{
    		return m_sImageAttribute;
    	}
    
    	void CImageAttribute::SetAttributeString(LPCTSTR pStrImageAttri)
    	{
    		if (m_sImageAttribute == pStrImageAttri)
    			return;
    
    		Clear();
    
    		m_sImageAttribute = pStrImageAttri;
    		m_sImage = m_sImageAttribute;
    		ParseAttribute(pStrImageAttri);
    	}
    
    	bool CImageAttribute::LoadImage(CPaintManagerUI* pManager)
    	{
    		if (m_imageInfo != NULL)
    			return true;
    		if (!m_bLoadSuccess)
    			return false;
    
    		const TImageInfo* data = NULL;
    		if (m_sResType.IsEmpty())
    		{
    			data = pManager->GetImageEx((LPCTSTR)m_sImage, NULL, m_dwMask);
    		}
    		else
    		{
    			data = pManager->GetImageEx((LPCTSTR)m_sImage, (LPCTSTR)m_sResType, m_dwMask);
    		}
    		if (data == NULL)
    		{
    			m_bLoadSuccess = false;
    			return false;
    		}
    		else
    		{
    			m_bLoadSuccess = true;
    		}
    		
    		if (m_rcSource.left == 0 && m_rcSource.right == 0 && m_rcSource.top == 0 && m_rcSource.bottom == 0)
    		{
    			m_rcSource.right = data->nX;
    			m_rcSource.bottom = data->nY;
    		}
    		if (m_rcSource.right > data->nX) m_rcSource.right = data->nX;
    		if (m_rcSource.bottom > data->nY) m_rcSource.bottom = data->nY;
    		m_imageInfo = const_cast<TImageInfo*>(data);
    
    		return true;
    	}
    
    	bool CImageAttribute::IsLoadSuccess()
    	{
    		return !m_sImageAttribute.IsEmpty() && m_bLoadSuccess;
    	}
    
    	void CImageAttribute::ModifyAttribute(LPCTSTR pStrModify)
    	{
    		ParseAttribute(pStrModify);
    	}
    
    	void CImageAttribute::Clear()
    	{
    		m_sImageAttribute.Empty();
    		m_sImage.Empty();
    		m_sResType.Empty();
    		m_imageInfo = NULL;
    		m_bLoadSuccess = true;
    		ZeroMemory(&m_rcDest, sizeof(RECT));
    		ZeroMemory(&m_rcSource, sizeof(RECT));
    		ZeroMemory(&m_rcCorner, sizeof(RECT));
    		m_bFade = 0xFF;
    		m_dwMask = 0;
    		m_bHole = false;
    		m_bTiledX = false;
    		m_bTiledY = false;
    	}
    
    	void CImageAttribute::ParseAttribute(LPCTSTR pStrImage)
    	{
    		if (pStrImage == NULL)
    			return;
    
    		// 1、aaa.jpg
    		// 2、file='aaa.jpg' res='' restype='0' dest='0,0,0,0' source='0,0,0,0' corner='0,0,0,0' 
    		// mask='#FF0000' fade='255' hole='false' xtiled='false' ytiled='false'
    		CDuiString sItem;
    		CDuiString sValue;
    		LPTSTR pstr = NULL;
    
    		while (*pStrImage != _T('\0'))
    		{
    			sItem.Empty();
    			sValue.Empty();
    			while (*pStrImage > _T('\0') && *pStrImage <= _T(' ')) pStrImage = ::CharNext(pStrImage);
    			while (*pStrImage != _T('\0') && *pStrImage != _T('=') && *pStrImage > _T(' '))
    			{
    				LPTSTR pstrTemp = ::CharNext(pStrImage);
    				while (pStrImage < pstrTemp)
    				{
    					sItem += *pStrImage++;
    				}
    			}
    			while (*pStrImage > _T('\0') && *pStrImage <= _T(' ')) pStrImage = ::CharNext(pStrImage);
    			if (*pStrImage++ != _T('=')) break;
    			while (*pStrImage > _T('\0') && *pStrImage <= _T(' ')) pStrImage = ::CharNext(pStrImage);
    			if (*pStrImage++ != _T('\'')) break;
    			while (*pStrImage != _T('\0') && *pStrImage != _T('\''))
    			{
    				LPTSTR pstrTemp = ::CharNext(pStrImage);
    				while (pStrImage < pstrTemp)
    				{
    					sValue += *pStrImage++;
    				}
    			}
    			if (*pStrImage++ != _T('\'')) break;
    			if (!sValue.IsEmpty())
    			{
    				if (sItem == _T("file") || sItem == _T("res"))
    				{
    					m_sImage = sValue;
    				}
    				else if (sItem == _T("restype"))
    				{					
    					m_sResType = sValue;
    				}
    				else if (sItem == _T("dest"))
    				{
    					m_rcDest.left = _tcstol(sValue.GetData(), &pstr, 10);  ASSERT(pstr);
    					m_rcDest.top = _tcstol(pstr + 1, &pstr, 10);    ASSERT(pstr);
    					m_rcDest.right = _tcstol(pstr + 1, &pstr, 10);  ASSERT(pstr);
    					m_rcDest.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
    				}
    				else if (sItem == _T("source"))
    				{
    					m_rcSource.left = _tcstol(sValue.GetData(), &pstr, 10);  ASSERT(pstr);
    					m_rcSource.top = _tcstol(pstr + 1, &pstr, 10);    ASSERT(pstr);
    					m_rcSource.right = _tcstol(pstr + 1, &pstr, 10);  ASSERT(pstr);
    					m_rcSource.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
    				}
    				else if (sItem == _T("corner"))
    				{
    					m_rcCorner.left = _tcstol(sValue.GetData(), &pstr, 10);  ASSERT(pstr);
    					m_rcCorner.top = _tcstol(pstr + 1, &pstr, 10);    ASSERT(pstr);
    					m_rcCorner.right = _tcstol(pstr + 1, &pstr, 10);  ASSERT(pstr);
    					m_rcCorner.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
    				}
    				else if (sItem == _T("mask"))
    				{
    					if (sValue[0] == _T('#')) m_dwMask = _tcstoul(sValue.GetData() + 1, &pstr, 16);
    					else m_dwMask = _tcstoul(sValue.GetData(), &pstr, 16);
    				}
    				else if (sItem == _T("fade"))
    				{
    					m_bFade = (BYTE)_tcstoul(sValue.GetData(), &pstr, 10);
    				}
    				else if (sItem == _T("hole"))
    				{
    					m_bHole = (_tcscmp(sValue.GetData(), _T("true")) == 0);
    				}
    				else if (sItem == _T("xtiled"))
    				{
    					m_bTiledX = (_tcscmp(sValue.GetData(), _T("true")) == 0);
    				}
    				else if (sItem == _T("ytiled"))
    				{
    					m_bTiledY = (_tcscmp(sValue.GetData(), _T("true")) == 0);
    				}
    			}
    			if (*pStrImage++ != _T(' ')) break;
    		}
    	}
    
    	CImageAttribute::operator LPCTSTR() const
    	{
    		return m_sImageAttribute;
    	}
    
    	bool CImageAttribute::operator==(LPCTSTR pStrImage) const
    	{
    		return m_sImageAttribute == pStrImage;
    	}
    
    	const CDuiString& CImageAttribute::operator=(const CDuiString& src)
    	{
    		SetAttributeString(src);
    		return m_sImageAttribute;
    	}
    
    	const CDuiString& CImageAttribute::operator=(LPCTSTR lpStr)
    	{
    		SetAttributeString(lpStr);
    		return m_sImageAttribute;
    	}
    
    	const CDuiString& CImageAttribute::operator=(const TCHAR ch)
    	{
    		m_sImageAttribute = ch;
    		SetAttributeString(m_sImageAttribute);
    		return m_sImageAttribute;
    	}

           对CControlUI控件的修改如下:

    bool CControlUI::DrawImage(HDC hDC, CImageAttribute& image, const RECT& rcDest, LPCTSTR pStrModify /*= NULL*/)
    {
    	if (!image.LoadImage(m_pManager))
    		return false;
    
    	if (pStrModify != NULL)
    	{
    		CImageAttribute modifyImage = image;
    		modifyImage.ModifyAttribute(pStrModify);
    		return CRenderEngine::DrawImage(hDC, m_pManager, rcDest, m_rcPaint, modifyImage);
    	}
    	return CRenderEngine::DrawImage(hDC, m_pManager, rcDest, m_rcPaint, image);
    }
    

           为CRenderEngine类新增DrawImage函数代替DrawImageString函数:

    bool CRenderEngine::DrawImage(HDC hDC, CPaintManagerUI* pManager, const RECT& rcControl, const RECT& rcPaint, CImageAttribute& image)
    {
    	if ((pManager == NULL) || (hDC == NULL))
    		return false;
    
    	if (image.m_sImage.IsEmpty())
    		return false;
    
    	TImageInfo* data = image.m_imageInfo;
    	if (!data) return false;
    
    	RECT rcDest = image.m_rcDest;
    	rcDest.left += rcControl.left;
    	rcDest.top += rcControl.top;
    	rcDest.right = rcDest.left + rcControl.right;
    	if (rcDest.right > rcControl.right)
    		rcDest.right = rcControl.right;
    	rcDest.bottom = rcDest.top + rcControl.bottom;
    	if (rcDest.bottom > rcControl.bottom)
    		rcDest.bottom = rcControl.bottom;
    
    	RECT rcTemp;
    	if (!::IntersectRect(&rcTemp, &rcDest, &rcControl)) return true;
    	if (!::IntersectRect(&rcTemp, &rcDest, &rcPaint)) return true;
    
    	CRenderEngine::DrawImage(hDC, data->hBitmap, rcDest, rcPaint, image.m_rcSource, image.m_rcCorner,
    		pManager->IsBackgroundTransparent() ? true : data->alphaChannel,
    		image.m_bFade, image.m_bHole, image.m_bTiledX, image.m_bTiledY);
    
    	return true;
    }
    


    总结:

            这次修改的内容比较多,因为每个控件原本都有图片字符串,所以我把很多控件的绘制代码对应的修改了,这些就不贴了。所有控件的修改我都提交到我个人的Duilib库中: 点击打开链接


    Redrain QQ:491646717 2016.4.26

    展开全文
  • 关于提高AlphaBlend效率的思考

    千次阅读 2010-10-12 15:55:00
    关于提高AlphaBlend效率的思考
  • 一些提高工作效率的黑科技软件

    万次阅读 多人点赞 2019-11-22 14:26:55
    一款记忆神器软件,它使记忆变得更加容易, 它可以一个自定义多功能的记忆方式, 减少学习时间,提升你的学习容量, 提高学习效率。不论你是学生还是正在工作中的,不论任何专业,任何职业,只要你想学习,想更有效率的...
  • Python由于有全锁局的存在,并不能利用多核优势。所以,如果你的多线程进程是CPU密集型的,那多线程并不能带来效率上的提升,...如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行其他线程,提升效率
  • 在职场办公时,常常需要处理各种Word文档,所以这就要求我们对Word知识要更加熟练,今天这里就和大家分享在word中怎样快速对齐图片,以及一些其它Word小技巧,希望可以带来帮助。 一:快速对齐图片 先选中第一张...
  • 提升前端效率的方式

    2018-05-07 00:03:05
    对于开发效率,我个人理解是开发效率 = 新增代码的效率 + 修改代码的效率 + 维护代码的效率那么如何提高前端开发效率便可以按照前端工程化的理念来进行划分。下面我就介绍下7个提高前端开发效率的方法。 前端工...
  • 利用NSCache提升效率

    千次阅读 2013-05-31 17:57:12
    在ios中,苹果提供了,NSCache类和NSDictionary很相似,提供key,value的存储,不一样的是NSCache在...解决办法就是把NSData对象缓存起来,先从NSCache里面读取数据,然后再从文件系统获取数据,提高效率。 方法如下
  • 工作中提升效率的工具

    万次阅读 2017-09-02 21:02:43
    本文主要介绍下工作中提升效率的工具: 首先是浏览器chrome/firefox,有很多有用的插件护眼模式 github octree 查看插件 收藏夹插件 免密码输入LastPass 广告屏蔽插件AdBlock 直接打开书签插件Holmes youtube视频...
  • GDI+ GDI提高效率

    2013-04-26 17:28:20
    2、PixelFormat,原来没想到这个也会影响效率,但事实证明确实是这样。 Bitmap在new出来的时候是和图片本身的格式有关的,但在最终画到DC上的可不一定是这个格式,具体的格式请查阅MSDN:Image Pixel Format ...
  • 效率OCR场景文字图片合成工具发布!

    千次阅读 多人点赞 2021-04-03 10:15:21
    OCR,光学字符识别(OPTICAL ...作为计算机视觉领域的OCR识别在训练的时候当然也会需要大量的图片数据来供神经网络的学习,一般需要数以千万计的图片才能训练一个文字识别系统,才能达到识别文字的目的。但是如果采用
  • 【iOS】利用NSCache提升效率

    千次阅读 2014-08-28 15:37:26
    利用NSCache提升效率 在ios中,苹果提供了,NSCache类和NSDictionary很相似,提供key,value的存储,不一样的是NSCache在内存吃紧的时候会做自动释放。 遇到一个问题是,在使用大量图片的app中,需要...
  • 好用的Chrome扩展插件推荐集合,性能提升效率提高!   Michael_翔_ 关注 2015.11.20 18:46* 字数 2411 阅读 15597评论 9喜欢 52 Chrome michael翔的小屋-chrome扩展集合 虽然Chrome浏览器是个...
  • 就 3 点,提升工作效率

    万次阅读 多人点赞 2017-08-09 09:10:12
    要想提高工作效率,不论你看什么书,看什么文章,用什么工具,只有下面这三点最重要
  • 大量小文件存储提高效率要点详解

    千次阅读 2020-05-13 15:45:54
    但是当你有大量的用户,大量的图片的时候,我们怎么存储图片文件,就会直接影响整个图片存储系统的效率。 通常,有一种说法是:如1个目录下有10000个子文件,那么读取某个文件的速度将会明显下降。那这种说法到底...
  • 在工作中,我们会接触到大量的信息,如何将这些信息管理好就成了问题,在本场 Chat 中,我将为你分享如何更好的使用印象笔记来提升工作效率。在本场 Chat 中你可以学到的: 如何构建印象笔记资料库体系 如何借助...
  • 10个python办公黑科技,助你办公效率提高100倍

    万次阅读 多人点赞 2021-06-02 11:46:55
    在计算机中,编写程序需要使用计算机编程语言,由于种类及针对性不同,计算机语言存在上百种,那对于目前日益复杂的办公需求,到底什么语言才可以提高我们的办公效率呢?如今有了一个答案,这个热门的语言叫做 ...
  • 昨天在看别人blog的时候发现DW有这么一个东西。叫做代码片断。我们可以将常用的css定义写一个代码片断。...还有自己的一些菜单、图片、等等的样式定义,我们都可以在日常的工作中保存成片断。这样过一段

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 240,038
精华内容 96,015
关键字:

关于提高效率的图片