PPT轉圖片拼貼工具 v4.3

軟件介紹

這個軟件就是將PPT文件轉換為圖片并且拼接起來。
效果展示在這里插入圖片描述

支持導入文件和支持導入文件夾,也支持手動輸入文件/文件夾路徑

軟件界面
在這里插入圖片描述

這一次提供了源碼和開箱即用版本,exe就是直接用就可以了。

軟件源碼

import os
import re
import sys
import win32com.client
from PIL import Image
from typing import List, Union
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QFileDialog, QProgressBar, QTextEdit, QScrollBar, QFrame, QStyleFactory
from PyQt5.QtGui import QFont, QIcon
from PyQt5.QtCore import Qt, QThread, pyqtSignal
import pythoncom
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QDesktopServicesclass PPTtoImageConverter:"""PPT轉圖片拼貼的核心功能類"""def __init__(self):passdef convert_ppt_to_png(self, ppt_path: str, output_folder: str) -> None:"""將單個PPT文件轉換為PNG圖片"""pythoncom.CoInitialize()try:ppt_app = win32com.client.Dispatch("PowerPoint.Application")except Exception as e:pythoncom.CoUninitialize()raise RuntimeError(f"無法啟動 PowerPoint 應用程序: {e}")if not os.path.exists(ppt_path):pythoncom.CoUninitialize()raise FileNotFoundError(f"PPT 文件不存在: {ppt_path}")try:presentation = ppt_app.Presentations.Open(ppt_path, WithWindow=False)presentation.SaveAs(output_folder, 18)  # 18 代表 PNG 格式presentation.Close()finally:ppt_app.Quit()pythoncom.CoUninitialize()def create_collage(self, input_folder: str, output_folder: str, ppt_name: str,row_size: int = 3, col_gap: int = 10, row_gap: int = 10) -> None:"""從PNG圖片創建拼貼畫"""files = os.listdir(input_folder)slide_files = [f for f in files if re.match(r"幻燈片\d+\.png", f, re.IGNORECASE)]if not slide_files:raise RuntimeError(f"未找到幻燈片圖片文件")slide_files.sort(key=lambda x: int(re.search(r'\d+', x).group()))try:images = [Image.open(os.path.join(input_folder, f)) for f in slide_files]except Exception as e:raise RuntimeError(f"加載圖片時出錯: {e}")if not images:raise RuntimeError("沒有可處理的圖片")width, height = images[0].sizefirst_img = images[0].resize((width * row_size + col_gap * (row_size - 1),height * row_size + int(col_gap * (row_size - 1) * height / width)),Image.LANCZOS)remaining_images = images[1:]rows = (len(remaining_images) + row_size - 1) // row_sizecanvas_width = first_img.widthcanvas_height = first_img.height + rows * (height + row_gap)collage_image = Image.new("RGB", (canvas_width, canvas_height), (255, 255, 255))collage_image.paste(first_img, (0, 0))for i, img in enumerate(remaining_images):row = i // row_sizecol = i % row_sizex = col * (width + col_gap)y = first_img.height + row * (height + row_gap)collage_image.paste(img, (x, y))collage_path = os.path.join(output_folder, f"{ppt_name}.png")collage_image.save(collage_path)for f in slide_files:os.remove(os.path.join(input_folder, f))def process_ppt_item(self, item_path: str, output_folder: str,row_size: int = 3, col_gap: int = 10, row_gap: int = 10,progress_callback=None) -> None:"""處理單個PPT文件或文件夾"""processed_count = 0total_files = 0if os.path.isfile(item_path):if item_path.lower().endswith(('.ppt', '.pptx')):total_files = 1try:ppt_filename = os.path.basename(item_path)ppt_name = os.path.splitext(ppt_filename)[0]# 為每個PPT創建單獨的臨時文件夾temp_folder = os.path.join(output_folder, f"temp_{ppt_name}")os.makedirs(temp_folder, exist_ok=True)self.convert_ppt_to_png(item_path, temp_folder)self.create_collage(temp_folder, output_folder, ppt_name, row_size, col_gap, row_gap)# 清理臨時文件夾for f in os.listdir(temp_folder):os.remove(os.path.join(temp_folder, f))os.rmdir(temp_folder)message = f"? 處理完成: {ppt_name}.png"if progress_callback:progress_callback(message, 100)processed_count = 1except Exception as e:message = f"?? 處理失敗: {os.path.basename(item_path)} - {str(e)}"if progress_callback:progress_callback(message, 100)else:message = f"?? 跳過非PPT文件: {os.path.basename(item_path)}"if progress_callback:progress_callback(message, 100)elif os.path.isdir(item_path):message = f"處理文件夾: {item_path}"if progress_callback:progress_callback(message, 0)ppt_files = [f for f in os.listdir(item_path)if f.lower().endswith(('.ppt', '.pptx'))]total_files = len(ppt_files)for i, filename in enumerate(ppt_files):file_path = os.path.join(item_path, filename)try:ppt_name = os.path.splitext(filename)[0]# 為每個PPT創建單獨的臨時文件夾temp_folder = os.path.join(output_folder, f"temp_{ppt_name}")os.makedirs(temp_folder, exist_ok=True)self.convert_ppt_to_png(file_path, temp_folder)self.create_collage(temp_folder, output_folder, ppt_name, row_size, col_gap, row_gap)# 清理臨時文件夾for f in os.listdir(temp_folder):os.remove(os.path.join(temp_folder, f))os.rmdir(temp_folder)message = f"? 處理完成 ({i + 1}/{total_files}): {ppt_name}.png"progress = int((i + 1) / total_files * 100)if progress_callback:progress_callback(message, progress)processed_count += 1except Exception as e:message = f"?? 處理失敗 ({i + 1}/{total_files}): {filename} - {str(e)}"if progress_callback:progress_callback(message, int(i / total_files * 100))else:message = f"?? 路徑不存在或無法訪問: {item_path}"if progress_callback:progress_callback(message, 100)return processed_count, total_filesclass ProcessingThread(QThread):progress_signal = pyqtSignal(str, int)def __init__(self, converter, input_path, output_path, row_size, col_gap, row_gap):super().__init__()self.converter = converterself.input_path = input_pathself.output_path = output_pathself.row_size = row_sizeself.col_gap = col_gapself.row_gap = row_gapdef run(self):try:self.converter.process_ppt_item(self.input_path,self.output_path,self.row_size,self.col_gap,self.row_gap,self.update_progress)self.progress_signal.emit("? 所有文件處理完成!", 100)except Exception as e:self.progress_signal.emit(f"? 處理過程中發生錯誤: {str(e)}", 100)def update_progress(self, message, progress):self.progress_signal.emit(message, progress)class PPTtoImageGUI(QWidget):"""PPT轉圖片拼貼的圖形界面類"""def __init__(self):super().__init__()self.initUI()self.converter = PPTtoImageConverter()self.processing = Falseself.process_thread = Nonedef initUI(self):self.setWindowTitle("PPT轉圖片拼貼工具@阿幸")self.setGeometry(100, 100, 700, 550)# 設置應用程序圖標self.setWindowIcon(QIcon("PTT.ico"))  # 請確保app.ico文件存在于程序運行目錄下main_layout = QVBoxLayout()# 輸入路徑選擇input_layout = QHBoxLayout()input_label = QLabel("輸入路徑:")input_label.setFont(QFont("Microsoft YaHei", 10))self.input_path_edit = QLineEdit()self.input_path_edit.setFont(QFont("Microsoft YaHei", 10))# 瀏覽按鈕 - 文件選擇browse_file_button = QPushButton("選擇文件")browse_file_button.setFont(QFont("Microsoft YaHei", 16, QFont.Bold))browse_file_button.setFixedWidth(150)browse_file_button.setStyleSheet("""QPushButton {background-color: #2196F3;color: white;border: none;padding: 5px;border-radius: 4px;}QPushButton:hover {background-color: #1976D2;}""")browse_file_button.clicked.connect(self.browse_file)# 瀏覽按鈕 - 文件夾選擇browse_folder_button = QPushButton("選擇文件夾")browse_folder_button.setFont(QFont("Microsoft YaHei", 16, QFont.Bold))browse_folder_button.setFixedWidth(150)browse_folder_button.setStyleSheet("""QPushButton {background-color: #2196F3;color: white;border: none;padding: 5px;border-radius: 4px;}QPushButton:hover {background-color: #1976D2;}""")browse_folder_button.clicked.connect(self.browse_folder)input_layout.addWidget(input_label)input_layout.addWidget(self.input_path_edit)input_layout.addWidget(browse_file_button)input_layout.addWidget(browse_folder_button)main_layout.addLayout(input_layout)# 輸出路徑選擇output_layout = QHBoxLayout()output_label = QLabel("輸出路徑:")output_label.setFont(QFont("Microsoft YaHei", 10))self.output_path_edit = QLineEdit()self.output_path_edit.setFont(QFont("Microsoft YaHei", 10))browse_output_button = QPushButton("瀏覽")browse_output_button.setFont(QFont("Microsoft YaHei", 16, QFont.Bold))browse_output_button.setFixedWidth(150)browse_output_button.setStyleSheet("""QPushButton {background-color: #2196F3;color: white;border: none;padding: 5px;border-radius: 4px;}QPushButton:hover {background-color: #1976D2;}""")browse_output_button.clicked.connect(self.browse_output_path)output_layout.addWidget(output_label)output_layout.addWidget(self.output_path_edit)output_layout.addWidget(browse_output_button)main_layout.addLayout(output_layout)# 設置參數params_frame = QFrame()params_frame.setFrameShape(QFrame.StyledPanel)params_layout = QVBoxLayout(params_frame)params_label = QLabel("拼貼設置")params_label.setFont(QFont("Microsoft YaHei", 10))params_layout.addWidget(params_label)# 每行圖片數量row_size_layout = QHBoxLayout()row_size_label = QLabel("每行圖片數量:")row_size_label.setFont(QFont("Microsoft YaHei", 10))self.row_size_edit = QLineEdit()self.row_size_edit.setFont(QFont("Microsoft YaHei", 10))self.row_size_edit.setText("3")row_size_minus_button = QPushButton("-")row_size_minus_button.setFont(QFont("Microsoft YaHei", 16, QFont.Bold))row_size_minus_button.setFixedWidth(50)row_size_minus_button.setStyleSheet("""QPushButton {background-color: #2196F3;color: white;border: none;padding: 5px;border-radius: 4px;}QPushButton:hover {background-color: #1976D2;}""")row_size_minus_button.clicked.connect(lambda: self.decrement_var(self.row_size_edit, 1, 10))row_size_plus_button = QPushButton("+")row_size_plus_button.setFont(QFont("Microsoft YaHei", 16, QFont.Bold))row_size_plus_button.setFixedWidth(50)row_size_plus_button.setStyleSheet("""QPushButton {background-color: #2196F3;color: white;border: none;padding: 5px;border-radius: 4px;}QPushButton:hover {background-color: #1976D2;}""")row_size_plus_button.clicked.connect(lambda: self.increment_var(self.row_size_edit, 1, 10))row_size_layout.addWidget(row_size_label)row_size_layout.addWidget(self.row_size_edit)row_size_layout.addWidget(row_size_minus_button)row_size_layout.addWidget(row_size_plus_button)params_layout.addLayout(row_size_layout)# 列間距col_gap_layout = QHBoxLayout()col_gap_label = QLabel("列間距(像素):")col_gap_label.setFont(QFont("Microsoft YaHei", 10))self.col_gap_edit = QLineEdit()self.col_gap_edit.setFont(QFont("Microsoft YaHei", 10))self.col_gap_edit.setText("10")col_gap_minus_button = QPushButton("-")col_gap_minus_button.setFont(QFont("Microsoft YaHei", 16, QFont.Bold))col_gap_minus_button.setFixedWidth(50)col_gap_minus_button.setStyleSheet("""QPushButton {background-color: #2196F3;color: white;border: none;padding: 5px;border-radius: 4px;}QPushButton:hover {background-color: #1976D2;}""")col_gap_minus_button.clicked.connect(lambda: self.decrement_var(self.col_gap_edit, 0, 50))col_gap_plus_button = QPushButton("+")col_gap_plus_button.setFont(QFont("Microsoft YaHei", 16, QFont.Bold))col_gap_plus_button.setFixedWidth(50)col_gap_plus_button.setStyleSheet("""QPushButton {background-color: #2196F3;color: white;border: none;padding: 5px;border-radius: 4px;}QPushButton:hover {background-color: #1976D2;}""")col_gap_plus_button.clicked.connect(lambda: self.increment_var(self.col_gap_edit, 0, 50))col_gap_layout.addWidget(col_gap_label)col_gap_layout.addWidget(self.col_gap_edit)col_gap_layout.addWidget(col_gap_minus_button)col_gap_layout.addWidget(col_gap_plus_button)params_layout.addLayout(col_gap_layout)# 行間距row_gap_layout = QHBoxLayout()row_gap_label = QLabel("行間距(像素):")row_gap_label.setFont(QFont("Microsoft YaHei", 10))self.row_gap_edit = QLineEdit()self.row_gap_edit.setFont(QFont("Microsoft YaHei", 10))self.row_gap_edit.setText("10")row_gap_minus_button = QPushButton("-")row_gap_minus_button.setFont(QFont("Microsoft YaHei", 16, QFont.Bold))row_gap_minus_button.setFixedWidth(50)row_gap_minus_button.setStyleSheet("""QPushButton {background-color: #2196F3;color: white;border: none;padding: 5px;border-radius: 4px;}QPushButton:hover {background-color: #1976D2;}""")row_gap_minus_button.clicked.connect(lambda: self.decrement_var(self.row_gap_edit, 0, 50))row_gap_plus_button = QPushButton("+")row_gap_plus_button.setFont(QFont("Microsoft YaHei", 16, QFont.Bold))row_gap_plus_button.setFixedWidth(50)row_gap_plus_button.setStyleSheet("""QPushButton {background-color: #2196F3;color: white;border: none;padding: 5px;border-radius: 4px;}QPushButton:hover {background-color: #1976D2;}""")row_gap_plus_button.clicked.connect(lambda: self.increment_var(self.row_gap_edit, 0, 50))row_gap_layout.addWidget(row_gap_label)row_gap_layout.addWidget(self.row_gap_edit)row_gap_layout.addWidget(row_gap_minus_button)row_gap_layout.addWidget(row_gap_plus_button)params_layout.addLayout(row_gap_layout)main_layout.addWidget(params_frame)# 處理按鈕 - 使用水平布局放置兩個按鈕button_layout = QHBoxLayout()self.process_button = QPushButton("開始處理")self.process_button.setFont(QFont("Microsoft YaHei", 16, QFont.Bold))self.process_button.setFixedWidth(120)self.process_button.setStyleSheet("""QPushButton {background-color: #2196F3;color: white;border: none;padding: 5px;border-radius: 4px;}QPushButton:hover {background-color: #1976D2;}""")self.process_button.clicked.connect(self.start_processing)button_layout.addWidget(self.process_button, alignment=Qt.AlignCenter)# 添加"關于阿幸"按鈕self.about_button = QPushButton("關于阿幸")self.about_button.setFont(QFont("Microsoft YaHei", 16, QFont.Bold))self.about_button.setFixedWidth(120)self.about_button.setStyleSheet("""QPushButton {background-color: #2196F3;color: white;border: none;padding: 5px;border-radius: 4px;}QPushButton:hover {background-color: #388E3C;}""")self.about_button.clicked.connect(self.open_axing_website)button_layout.addWidget(self.about_button, alignment=Qt.AlignCenter)main_layout.addLayout(button_layout)# 進度條progress_layout = QHBoxLayout()progress_label = QLabel("處理進度:")progress_label.setFont(QFont("Microsoft YaHei", 10))self.progress_bar = QProgressBar()self.progress_bar.setRange(0, 100)self.progress_bar.setValue(0)progress_layout.addWidget(progress_label)progress_layout.addWidget(self.progress_bar)main_layout.addLayout(progress_layout)# 日志區域log_layout = QHBoxLayout()log_label = QLabel("處理日志:")log_label.setFont(QFont("Microsoft YaHei", 10))self.log_text = QTextEdit()self.log_text.setReadOnly(True)log_scrollbar = QScrollBar(Qt.Vertical)self.log_text.setVerticalScrollBar(log_scrollbar)log_layout.addWidget(log_label)log_layout.addWidget(self.log_text)main_layout.addLayout(log_layout)self.setLayout(main_layout)# 設置默認路徑self.input_path_edit.setText(r"D:\Desktop\文件存儲\1")self.output_path_edit.setText(r"D:\Desktop\文件存儲\1")def browse_file(self):"""瀏覽并選擇單個PPT文件"""file_path, _ = QFileDialog.getOpenFileName(self, "選擇PPT文件", "", "PowerPoint 文件 (*.ppt *.pptx)")if file_path:self.input_path_edit.setText(file_path)def browse_folder(self):"""瀏覽并選擇文件夾"""folder_path = QFileDialog.getExistingDirectory(self, "選擇文件夾")if folder_path:self.input_path_edit.setText(folder_path)def browse_output_path(self):"""瀏覽并選擇輸出路徑"""path = QFileDialog.getExistingDirectory(self, "選擇輸出文件夾")if path:self.output_path_edit.setText(path)def start_processing(self):"""開始處理PPT文件"""if self.processing:returninput_path = self.input_path_edit.text()output_path = self.output_path_edit.text()if not input_path or not output_path:print("請設置輸入路徑和輸出路徑")returnif not os.path.exists(input_path):print(f"輸入路徑不存在: {input_path}")returnos.makedirs(output_path, exist_ok=True)self.log_text.clear()self.progress_bar.setValue(0)row_size = int(self.row_size_edit.text())col_gap = int(self.col_gap_edit.text())row_gap = int(self.row_gap_edit.text())self.processing = Trueself.process_button.setText("處理中...")self.process_button.setEnabled(False)self.process_thread = ProcessingThread(self.converter, input_path, output_path, row_size, col_gap, row_gap)self.process_thread.progress_signal.connect(self.update_progress)self.process_thread.finished.connect(self.process_finished)self.process_thread.start()def update_progress(self, message, progress):self.log_text.append(message)self.progress_bar.setValue(progress)def process_finished(self):self.processing = Falseself.process_button.setText("開始處理")self.process_button.setEnabled(True)def increment_var(self, edit, min_val, max_val):"""增加變量值,不超過最大值"""current = int(edit.text())if current < max_val:edit.setText(str(current + 1))def decrement_var(self, edit, min_val, max_val):"""減少變量值,不小于最小值"""current = int(edit.text())if current > min_val:edit.setText(str(current - 1))def open_axing_website(self):"""打開關于阿幸的網站"""url = QUrl("https://a-xing.top/")QDesktopServices.openUrl(url)if __name__ == "__main__":app = QApplication(sys.argv)app.setStyle(QStyleFactory.create('Fusion'))gui = PPTtoImageGUI()gui.show()sys.exit(app.exec_())

源碼下載

https://pan.quark.cn/s/f8bf2904e8c3

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82641.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82641.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82641.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

新版NANO下載燒錄過程

一、序言 搭建 Jetson 系列產品燒錄系統的環境需要在電腦主機上安裝 Ubuntu 系統。此處使用 18.04 LTS。 二、環境搭建 1、安裝庫 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建環境的過程需要這個應用庫來將某些 NVIDIA 軟件組件安裝到 Je…

神經網絡-Day45

目錄 一、tensorboard的基本操作1.1 發展歷史1.2 tensorboard的原理 二、tensorboard實戰2.1 cifar-10 MLP實戰2.2 cifar-10 CNN實戰 在神經網絡訓練中&#xff0c;為了幫助理解&#xff0c;借用了很多的組件&#xff0c;比如訓練進度條、可視化的loss下降曲線、權重分布圖&…

設計模式之單例模式(二): 心得體會

設計模式之單例模式(一)-CSDN博客 目錄 1.背景 2.分析 2.1.違背面向對象設計原則&#xff0c;導致職責混亂 2.2.全局狀態泛濫&#xff0c;引發依賴與耦合災難 2.3.多線程場景下風險放大&#xff0c;性能與穩定性受損 2.4.測試與維護難度指數級上升 2.5.違背 “最小知識原…

windows10 php報錯

參考這個&#xff0c; 實際解決了問題&#xff0c; 主要是repair c 然后重啟 【BUG】PHP Warning: ‘C:\\WINDOWS\\SYSTEM32\\VCRUNTIME140.dll‘ 14.0 is not compatible with this PHP bu_php warning: vcruntime140.dll 14.0 is not compat-CSDN博客

GPU顯存的作用和如何選擇

核心定義與作用 首先&#xff0c;顯存的全稱是顯示內存&#xff0c;英文是Video RAM或VRAM&#xff0c;是顯卡上的專用內存。 顯存的主要作用是用來存儲圖形處理單元&#xff08;GPU&#xff09;需要處理的數據&#xff0c;比如紋理、頂點數據、幀緩沖區等。 數據中轉站 GPU…

從零開始:用Tkinter打造你的第一個Python桌面應用

目錄 一、界面搭建:像搭積木一樣組合控件 二、菜單系統:給應用裝上“控制中樞” 三、事件驅動:讓界面“活”起來 四、進階技巧:打造專業級體驗 五、部署發布:讓作品觸手可及 六、學習路徑建議 在Python生態中,Tkinter就像一把瑞士軍刀,它沒有花哨的特效,卻能快速…

Unity基礎-Mathf相關

Unity基礎-Mathf相關 一、Mathf數學工具 概述 Mathf是Unity中封裝好用于數學計算的工具結構體&#xff0c;提供了豐富的數學計算方法&#xff0c;特別適用于游戲開發場景。它是Unity開發中最常用的數學工具之一&#xff0c;能夠幫助我們處理各種數學計算和插值運算。 Mathf…

Android Studio 之基礎代碼解析

1、 onCreate 在 Android 開發中&#xff0c;MainActivity 作為應用的入口 Activity&#xff0c;其 onCreate() 方法是生命周期中第一個且最重要的回調方法&#xff0c;負責初始化核心組件和界面。以下是其核心要點&#xff1a; 一、基本定義與作用 調用時機 當 Activity 首次…

AIGC圖像去噪:核心原理、算法實現與深度學習模型詳解

1. 背景概述 1.1 目標與范疇 在AIGC(人工智能生成內容) 的技術生態系統中,圖像生成模型(如生成對抗網絡GAN、擴散模型Diffusion Model)所產出的視覺內容,其質量常因訓練數據中的固有瑕疵、生成過程中的隨機擾動或數據傳輸期間的信號衰減而呈現出不同程度的退化。因此,…

電路圖識圖基礎知識-自耦變壓器降壓啟動電動機控制電路(十六)

自耦變壓器降壓啟動電動機控制電路 自耦變壓器降壓啟動電動機控制電路是將自耦變壓器的原邊繞組接于電源側&#xff0c;副邊繞組接 于電機側。電動機定子繞組啟動時的電壓為自耦變壓器降壓后得到的電壓&#xff0c;這樣可以減少電動 機的啟動電流和啟動力矩&#xff0c;當電動…

Life:Internship finding

1. 前言 fishwheel writes this Blog to 記錄自分自身在研二下找實習的經歷。When 寫這篇 Blog 的時候我的最后一搏也掛掉了&#xff0c;只能啟用保底方案了。When I 打開我的郵箱時&#xff0c;發現里面有 nearly 100 多封與之相關的郵件&#xff0c;頓時感到有些心涼&#x…

Redis 常用數據類型和命令使用

目錄 1 string 2 hash 3 list 4 set集合 5 zset有序集合 1 string 值可以是字符串、數字和二進制的value&#xff0c;值最大不能超過512MB 應用場景&#xff1a; 應用程序緩存 計數器 web共享session 限速 1.1 設置單個鍵值 set <key> value [EX seconds|PX…

Spring Boot緩存組件Ehcache、Caffeine、Redis、Hazelcast

一、Spring Boot緩存架構核心 Spring Boot通過spring-boot-starter-cache提供統一的緩存抽象層&#xff1a; #mermaid-svg-PW9nciqD2RyVrZcZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PW9nciqD2RyVrZcZ .erro…

【photoshop】專色濃度和專色密度

1.1 專色濃度 是圖層填充到專色前&#xff0c;設置的前景色CMYK的K值。填充到專色后&#xff0c;可以查看到專色中圖層的k值。 ps前景色填充快捷鍵 1.Windows 系統&#xff1a;Alt Delete&#xff1b;2.Mac 系統&#xff1a;Option Delete。 1.2專色密度 專色的屬性&…

用電腦控制keysight示波器

KEYSIGHT示波器HD304MSO性能 亮點&#xff1a; 體驗 200 MHz 至 1 GHz 的帶寬和 4 個模擬通道。與 12 位 ADC 相比&#xff0c;使用 14 位模數轉換器 &#xff08;ADC&#xff09; 將垂直分辨率提高四倍。使用 10.1 英寸電容式觸摸屏輕松查看和分析您的信號。捕獲 50 μVRMS …

leetcode hot100刷題日記——33.二叉樹的層序遍歷

解題總結二維vector的初始化方法 題目描述情況1&#xff1a;不確定行數和列數情況2&#xff1a;已知行數和列數情況3&#xff1a;已知行數但不知道列數情況4&#xff1a;已知列數但不知道行數 題目描述 解答&#xff1a;用隊列 思路都差不多&#xff0c;我覺得對于我自己來說&a…

微服務面試資料1

在當今快速發展的技術領域&#xff0c;微服務架構已經成為構建復雜系統的重要方式之一。本文將圍繞微服務的核心概念、技術棧、分布式事務處理、微服務拆分與設計&#xff0c;以及敏捷開發實踐等關鍵問題展開深入探討&#xff0c;旨在為準備面試的 Java 開發者提供一份全面的復…

【設計模式-4.8】行為型——中介者模式

說明&#xff1a;本文介紹行為型設計模式之一的中介者模式 定義 中介者模式&#xff08;Mediator Pattern&#xff09;又叫作調節者模式或調停者模式。用一個中介對象封裝一系列對象交互&#xff0c;中介者使各對象不需要顯式地互相作用&#xff0c;從而使其耦合松散&#xf…

Oracle 的 SEC_CASE_SENSITIVE_LOGON 參數

Oracle 的SEC_CASE_SENSITIVE_LOGON 參數 關鍵版本信息 SEC_CASE_SENSITIVE_LOGON 參數在以下版本中被棄用&#xff1a; Oracle 12c Release 1 (12.1)&#xff1a; 該參數首次被標記為"過時"(obsolete)但依然保持功能有效 Oracle 18c/19c 及更高版本&#xff1a; …

《圖解技術體系》How Redis Architecture Evolves?

Redis架構的演進經歷了多個關鍵階段&#xff0c;從最初的內存數據庫發展為支持分布式、多模型和持久化的高性能系統。以下為具體演進路徑&#xff1a; 單線程模型與基礎數據結構 Redis最初采用單線程架構&#xff0c;利用高效的I/O多路復用&#xff08;如epoll&#xff09;處…