中文汉字注音,汉字转拼音,支持图片识别文字,支持结果转图下载,附上小程序核心源码

“文字注音”在微信、头条、抖音、支付宝、QQ中搜索“文字注音”即可获得。

一、功能

汉字转拼音,支持图片识别文字,支持结果转图下载。该款小程序能够轻松将文字注音后输出,无需授权,无需注册,即来即用。你还可以用它来识别图片中的文字后注音,或者随时拍照后识别文字再注音。同时支持注音完成后复制拼音,支持将结果保存成图片下载到手机本地。欢迎扫描下面的各平台得小程序码来尝试一下。

|
1

|
2

二、平台小程序码

直接去搜索名字。

三、核心源码:

原文链接:https://www.i847.cn/article/3033.html

<template>
    <view class="content" style="width:100%;position: absolute;">
        <view class="uni-textarea" style="width: 95%;margin: 0 auto;">
            <textarea v-if="status==0" :value="value" @input="valueChange" :style="{'height':textareaHeight+'px'}"
             placeholder="请在这里输入或者粘贴文字,支持上传图片自动识别文字,支持中文注音。" maxlength="-1" adjust-position="{{keyUp}}"
              @focus="focusTextarea" @blur="blurTextarea" />

            <view v-if="status==1" :style="{'height':resultHeight+'px','width': '100%','overflow-y': 'scroll'}" id="result">
                <view class="uni-row" style="padding: 9px 2%;font-size: 14px;text-align: center;">
                    <view v-for="(item,i) in list" v-if="item.pinyin!='enter'" v-bind:key="i" class="uni-flex uni-column" style="float: left;margin: 3px;">
                         <view class="flex-item" style="min-width: 1px;">{{item.pinyin}}</view>
                         <view class="flex-item">{{item.value}}</view>
                    </view>
                    <view v-else style="clear: both;"></view>
                </view>
            </view>
        </view>
        <view style="position: fixed;bottom: 15px;width: 100%;">
            <view v-if="status==0" style="width: 92%;margin: 0 auto;margin-bottom: 10px;font-size: 16px;color: #6495ED;">
                <text style="cursor: pointer;" @tap="fromImg('album')">图片识别</text>
                <text style="cursor: pointer;margin-left: 10px;" @tap="fromImg('camera')">拍照识别</text>
                <text style="font-size: 12px;color: #B2B2B2;">(上传图片不宜过大)</text>
            </view>
        
            <view class="uni-flex uni-row" style="width: 92%;margin: 0 auto;">
                <view v-if="status==0" class="flex-item" style="width: 70%;">
                    <button type="primary" style="width: 99%;float: left;" @tap="zhuyin()">注音</button>
                </view>
                
                <view v-if="status==1" class="flex-item" style="width: 35%;">
                    <button type="primary" style="width: 99%;float: left;" @tap="copy()">复制</button>
                </view>
                
                <view v-if="status==1" class="flex-item" style="width: 35%;">
                    <button type="primary" style="width: 99%;float: right;" :loading="down" :disabled="down" @tap="save()">下载</button>
                </view>
                
                <view class="flex-item"  style="width: 30%;">
                    <button type="default" style="width: 90%;float: right;" @tap="reset()">清空</button>
                </view>
                <view style="clear: both;"></view>
            </view>
        </view>
        <canvas canvas-id="canvas" :style="{'z-index': '-1','position': 'absolute','top': '0px','left': '0px','width': canvasWidth + 'px','height': canvasHeight + 'px'}" v-if="showCanvas"></canvas>
    </view>
</template>

<script>
    var bopomofo = require('../../static/bopomofo.min.js');
    export default {
        data() {
            return {
                value: '',
                status: 0,
                list:[] ,
                textareaHeight: 0,
                resultHeight: 0,
                baiduToken: {},
                showCanvas: false,
                down:false,
                canvasWidth:0,
                canvasHeight:0,
                pixelRatio :1,
                textareaStaticHeight:0,
                canvasStaticHeight:0,
                keyUp:false,
            }
        },
        onLoad() {
            this.reset();
        },
        onReady(){
            var _that = this;
            uni.getSystemInfo({
                success: function (res) {
                    var windowHeight = res.windowHeight;
                    _that.textareaHeight = windowHeight - 115;
                    _that.textareaStaticHeight = windowHeight - 115;
                    _that.resultHeight = windowHeight - 70;
                    _that.canvasWidth = res.windowWidth;
                    _that.canvasHeight = res.windowHeight * 10;
                    _that.canvasStaticHeight = res.windowHeight * 10;
                    _that.pixelRatio = res.pixelRatio;
                }
            });
            uni.getStorage({
                key: 'baiduToken',
                success: function (res) {
                    _that.baiduToken = res.data;
                    var now =  new Date().getTime();
                    if(!_that.baiduToken || now > _that.baiduToken.expires){
                        _that.getBaiduToken();
                    }
                },
                fail:function(e) {
                    _that.getBaiduToken();
                }
            });
            uni.showShareMenu();
        },
        methods: {
            focusTextarea:function(e){
                this.textareaHeight = 100;
            },
            blurTextarea:function(e){
                this.textareaHeight = this.textareaStaticHeight;
            },
            save:function(){
                var _that = this;
                _that.down = true;
                //先设置canvas得高度
                _that.canvasHeight = _that.canvasStaticHeight;
                _that.showCanvas = true;
                setTimeout(function(){
                    var ctx = uni.createCanvasContext("canvas",_that);
                    ctx.rect(0, 0, _that.canvasWidth, _that.canvasHeight);
                    ctx.setFillStyle('white');
                    ctx.fill();
                    ctx.setFillStyle('black');
                    // 字体大小
                    ctx.setFontSize(14);
                    var fontHeight = 14;
                    // 宽度
                    var width = _that.canvasWidth;
                    // 横向间隔
                    var transverse = 9;
                    // 纵向小间隔
                    var portraitSmall = 4;
                    // 纵向大间隔
                    var portraitBig = 7;
                    // 外间距
                    var padding = 20;
                    // 横向距离累计
                    var transverseCumulative = padding;
                    // 纵向距离累计
                    var portraitCumulative  = padding;
                    var lineHeight = portraitSmall  + portraitBig + (fontHeight*2);
                    for(var i=0;i<_that.list.length;i++){
                        // canvas高度变化
                        if(i==0){
                            _that.canvasHeight = portraitCumulative + lineHeight;
                            setTimeout(function(){},10);
                        }
                        var item = _that.list[i];
                        var metrics = ctx.measureText(item.pinyin);
                        var tempX = transverseCumulative + transverse + metrics.width;
                        if(tempX > (width-padding) || item.pinyin=="enter"){
                            transverseCumulative = padding;
                            portraitCumulative = portraitCumulative + lineHeight;
                            _that.canvasHeight = portraitCumulative + lineHeight;
                            setTimeout(function(){},10);
                        }
                        if(item.pinyin!="enter"){
                            var x1;
                            if(transverseCumulative==padding){
                                x1 = transverseCumulative;
                            }else{
                                x1 = transverseCumulative + transverse;
                            }
                            var y1 = portraitCumulative;
                            ctx.fillText(item.pinyin, x1, y1);
                            var x2 = x1;
                            var y2 = y1 + portraitSmall + fontHeight;
                            ctx.fillText(item.value,x2, y2);
                            transverseCumulative = x1 + metrics.width;
                        }
                    }
                    ctx.draw();
                    setTimeout(function(){
                        uni.canvasToTempFilePath({
                          width: _that.canvasWidth,
                          height:  _that.canvasHeight,
                          destWidth: _that.canvasWidth * _that.pixelRatio,
                          destHeight:  _that.canvasHeight * _that.pixelRatio,
                          canvasId: 'canvas',
                          success: function(res) {
                            uni.saveImageToPhotosAlbum({
                                filePath: res.tempFilePath,
                                success:function(){
                                    uni.showToast({
                                        title:"保存成功"
                                    })
                                },
                                complete:function(){
                                    _that.showCanvas = false;
                                    _that.down = false;
                                }
                            });
                          },
                          fail:function(e){
                              console.log(e);
                            _that.showCanvas = false;
                            _that.down = false;
                          }
                        })
                    },100);
                },100);
            },
            getBaiduToken:function(){
                var _that = this;
                var now =  new Date().getTime();
                uni.request({
                    url: 'https://aip.baidubce.com/oauth/2.0/token', 
                    method: 'GET',
                    data: {
                        grant_type: 'client_credentials',
                    client_id: '',
                    client_secret: '',
                    },
                    success: (res) => {
                        _that.baiduToken = {
                            access_token:res.data.access_token,
                            expires:(res.data.expires_in * 1000 + now - 24 * 60 * 60 * 1000)
                        }
                        uni.setStorage({
                            key: 'baiduToken',
                            data: _that.baiduToken,
                            success: function () {
                                
                            }
                        });
                    }
                });
            },
            fromImg:function(type){
                var _that = this;
                uni.chooseImage({
                    count: 1, 
                    sourceType: [type],
                    success: function (res) {
                        uni.getFileSystemManager().readFile({
                            filePath: res.tempFilePaths[0], 
                            encoding: 'base64', 
                            success: res => { 
                                var base64 = res.data;
                                uni.showLoading({
                                    title: '上传中...',
                                    mask:true
                                });
                                uni.request({
                                    url: 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic', 
                                    method: 'POST',
                                    header: {
                                        'Content-Type': 'application/x-www-form-urlencoded'
                                    },
                                    data: {
                                        access_token: _that.baiduToken.access_token,
                                        image: encodeURI(base64),
                                        detect_direction: true
                                    },
                                    success: (res) => {
                                        uni.hideLoading();
                                        if(res.data){
                                            var value = '';
                                            for(var i=0;i<res.data.words_result_num;i++){
                                                value += res.data.words_result[i].words + "\n";
                                            }
                                            _that.value = value;
                                        }
                                    }
                                });
                                
                            },fail: (e) => {
                                console.log(e);
                            }
                        })
                    }
                });
            },
            copy:function(){
                if(this.list.length>0){
                    var data = "";
                    for(var i=0;i<this.list.length;i++){
                        if(this.list[i].pinyin==" "){
                            data += this.list[i].value;
                        }else if(this.list[i].pinyin=="enter"){
                            data += "\n";
                        }else{
                            data += this.list[i].pinyin + " ";
                        }
                    }
                    uni.setClipboardData({
                        data: data,
                        success: function () {
                            uni.showToast({
                                title: '复制成功',
                                duration: 2000
                            });
                        }
                    });
                }
            },
            zhuyin:function(){
                var _that = this;
                if(this.value!=''){
                    // 敏感词过滤
                    uni.request({
                        url: 'https://aip.baidubce.com/rest/2.0/solution/v1/text_censor/v2/user_defined', 
                        method: 'POST',
                        header: {
                            'Content-Type': 'application/x-www-form-urlencoded'
                        },
                        data: {
                            access_token: _that.baiduToken.access_token,
                            text: _that.value,
                        },
                        success: (res) => {
                            if(res.data.conclusionType == 1){
                                _that.zhuyinDo();
                            }else{
                                var checkList = res.data.data;
                                var content = "";
                                for(var i=0;i<checkList.length;i++){
                                    var checkItem = checkList[i];
                                    content += (i+1) + "、" + checkItem.msg.replace("不合规","的字词") + "\n";
                                }
                                uni.showModal({
                                    title: "请删除后重试",
                                    content: content,
                                    showCancel: false
                                })
                                console.log(res.data);
                            }
                        }
                    });
                }
            },
            zhuyinDo:function(){
                var arr = this.value.split('');
                for(var i=0;i<arr.length;i++){
                    var cur = arr[i];
                    if(cur=="\n" || cur=="↵"){
                        this.list.push({
                            value: "enter",
                            pinyin: "enter"
                        });
                    }
                    if(this.isChinese(cur)){
                        var pinyin = bopomofo.pinyin(cur);
                        if(pinyin==cur || pinyin=='null'){
                            pinyin=" ";
                        }
                        var tmp = {
                            value: cur,
                            pinyin: pinyin
                        }
                        this.list.push(tmp);
                    }
                }
                this.status = 1;
                this.value = "";
            },
            reset:function(){
                this.value = "";
                this.status = 0;
                this.list = [];
                this.showCanvas = false;
                this.down = false;
            },
            valueChange:function(e){
                this.value = e.detail.value;
            },
            isChinese:function(value){
                if (escape(value).indexOf( "%u" )<0) {
                    return false;
                }
                return true;
            }
        }
    }
</script>

<style>
    @import "../../static/uni.css";  
</style>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容