Python提取支付寶和微信支付二維碼的示例代碼-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)擁有10多年成都網(wǎng)站建設(shè)工作經(jīng)驗(yàn),為各大企業(yè)提供網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作服務(wù),對(duì)于網(wǎng)頁(yè)設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、app軟件開(kāi)發(fā)、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、程序開(kāi)發(fā)、網(wǎng)站優(yōu)化(SEO優(yōu)化)、微網(wǎng)站、空間域名等,憑借多年來(lái)在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了很多網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷經(jīng)驗(yàn),集策劃、開(kāi)發(fā)、設(shè)計(jì)、營(yíng)銷、管理等網(wǎng)站化運(yùn)作于一體,具備承接各種規(guī)模類型的網(wǎng)站建設(shè)項(xiàng)目的能力。

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

提取思路

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

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

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

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

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

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

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

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

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

有了上述思路,我們就可以輕松寫(xiě)出 Python 腳本了。代碼中給出了詳細(xì)注釋,其基本思路就是導(dǎo)入圖片,將其轉(zhuǎn)為一個(gè)二維矩陣,矩陣的元素為圖片對(duì)應(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è)置了收款金額時(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è)置了收款金額時(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))

新聞名稱:Python提取支付寶和微信支付二維碼的示例代碼-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://bm7419.com/article16/ippdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、電子商務(wù)、商城網(wǎng)站、全網(wǎng)營(yíng)銷推廣定制開(kāi)發(fā)、虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名