一. 背景
今天有粉絲向波哥提出了這樣一個(gè)疑問(wèn):給出一張圖片,如何利用Java中的技術(shù)獲取圖片中的文字信息?針對(duì)這個(gè)問(wèn)題,你有么有解決辦法呢?如果你沒(méi)有想到好的解決思路,也不用怕,看波哥來(lái)給你解決這個(gè)問(wèn)題!
二. 解決思路
首先說(shuō)到讀取文件,我們耳熟能詳?shù)目隙ň褪鞘褂肐/O流進(jìn)行文件的讀取,但如果是要將圖片里面的文字提取出來(lái)又該如何去做呢?
哈哈哈,肯定有同學(xué)犯難了,其實(shí)我們不妨換個(gè)思路。
首先我們想一想,文件的底層是不是就是一個(gè)二進(jìn)制文件呢?當(dāng)我們想要去獲取其中的數(shù)據(jù)時(shí),是不是會(huì)有一些二進(jìn)制規(guī)范呢?我們將這種二進(jìn)制規(guī)范解析出來(lái),是否就能得到文字信息了呢?
三. 代碼示例
帶著這樣的疑問(wèn),請(qǐng)大家跟波哥一起通過(guò)代碼來(lái)實(shí)現(xiàn)一下吧,下面就是波哥給大家提供的實(shí)現(xiàn)代碼。
public?class?Imageparse{
????
????public?static?void?main?(String[]?args){
??????????//首先我們需要輸入獲取圖片的路徑信息,將其每個(gè)點(diǎn)位設(shè)置為二進(jìn)制信息
??????????Int[][]?img?=?readPic(/*這里輸入你的path絕對(duì)路徑即可*/);
??????????//將其轉(zhuǎn)為一個(gè)一維數(shù)組
??????????int[]?bits?=?new?int[img.length?*?img[0].lenght];
??????????Int?index?=?0;
??????????for(int?i?=?0;?i?<?img.lenght;i++){//這段代碼是查看解析的二維數(shù)組是否正確
????????????for(int?j?=?0;j<img[i].length;j++){
??????????????bits[index++]?=?img[i][j];
????????????}
??????????}
??????????//讀取數(shù)組信息
??????????parseUTF(bits);
????}
??
????public?static?int?readPic(String?path){
??????????//這里我們就需要涉及到去拿去所有的數(shù)據(jù)??rgb??信息,有一個(gè)圖片??IO??流
??????????BufferedImage?image?=?ImageIO.read(new?FileInputStream(new?File(path)));
??????????//獲取這個(gè)圖片的寬和高
??????????int?width = image.getWidth();
??????????int?height = image.getHeight();
??????????//創(chuàng)建一個(gè)當(dāng)前圖的最大寬高的二維數(shù)組
??????????int[][]?img?=?new?int[height][width];
??????????//到這里我們就該去把每個(gè)點(diǎn)位賦值
??????????for(int?i?=?0;i<height;i++){
????????????for(int?j?=?0;j<width;j++){
??????????????Int???????rgb???????=?image.getRGB(j,i);//此時(shí)這是一個(gè)二進(jìn)制顏色代碼
??????????????//條件判斷顏色轉(zhuǎn)為??????RGB??????,例如(255,0,0)
??????????????int?r?=?(rgb?&?0x00ff0000)?>>16?;?
??????????????int?g?=?(rgb?&?0x0000ff00)?>>8?;
??????????????int?b?=?(rgb?&?0x000000ff)?;
??????????????int??a?=?0xff?/2;?
??????????????if(r?>?a?&&?g?>?a?&&?b?>?a){
????????????????img[i][j]?=?0;
??????????????}else{
????????????????img[i][j]?=?1;
????????????????}
????????????}
??????????}
??????????return?img;
?????}
????public?static?void??parseUTF(int[]?bits){
????????int?index?=?0;
????????int?count?=?0;
????????for(int?j?=?0;j<bits.lenght;){
??????????if(bits[j]==1){
????????????count++;
????????????index++;
??????????}else{
????????????index++;
????????????String?str?=?"";
????????????if(count?==?0){
??????????????for(int?k=1;k<=7;k++){
????????????????str?+=?bits[index++];
??????????????}
????????????}else?{
??????????????for(int?x?=?0;x<8-(count+1);x++){
????????????????str+=bits[index++];
??????????????}
????????????}else{
??????????????for(int?y?=?0;y<count-1;y++){
????????????????index+=2;
????????????????for(int?z?=?0;z<6;z++){
??????????????????str+=bits[index++];
????????????????}?
????????????????}
????????????}
????????????count?=?0;
????????????System.out.print((char)Integer.parseInt(str,2));
????????????str="";
??????????}
??????????j=index;
????????}
????}
}
接下來(lái),來(lái)跟隨波哥看看代碼實(shí)際展現(xiàn)的最終效果吧:
四. 測(cè)試圖片
下面這種圖片,供大家用于測(cè)試上面的代碼,你可以把波哥上面的代碼運(yùn)行起來(lái),試試看能不能把下面圖片中的文字識(shí)別出來(lái)。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-507081.html
如果你識(shí)別出來(lái)的結(jié)果是一首詩(shī)就對(duì)了哦。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-507081.html
到了這里,關(guān)于利用Java實(shí)現(xiàn)的圖片中文字識(shí)別,你學(xué)會(huì)了嗎?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!