Python操作Word和PowerPoint文件
操作Word文檔
命令來安裝python-docx
三方庫。
pip install python-docx
from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn
import matplotlib.pyplot as plt
from datetime import datetime
import iodef generate_sales_report():# 創建文檔對象doc = Document()# 設置文檔默認字體(支持中文)doc.styles['Normal'].font.name = '微軟雅黑'doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '微軟雅黑')# ========== 1. 添加報告標題 ==========title = doc.add_heading('2023年11月銷售分析報告', level=0)title.alignment = WD_ALIGN_PARAGRAPH.CENTERtitle_run = title.runs[0]title_run.font.size = Pt(22)title_run.font.color.rgb = RGBColor(0, 0, 139) # 深藍色# 添加報告日期current_date = datetime.now().strftime('%Y年%m月%d日')date_para = doc.add_paragraph(f'生成日期:{current_date}')date_para.alignment = WD_ALIGN_PARAGRAPH.RIGHTdate_para.runs[0].font.size = Pt(10)date_para.runs[0].font.color.rgb = RGBColor(128, 128, 128) # 灰色doc.add_paragraph() # 空行# ========== 2. 添加基本信息 ==========doc.add_heading('一、基本信息', level=1)info_text = ("本月銷售報告涵蓋2023年11月1日至11月30日的銷售數據。""報告分析了平臺整體銷售情況、各品類表現、用戶購買行為等關鍵指標,""并為下月運營策略提供數據支持。")info_para = doc.add_paragraph(info_text)info_para.runs[0].font.size = Pt(12)# ========== 3. 添加銷售數據表格 ==========doc.add_heading('二、銷售數據概覽', level=1)# 模擬銷售數據sales_data = [['品類', '銷售額(萬元)', '訂單數', '同比增幅', '毛利率'],['電子產品', 1250, 8560, '12.5%', '22.3%'],['家居用品', 890, 12450, '8.7%', '28.1%'],['服裝鞋帽', 760, 21500, '15.2%', '35.4%'],['食品生鮮', 680, 18760, '23.8%', '18.9%'],['其他', 320, 5600, '-2.1%', '15.6%']]# 創建表格table = doc.add_table(rows=1, cols=len(sales_data[0]))table.style = 'Light Shading Accent 1' # 使用內置表格樣式table.alignment = WD_TABLE_ALIGNMENT.CENTER# 添加表頭hdr_cells = table.rows[0].cellsfor i, header in enumerate(sales_data[0]):hdr_cells[i].text = headerhdr_cells[i].paragraphs[0].runs[0].font.bold = Truehdr_cells[i].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER# 添加數據行for row in sales_data[1:]:row_cells = table.add_row().cellsfor i, cell in enumerate(row):row_cells[i].text = str(cell)if i > 0: # 非第一列數據居中row_cells[i].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTERdoc.add_paragraph() # 空行# ========== 4. 添加銷售趨勢圖 ==========doc.add_heading('三、銷售趨勢分析', level=1)# 生成一個簡單的趨勢圖(實際應用中可以從數據庫獲取真實數據)days = range(1, 31)sales = [100 + x * 5 + (x % 7) * 20 for x in days] # 模擬每日銷售額plt.figure(figsize=(8, 4))plt.plot(days, sales, marker='o', linestyle='-', color='#1f77b4')plt.title('11月每日銷售額趨勢', fontproperties='SimHei')plt.xlabel('日期', fontproperties='SimHei')plt.ylabel('銷售額(萬元)', fontproperties='SimHei')plt.grid(True)# 將圖表保存到內存中img_stream = io.BytesIO()plt.savefig(img_stream, format='png', dpi=300)plt.close()# 將圖表添加到Word文檔img_stream.seek(0)doc.add_picture(img_stream, width=Inches(6))doc.add_paragraph('圖1:11月每日銷售額趨勢圖', style='Caption')# ========== 5. 添加關鍵指標分析 ==========doc.add_heading('四、關鍵指標分析', level=1)analysis_points = [("1. 總體表現", "本月總銷售額達到3900萬元,同比增長14.2%,環比增長8.7%。"),("2. 品類亮點", "服裝鞋帽品類表現突出,同比增長15.2%,主要得益于雙十一促銷活動。"),("3. 用戶行為", "平均客單價提升至320元,老客戶復購率提升至45.6%。"),("4. 促銷效果", "雙十一當天銷售額達580萬元,占全月銷售額的14.9%。")]for point in analysis_points:p = doc.add_paragraph()p.add_run(point[0]).bold = Truep.add_run(" " + point[1])# ========== 6. 添加結論與建議 ==========doc.add_heading('五、結論與建議', level=1)recommendations = ["1. 繼續保持服裝鞋帽品類的營銷投入,擴大競爭優勢。","2. 針對食品生鮮品類的高增長,優化供應鏈管理。","3. 分析電子產品品類增長放緩原因,調整產品結構。","4. 策劃12月年終促銷活動,重點關注老客戶喚醒。"]for rec in recommendations:doc.add_paragraph(rec, style='List Bullet')# ========== 7. 添加頁腳 ==========section = doc.sections[0]footer = section.footerfooter_para = footer.paragraphs[0]footer_para.text = "機密 - 僅限內部使用"footer_para.alignment = WD_ALIGN_PARAGRAPH.CENTERfooter_para.runs[0].font.size = Pt(9)footer_para.runs[0].font.color.rgb = RGBColor(128, 128, 128)# ========== 保存文檔 ==========report_name = f"銷售分析報告_{current_date}.docx"doc.save(report_name)print(f"報告已生成: {report_name}")if __name__ == "__main__":generate_sales_report()
生成PowerPoint
安裝名為python-pptx
的三方庫,命令如下所示。
pip install python-pptx
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from pptx.enum.shapes import MSO_SHAPE, MSO_CONNECTOR
from pptx.enum.text import MSO_ANCHOR
from datetime import datetime
import mathdef create_ai_evolution_ppt():# 創建演示文稿對象prs = Presentation()# ========== 1. 封面頁 ==========slide_layout = prs.slide_layouts[0] # 標題幻燈片布局slide = prs.slides.add_slide(slide_layout)title = slide.shapes.titletitle.text = "人工智能演變歷程"title.text_frame.paragraphs[0].font.size = Pt(44)title.text_frame.paragraphs[0].font.bold = Truetitle.text_frame.paragraphs[0].font.color.rgb = RGBColor(0, 32, 96) # 深藍色subtitle = slide.placeholders[1]subtitle.text = "從理論萌芽到變革未來\n技術發展全景解析"subtitle.text_frame.paragraphs[0].font.size = Pt(24)subtitle.text_frame.paragraphs[0].font.color.rgb = RGBColor(128, 128, 128)subtitle.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER# 添加日期和作者left = Inches(5.5)top = Inches(6.5)width = Inches(3)height = Inches(0.5)text_box = slide.shapes.add_textbox(left, top, width, height)tf = text_box.text_framep = tf.add_paragraph()p.text = f"生成日期: {datetime.now().strftime('%Y-%m-%d')}"p.font.size = Pt(12)p.font.color.rgb = RGBColor(150, 150, 150)p.alignment = PP_ALIGN.RIGHT# ========== 2. AI發展時間線 ==========slide = prs.slides.add_slide(prs.slide_layouts[1]) # 標題和內容布局title = slide.shapes.titletitle.text = "AI發展時間線"# 創建時間線圖形left = Inches(0.5)top = Inches(1.5)width = Inches(9)height = Inches(1)timeline = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, left, top, width, height / 4)timeline.fill.solid()timeline.fill.fore_color.rgb = RGBColor(0, 112, 192)# 添加時間點milestones = [(0.1, "1950s", "圖靈測試\n達特茅斯會議"),(0.35, "1980s", "專家系統\n機器學習興起"),(0.6, "1997", "深藍擊敗\n國際象棋冠軍"),(0.75, "2011", "Siri發布\n語音助手時代"),(0.9, "2023", "GPT-4\n多模態AI")]for pos, year, desc in milestones:# 時間點標記left_pos = left + width * pos - Inches(0.15)marker = slide.shapes.add_shape(MSO_SHAPE.OVAL,left_pos,top - Inches(0.15),Inches(0.3),Inches(0.3))marker.fill.solid()marker.fill.fore_color.rgb = RGBColor(237, 125, 49) # 橙色marker.line.color.rgb = RGBColor(255, 255, 255)# 年份文本txBox = slide.shapes.add_textbox(left_pos,top - Inches(0.5),Inches(0.8),Inches(0.4))tf = txBox.text_framep = tf.add_paragraph()p.text = yearp.font.size = Pt(14)p.font.bold = Truep.alignment = PP_ALIGN.CENTER# 描述文本txBox = slide.shapes.add_textbox(left_pos - Inches(0.5),top + Inches(0.3),Inches(1.5),Inches(0.8))tf = txBox.text_framep = tf.add_paragraph()p.text = descp.font.size = Pt(12)p.alignment = PP_ALIGN.CENTER# ========== 3. 關鍵里程碑 ==========slide = prs.slides.add_slide(prs.slide_layouts[1])title = slide.shapes.titletitle.text = "AI發展關鍵里程碑"# 使用SmartArt替代圖形(實際使用中可以用真實SmartArt)milestones = [("1956", "達特茅斯會議", "AI概念正式提出"),("1997", "深藍勝利", "首次計算機擊敗國際象棋世界冠軍"),("2012", "AlexNet", "深度學習革命開始"),("2016", "AlphaGo", "擊敗圍棋冠軍李世石"),("2020", "GPT-3", "1750億參數語言模型")]left = Inches(0.5)top = Inches(1.5)width = Inches(3)height = Inches(0.8)for i, (year, event, desc) in enumerate(milestones):# 添加年份框year_box = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,left,top + i * Inches(1.1),width / 3,height / 2)year_box.fill.solid()year_box.fill.fore_color.rgb = RGBColor(54, 96, 146) # 深藍色year_box.line.color.rgb = RGBColor(255, 255, 255)tf = year_box.text_framep = tf.add_paragraph()p.text = yearp.font.size = Pt(14)p.font.color.rgb = RGBColor(255, 255, 255)p.alignment = PP_ALIGN.CENTER# 添加事件框event_box = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE,left + width / 3 + Inches(0.2),top + i * Inches(1.1),width * 0.7,height)event_box.fill.solid()event_box.fill.fore_color.rgb = RGBColor(218, 238, 243) # 淺藍色tf = event_box.text_framep = tf.add_paragraph()p.text = eventp.font.size = Pt(16)p.font.bold = Truep = tf.add_paragraph()p.text = descp.font.size = Pt(12)# ========== 4. 技術突破圖解 ==========slide = prs.slides.add_slide(prs.slide_layouts[1])title = slide.shapes.titletitle.text = "AI核心技術突破"# 添加技術演進圖(簡化版)technologies = [("規則系統", "1950s-1980s", "專家系統", RGBColor(166, 166, 166)),("機器學習", "1980s-2010s", "統計學習", RGBColor(155, 187, 89)),("深度學習", "2010s-現在", "神經網絡", RGBColor(79, 129, 189)),("大模型", "2020s-現在", "Transformer", RGBColor(247, 150, 70))]left = Inches(0.5)top = Inches(2)width = Inches(2.5)height = Inches(2)for i, (tech, period, desc, color) in enumerate(technologies):# 添加技術框tech_box = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,left + i * Inches(2.5),top,width,height)tech_box.fill.solid()tech_box.fill.fore_color.rgb = colortech_box.line.color.rgb = RGBColor(255, 255, 255)tf = tech_box.text_frametf.vertical_anchor = MSO_ANCHOR.MIDDLEp = tf.add_paragraph()p.text = techp.font.size = Pt(18)p.font.bold = Truep.font.color.rgb = RGBColor(255, 255, 255)p.alignment = PP_ALIGN.CENTERp = tf.add_paragraph()p.text = periodp.font.size = Pt(14)p.font.color.rgb = RGBColor(255, 255, 255)p.alignment = PP_ALIGN.CENTERp = tf.add_paragraph()p.text = descp.font.size = Pt(12)p.font.color.rgb = RGBColor(255, 255, 255)p.alignment = PP_ALIGN.CENTER# 添加箭頭連接for i in range(len(technologies) - 1):arrow = slide.shapes.add_shape(MSO_SHAPE.RIGHT_ARROW,left + (i + 1) * Inches(2.5) - Inches(0.3),top + height / 2 - Inches(0.1),Inches(0.6),Inches(0.2))arrow.fill.solid()arrow.fill.fore_color.rgb = RGBColor(89, 89, 89)# ========== 5. 當前應用領域 ==========slide = prs.slides.add_slide(prs.slide_layouts[1])title = slide.shapes.titletitle.text = "AI當前主要應用領域"applications = [("醫療健康", "影像診斷、藥物研發", "🏥"),("金融服務", "風控、量化交易", "💳"),("智能制造", "質檢、預測性維護", "🏭"),("自動駕駛", "環境感知、路徑規劃", "🚗"),("內容創作", "AIGC、藝術創作", "🎨")]left = Inches(0.5)top = Inches(1.8)width = Inches(4)height = Inches(1.2)for i, (field, desc, emoji) in enumerate(applications):row = i % 2col = i // 2# 添加應用框app_box = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,left + col * Inches(4.5),top + row * Inches(1.5),width,height)app_box.fill.solid()app_box.fill.fore_color.rgb = RGBColor(240, 240, 240)tf = app_box.text_framep = tf.add_paragraph()p.text = f"{emoji} {field}"p.font.size = Pt(18)p.font.bold = Truep = tf.add_paragraph()p.text = descp.font.size = Pt(14)# ========== 6. 未來趨勢預測 ==========slide = prs.slides.add_slide(prs.slide_layouts[1])title = slide.shapes.titletitle.text = "AI未來發展趨勢"trends = [("AGI研究", "通用人工智能探索"),("AI倫理", "可解釋性、公平性、隱私保護"),("邊緣AI", "設備端智能計算"),("AI+科學", "科學研究新范式"),("人機協作", "增強人類能力而非替代")]left = Inches(0.5)top = Inches(1.8)radius = Inches(0.4)# 添加中心主題center = slide.shapes.add_shape(MSO_SHAPE.OVAL,left + Inches(3.5) - radius,top + Inches(1.5) - radius,radius * 2,radius * 2)center.fill.solid()center.fill.fore_color.rgb = RGBColor(0, 112, 192)tf = center.text_framep = tf.add_paragraph()p.text = "AI未來"p.font.size = Pt(16)p.font.bold = Truep.font.color.rgb = RGBColor(255, 255, 255)p.alignment = PP_ALIGN.CENTER# 添加周圍趨勢節點angles = [0, 72, 144, 216, 288] # 五等分圓distance = Inches(2.5)for i, (trend, desc) in enumerate(trends):angle = angles[i] * 3.14159 / 180x = left + Inches(3.5) + distance * math.cos(angle) - radiusy = top + Inches(1.5) + distance * math.sin(angle) - radiusnode = slide.shapes.add_shape(MSO_SHAPE.OVAL,x,y,radius * 2,radius * 2)node.fill.solid()node.fill.fore_color.rgb = RGBColor(237, 125, 49)tf = node.text_framep = tf.add_paragraph()p.text = trendp.font.size = Pt(14)p.font.bold = Truep.font.color.rgb = RGBColor(255, 255, 255)p.alignment = PP_ALIGN.CENTER# 添加連接線 - 修復這里line = slide.shapes.add_connector(MSO_CONNECTOR.STRAIGHT, # 修改為正確的連接線類型left + Inches(3.5),top + Inches(1.5),x + radius,y + radius)line.line.width = Pt(1.5)line.line.color.rgb = RGBColor(150, 150, 150)# 添加描述文本框desc_box = slide.shapes.add_textbox(x - Inches(0.5) if angle < 3.14159 else x + Inches(0.5),y + radius * 2,Inches(1.5),Inches(0.8))tf = desc_box.text_framep = tf.add_paragraph()p.text = descp.font.size = Pt(12)p.alignment = PP_ALIGN.CENTER# ========== 7. 結束頁 ==========slide = prs.slides.add_slide(prs.slide_layouts[5]) # 空白布局left = Inches(1)top = Inches(2)width = Inches(8)height = Inches(2)# 添加結束語text_box = slide.shapes.add_textbox(left, top, width, height)tf = text_box.text_framep = tf.add_paragraph()p.text = "人工智能的演變仍在繼續..."p.font.size = Pt(36)p.font.bold = Truep.font.color.rgb = RGBColor(0, 32, 96)p.alignment = PP_ALIGN.CENTERp = tf.add_paragraph()p.text = "準備好迎接AI驅動的未來了嗎?"p.font.size = Pt(24)p.font.color.rgb = RGBColor(128, 128, 128)p.alignment = PP_ALIGN.CENTER# 添加公司/作者信息left = Inches(3)top = Inches(6)width = Inches(4)height = Inches(0.5)text_box = slide.shapes.add_textbox(left, top, width, height)tf = text_box.text_framep = tf.add_paragraph()p.text = "? 2023 AI趨勢分析團隊"p.font.size = Pt(12)p.font.color.rgb = RGBColor(150, 150, 150)p.alignment = PP_ALIGN.CENTER# ========== 保存PPT ==========ppt_name = f"AI演變歷程_{datetime.now().strftime('%Y%m%d')}.pptx"prs.save(ppt_name)print(f"PPT已生成: {ppt_name}")if __name__ == "__main__":create_ai_evolution_ppt()
Python操作PDF文件
PDF 是 Portable Document Format 的縮寫,這類文件通常使用.pdf
作為其擴展名。
從PDF中提取文本
在 Python 中,可以使用名為PyPDF2
的三方庫來讀取 PDF 文件
pip install PyPDF2
pip install reportlab
PyPDF2
沒有辦法從 PDF 文檔中提取圖像、圖表或其他媒體,但它可以提取文本,并將其返回為 Python 字符串。創建 PDF 文檔需要三方庫reportlab
的支持
import os
from PyPDF2 import PdfReader, PdfWriter, PdfMerger
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from io import BytesIOfrom reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFontdef create_holiday_announcement(output_path):"""創建公司放假公告PDF(使用 ReportLab 內置中文字體)"""# 注冊 ReportLab 內置的亞洲字體pdfmetrics.registerFont(UnicodeCIDFont("STSong-Light")) # 宋體# 創建PDFpacket = BytesIO()c = canvas.Canvas(packet, pagesize=letter)# 設置中文字體c.setFont("STSong-Light", 12) # 使用注冊的中文字體# 添加中文內容text = c.beginText(100, 650)text.textLines("""尊敬的全體員工:根據國家法定節假日安排,結合公司實際情況,現將2023年春節放假安排通知如下:1. 放假時間:2023年1月21日(星期六)至2023年1月27日(星期五),共7天。2. 1月28日(星期六)、1月29日(星期日)正常上班。3. 請各部門提前安排好工作,做好節前安全檢查。4. 放假期間,請保持通訊暢通,如有緊急情況及時聯系相關負責人。祝大家春節愉快,闔家幸福!人事行政部2023年1月10日""")c.drawText(text)c.save()packet.seek(0)with open(output_path, "wb") as f:f.write(packet.getvalue())print(f"已創建放假公告PDF文件: {output_path}")def encrypt_pdf(input_path, output_path, password):"""加密PDF文件"""reader = PdfReader(input_path)writer = PdfWriter()# 添加所有頁面到writerfor page in reader.pages:writer.add_page(page)# 加密PDFwriter.encrypt(password)# 寫入輸出文件with open(output_path, "wb") as f:writer.write(f)print(f"已加密PDF文件并保存為: {output_path} (密碼: {password})")def add_watermark(input_path, output_path, watermark_text):"""為PDF添加文字水印"""reader = PdfReader(input_path)writer = PdfWriter()# 注冊 ReportLab 內置的亞洲字體pdfmetrics.registerFont(UnicodeCIDFont("STSong-Light")) # 宋體# 創建水印PDFwatermark_packet = BytesIO()c = canvas.Canvas(watermark_packet, pagesize=letter)c.setFont("STSong-Light", 50)c.setFillColorRGB(0.8, 0.8, 0.8) # 淺灰色c.rotate(45) # 旋轉45度c.drawString(150, 50, watermark_text) # 水印文字c.save()watermark_packet.seek(0)watermark_reader = PdfReader(watermark_packet)watermark_page = watermark_reader.pages[0]# 為每一頁添加水印for page in reader.pages:page.merge_page(watermark_page)writer.add_page(page)# 寫入輸出文件with open(output_path, "wb") as f:writer.write(f)print(f"已添加水印并保存為: {output_path}")def batch_add_watermark(input_dir, output_dir, watermark_text):"""批量添加水印"""if not os.path.exists(output_dir):os.makedirs(output_dir)for filename in os.listdir(input_dir):if filename.endswith(".pdf"):input_path = os.path.join(input_dir, filename)output_path = os.path.join(output_dir, f"watermarked_{filename}")add_watermark(input_path, output_path, watermark_text)print(f"已完成批量添加水印,輸出目錄: {output_dir}")def merge_pdfs(input_paths, output_path):"""合并多個PDF文件"""merger = PdfMerger()for path in input_paths:merger.append(path)merger.write(output_path)merger.close()print(f"已合并PDF文件并保存為: {output_path}")def read_pdf_metadata(input_path):"""讀取PDF元數據"""reader = PdfReader(input_path)metadata = reader.metadataprint("\nPDF文件元數據:")print(f"標題: {metadata.get('/Title', '無')}")print(f"作者: {metadata.get('/Author', '無')}")print(f"創建者: {metadata.get('/Creator', '無')}")print(f"創建日期: {metadata.get('/CreationDate', '無')}")print(f"修改日期: {metadata.get('/ModDate', '無')}")print(f"頁數: {len(reader.pages)}")def main():# 1. 創建放假公告PDFannouncement_file = "holiday_announcement.pdf"create_holiday_announcement(announcement_file)# 2. 讀取PDF元數據read_pdf_metadata(announcement_file)## # 3. 加密PDFencrypted_file = "encrypted_holiday_announcement.pdf"encrypt_pdf(announcement_file, encrypted_file, "company123")## # 4. 添加水印watermarked_file = "watermarked_holiday_announcement.pdf"add_watermark(announcement_file, watermarked_file, "公司機密")## # 5. 批量添加水印(示例)# # 首先創建一些示例PDFsample_files = ["sample1.pdf", "sample2.pdf"]for i, filename in enumerate(sample_files, 1):create_holiday_announcement(filename)## # 創建輸入輸出目錄if not os.path.exists("input_pdfs"):os.makedirs("input_pdfs")if not os.path.exists("output_pdfs"):os.makedirs("output_pdfs")## # 移動示例PDF到輸入目錄for filename in sample_files:os.rename(filename, os.path.join("input_pdfs", filename))## # 批量添加水印batch_add_watermark("input_pdfs", "output_pdfs", "內部文件")## # 6. 合并PDFmerged_file = "merged_documents.pdf"merge_pdfs([announcement_file, watermarked_file], merged_file)print("\n所有操作已完成!")if __name__ == "__main__":main()
?Python處理圖像
入門知識
- 顏色。如果你有使用顏料畫畫的經歷,那么一定知道混合紅、黃、藍三種顏料可以得到其他的顏色,事實上這三種顏色就是美術中的三原色,它們是不能再分解的基本顏色。在計算機中,我們可以將紅、綠、藍三種色光以不同的比例疊加來組合成其他的顏色,因此這三種顏色就是色光三原色。在計算機系統中,我們通常會將一個顏色表示為一個 RGB 值或 RGBA 值(其中的 A 表示 Alpha 通道,它決定了透過這個圖像的像素,也就是透明度)。
名稱 | RGB值 | 名稱 | RGB值 |
White(白) | (255, 255, 255) | Red(紅) | (255, 0, 0) |
Green(綠) | (0, 255, 0) | Blue(藍) | (0, 0, 255) |
Gray(灰) | (128, 128, 128) | Yellow(黃) | (255, 255, 0) |
Black(黑) | (0, 0, 0) | Purple(紫) | (128, 0, 128) |
- 像素。對于一個由數字序列表示的圖像來說,最小的單位就是圖像上單一顏色的小方格,這些小方塊都有一個明確的位置和被分配的色彩數值,而這些一小方格的顏色和位置決定了該圖像最終呈現出來的樣子,它們是不可分割的單位,我們通常稱之為像素(pixel)。每一個圖像都包含了一定量的像素,這些像素決定圖像在屏幕上所呈現的大小,大家如果愛好拍照或者自拍,對像素這個詞就不會陌生。
用Pillow處理圖像
Pillow 是由從著名的 Python 圖像處理庫 PIL 發展出來的一個分支,通過 Pillow 可以實現圖像壓縮和圖像處理等各種操作。可以使用下面的命令來安裝 Pillow。
pip install pillow
from PIL import Image# 讀取圖像獲得Image對象
image = Image.open('a.jpeg')
# 通過Image對象的format屬性獲得圖像的格式
print(image.format) # JPEG
# 通過Image對象的size屬性獲得圖像的尺寸
print(image.size) # (500, 750)
# 通過Image對象的mode屬性獲取圖像的模式
print(image.mode) # RGB
# 通過Image對象的show方法顯示圖像
# image.show()# 剪裁圖像
# 通過Image對象的crop方法指定剪裁區域剪裁圖像
# image.crop((80, 20, 310, 360)).show()# 生成縮略圖
# 通過Image對象的thumbnail方法生成指定尺寸的縮略圖
image.thumbnail((128, 128))
image.show()# 旋轉和翻轉
image = Image.open('a.jpeg')
# 使用Image對象的rotate方法實現圖像的旋轉
image.rotate(45).show()
# 使用Image對象的transpose方法實現圖像翻轉
# Image.FLIP_LEFT_RIGHT - 水平翻轉
# Image.FLIP_TOP_BOTTOM - 垂直翻轉
image.transpose(Image.FLIP_TOP_BOTTOM).show()# 操作像素
for x in range(80, 310):for y in range(20, 360):# 通過Image對象的putpixel方法修改圖像指定像素點image.putpixel((x, y), (128, 128, 128))
image.show()# 濾鏡效果
from PIL import ImageFilter# 使用Image對象的filter方法對圖像進行濾鏡處理
# ImageFilter模塊包含了諸多預設的濾鏡也可以自定義濾鏡
image.filter(ImageFilter.CONTOUR).show()
Pillow繪圖
Pillow 中有一個名為ImageDraw
的模塊,該模塊的Draw
函數會返回一個ImageDraw
對象,通過ImageDraw
對象的arc
、line
、rectangle
、ellipse
、polygon
等方法,可以在圖像上繪制出圓弧、線條、矩形、橢圓、多邊形等形狀,也可以通過該對象的text
方法在圖像上添加文字。
from PIL import Image, ImageDraw, ImageFont# 創建一個新的空白圖像 (800x600 像素,白色背景)
width, height = 800, 600
image = Image.new('RGB', (width, height), 'white')# 創建一個可以在圖像上繪制的 Draw 對象
draw = ImageDraw.Draw(image)# 1. 繪制矩形 (紅色邊框,不填充)
draw.rectangle([50, 50, 250, 200], outline='red', width=3)# 2. 繪制填充矩形 (藍色填充)
draw.rectangle([300, 50, 500, 200], fill='blue')# 3. 繪制橢圓 (綠色邊框,黃色填充)
draw.ellipse([50, 250, 250, 400], outline='green', fill='yellow', width=2)# 4. 繪制線條 (紫色,5像素寬)
draw.line([300, 250, 500, 400], fill='purple', width=5)# 5. 繪制多邊形 (橙色邊框,淺藍色填充)
points = [(550, 50), (700, 150), (650, 300), (500, 250)]
draw.polygon(points, outline='orange', fill='lightblue', width=2)# 6. 繪制圓弧 (紅色,從30度到270度)
draw.arc([50, 450, 250, 550], start=30, end=270, fill='red', width=3)# 7. 添加文字 (需要指定字體)
try:# 嘗試加載系統字體font = ImageFont.truetype("arial.ttf", 24)
except:# 如果找不到字體,使用默認字體font = ImageFont.load_default()draw.text((300, 450), "Hello, Pillow!", fill='black', font=font)# 8. 添加大號彩色文字 (使用不同顏色)
large_font = ImageFont.truetype("arial.ttf", 40) if font != ImageFont.load_default() else ImageFont.load_default()
draw.text((300, 500), "ImageDraw Demo", fill=(255, 0, 128), font=large_font)# 保存圖像
image.save('draw_demo.png')
print("圖像已保存為 draw_demo.png")# 顯示圖像
image.show()