最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python提取支付寶和微信支付二維碼的示例代碼

 更新時間:2019年02月15日 09:07:08   作者:追夢人物的博客  
本文將教你使用 Python 的圖像處理庫 pillow,輕松批量提取圖片中間的方形二維碼部分。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

支付寶或者微信支付導(dǎo)出的收款二維碼,除了二維碼部分,還有很大一塊背景圖案,例如下面就是微信支付的收款二維碼:

有時候我們僅僅只想要圖片中間的方形二維碼部分,為了提取出中間部分,我們可以使用圖片處理軟件,但圖片處理軟件不利于批處理,且學(xué)習(xí)也需要一定成本。本文將教你使用 Python 的圖像處理庫 pillow,輕松批量提取圖片中間的方形二維碼部分。

提取思路

以微信支付收款碼圖片為例:

分析圖片我們可以看到,二維碼位于白色背景中,而白色背景又位于綠色背景上。我們以圖片左上角為坐標(biāo)原點(diǎn),橫向?yàn)?x 軸(向右為正方向),縱向?yàn)?y 軸(向下為正方向)。我們的目標(biāo)是需要確定白色背景部分 4 個角的坐標(biāo)。

從圖片左邊正中向右橫向穿過,當(dāng)背景色從綠色變?yōu)榘咨珪r,該點(diǎn)所在位置的橫坐標(biāo)即為左上角和左下角的橫坐標(biāo),記為 x_left。

同理從圖片右邊正中向左橫向穿過,當(dāng)背景色從綠色變?yōu)榘咨珪r,該點(diǎn)所在位置的橫坐標(biāo)即為右上角和右下角的橫坐標(biāo),記為 x_right。

則白色背景寬度和高度為 h = x_right - x_left。

再從綠色背景轉(zhuǎn)為白色背景時的點(diǎn)向上(或者向下,此處以向上為例)出發(fā),當(dāng)背景色從白色又變?yōu)榫G色時,該點(diǎn)所在位置的縱坐標(biāo)即為左上角和右上角的縱坐標(biāo),記為 y_top。

則可以計算出左下角和右下角的縱坐標(biāo)為 (y_top + h)。

由此,白色背景部分 4 個角的坐標(biāo)均確定,分別為(從左上角開始順時針):(x_left, y_top)、(x_right, y_top)、(x_right, y_top+h)、(x_left, y_top+h)。

代碼實(shí)現(xiàn)

有了上述思路,我們就可以輕松寫出 Python 腳本了。代碼中給出了詳細(xì)注釋,其基本思路就是導(dǎo)入圖片,將其轉(zhuǎn)為一個二維矩陣,矩陣的元素為圖片對應(yīng)像素點(diǎn)的 RGBA 值,然后根據(jù) RGBA 值的變化(即顏色的變化)確定待裁剪邊界即可。

import glob
from PIL import Image

if __name__ == '__main__':
  filenames = glob.glob('*.png') # 微信支付收款碼導(dǎo)出為 png 格式
  filenames.extend(glob.glob('*.jpg')) # 支付寶收款碼導(dǎo)出為 jpg 格式

  for filename in filenames:
    with Image.open(filename) as img:
      img.convert('RGBA')
      pix_data = img.load()

      # 圖片左上角為原點(diǎn),橫向?yàn)?x 軸(向右為正方向),縱向?yàn)?y 軸(向下為正方向)
      width, height = img.size # 圖片寬和高
      mid_height = height // 2 # 圖片正中縱坐標(biāo)

      # 確定左邊界橫坐標(biāo):
      x_left = 0
      for x in range(width):
        rgba = pix_data[x, mid_height]
        if rgba[:3] == (255, 255, 255):
          x_left = x
          break

      # 確定右邊界橫坐標(biāo):
      x_right = width - 1 # 右邊界
      for x in range(width - 1, 0, -1):
        rgba = pix_data[x, mid_height]
        if rgba[:3] == (255, 255, 255):
          x_right = x
          break

      h = x_right - x_left # 白色背景高度(正方形)
      mid_height_rgba = pix_data[x_left, mid_height]
      if filename.endswith('png'):
        # 微信支付往下確定下邊界縱坐標(biāo),因?yàn)楫?dāng)設(shè)置了收款金額時,金額顯示在上方
        y_bottom = mid_height
        for y in range(mid_height, height):
          rgba = pix_data[x_left, y]
          if rgba != mid_height_rgba:
            y_bottom = y
            break
        box = (x_left, y_bottom - h, x_right, y_bottom)
      else:
        # 支付寶往上確定上邊界縱坐標(biāo),因?yàn)楫?dāng)設(shè)置了收款金額時,金額顯示在下方
        y_top = mid_height
        for y in range(mid_height, 0, -1):
          rgba = pix_data[x_left, y]
          if rgba != mid_height_rgba:
            y_top = y
            break
        box = (x_left, y_top, x_right, y_top + h)
      crop = img.crop(box) # box 參數(shù)為四元組,分別為左上角和右下角的橫縱坐標(biāo)
      crop.save('./result/{}'.format(filename))

腳本代碼同時上傳在 GitHub,使用方法請看 README 文檔即可。腳本源碼倉庫:clip-pay-pic

相關(guān)文章

  • Python matplotlib繪圖設(shè)置圖例案例

    Python matplotlib繪圖設(shè)置圖例案例

    這篇文章主要給大家分享Python matplotlib繪圖設(shè)置圖例案例,過程會學(xué)到edgecolor 圖例邊框線顏色 facecolor 圖例背景色 shadow 是否添加陰影 title 圖例標(biāo)題 fontsize 設(shè)置字體大小,小編覺得挺有意思的,感興趣的小伙伴也可以參考一下
    2021-12-12
  • 設(shè)置jupyter中DataFrame的顯示限制方式

    設(shè)置jupyter中DataFrame的顯示限制方式

    這篇文章主要介紹了設(shè)置jupyter中DataFrame的顯示限制方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來
    2020-04-04
  • Python中的for循環(huán)示例詳解

    Python中的for循環(huán)示例詳解

    Python中的for循環(huán)是一種迭代循環(huán),可以迭代容器中的每一個元素,本文通過實(shí)例代碼給大家介紹Python中的for循環(huán),感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Python fileinput模塊使用實(shí)例

    Python fileinput模塊使用實(shí)例

    這篇文章主要介紹了Python fileinput模塊使用實(shí)例,fileinput模塊可以遍歷文本文件的所有行,本文就給出它的使用代碼實(shí)例,需要的朋友可以參考下
    2015-05-05
  • python獲取系統(tǒng)內(nèi)存占用信息的實(shí)例方法

    python獲取系統(tǒng)內(nèi)存占用信息的實(shí)例方法

    在本篇文章里小編給大家整理的是關(guān)于python獲取系統(tǒng)內(nèi)存占用信息的實(shí)例方法,有需要的朋友們可以參考學(xué)習(xí)下。
    2020-07-07
  • 詳解重置Django migration的常見方式

    詳解重置Django migration的常見方式

    這篇文章主要介紹了詳解重置Django migration的常見方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • numpy matrix和array的乘和加實(shí)例

    numpy matrix和array的乘和加實(shí)例

    今天小編就為大家分享一篇numpy matrix和array的乘和加實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 詳解python中的文件與目錄操作

    詳解python中的文件與目錄操作

    這篇文章主要介紹了詳解python中的文件與目錄操作的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • 15個Pythonic的代碼示例(值得收藏)

    15個Pythonic的代碼示例(值得收藏)

    這篇文章主要介紹了15個Pythonic的代碼示例(值得收藏),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • python實(shí)現(xiàn)發(fā)送郵件功能

    python實(shí)現(xiàn)發(fā)送郵件功能

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)發(fā)送郵件功能,使用的模塊是smtplib、MIMEText,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評論

获嘉县| 九台市| 资源县| 高要市| 韩城市| 海安县| 青冈县| 高碑店市| 本溪| 新民市| 苍南县| 海门市| 县级市| 安陆市| 青龙| 麟游县| 泗洪县| 浑源县| 偏关县| 商丘市| 玛纳斯县| 钟祥市| 万全县| 舟山市| 巩义市| 龙山县| 鞍山市| 河南省| 淅川县| 遵义市| 广汉市| 定日县| 甘南县| 卢氏县| 顺平县| 凤山市| 皮山县| 南澳县| 诸暨市| 东城区| 东乡|