背景需求
搭档要做一个“教师讲故事比赛”的PPT背景。
四选一,搭档选了一张好看的,这是纯图片,不能修改的。直接放到PPT里。
然后搭档又想了想,又选了一张左下图,但是要消除“活动方案几个字”
我把这张图单独提出来,要求去掉“活动方案”字样,但是最终,缺了标题
用正确的标题和副标题重新做一张
重新做图片,图案又不一样了。最后搭档选了右下角一张
第二天,搭档说删掉“教师变成青年教师”
然后搭档提出一个需求——不要水印
我问问手机“千问”,是否可以去掉水印
这里面提到的“豆包付费”可以文字水印,我不想花线,同时也提到的网页“检查”模式下找图片的地址。
‘
把两张图片下载,
1、普通下载的图片右下角有“豆包AI生成”,
2、网页检查模式下载的图片左上角有“AI生成”
虽然都有水印文字,但是在不同的位置上,所以可以裁剪拼图
如果我不想用PPT裁剪,是否可以做一个Python程序,批量做图。
测试图片
''' 豆包图片有水印 下载网页上的图片+下载网页-检查-src的图片,重叠合并,切掉左上角的水印 Deepseek、阿夏 20260511 ''' from PIL import Image import os def process_images(): # 定义路径 folder_path = r"C:\Users\jg2yXRZ\OneDrive\桌面\20260511豆包重叠去水印" subfolder_path = os.path.join(folder_path, "00图片") # 获取00图片文件夹中的所有图片文件 image_extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.tiff'] images = [] for file in os.listdir(subfolder_path): if any(file.lower().endswith(ext) for ext in image_extensions): images.append(os.path.join(subfolder_path, file)) # 确保图片数量是双数 if len(images) % 2 != 0: print(f"警告:图片数量为{len(images)},不是双数!") return if len(images) < 2: print("图片数量不足2张") return # 读取第一张图片 first_img_path = images[0] first_img = Image.open(first_img_path) print(f"第一张图片: {first_img_path}") print(f"第一张图片尺寸: {first_img.size}") # 读取第二张图片 second_img_path = images[1] second_img = Image.open(second_img_path) print(f"第二张图片: {second_img_path}") print(f"第二张图片尺寸: {second_img.size}") # 获取第二张图片的尺寸 second_width, second_height = second_img.size # 定义要裁剪的区域:从(100,100)到图片的宽度和高度 # 确保裁剪区域在图片范围内 crop_x1 = min(200, second_width) crop_y1 = min(200, second_height) crop_x2 = second_width crop_y2 = second_height if crop_x1 >= crop_x2 or crop_y1 >= crop_y2: print("错误:裁剪区域无效,起始点超出了图片范围") return # 裁剪第二张图片的指定区域 cropped_region = second_img.crop((crop_x1, crop_y1, crop_x2, crop_y2)) print(f"裁剪区域尺寸: {cropped_region.size}") # 获取裁剪后区域的尺寸 crop_width, crop_height = cropped_region.size # 确保裁剪区域尺寸不超过第一张图片 first_width, first_height = first_img.size if crop_width > first_width or crop_height > first_height: print(f"警告:裁剪区域({crop_width}x{crop_height})大于第一张图片({first_width}x{first_height})") # 调整裁剪区域大小以适应第一张图片 cropped_region = cropped_region.resize((min(crop_width, first_width), min(crop_height, first_height))) crop_width, crop_height = cropped_region.size # 计算右下角对齐的位置 paste_x = first_width - crop_width paste_y = first_height - crop_height print(f"粘贴位置: ({paste_x}, {paste_y})") # 将裁剪区域粘贴到第一张图片上 # 创建一个副本,避免修改原图 result_img = first_img.copy() result_img.paste(cropped_region, (paste_x, paste_y)) # 保存结果图片 output_path = os.path.join(folder_path, "000.jpg") result_img.save(output_path, "JPEG", quality=95) print(f"图片已保存到: {output_path}") # 显示结果信息 print(f"\n处理完成!") print(f"原第一张图片尺寸: {first_width}x{first_height}") print(f"从第二张图片裁剪: 从({crop_x1},{crop_y1})到({crop_x2},{crop_y2})") print(f"粘贴后图片尺寸: {result_img.size}") if __name__ == "__main__": try: process_images() except Exception as e: print(f"处理过程中出现错误: {e}") # 如果需要更详细的错误信息,可以取消下面的注释 # import traceback # traceback.print_exc()虽然可以通过Python拼合做出无水印的豆包图片,但是人工下载图片比较繁琐,最好是爬虫下载两套图片。再进行拼图。
生成图片
爬虫下载这四张图片
import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin, urlparse import time from pathlib import Path def download_images_from_page(url, save_folder="downloaded_images"): """ 下载网页上的所有图片 Args: url: 要爬取的网页地址 save_folder: 保存图片的文件夹名称 """ # 创建保存图片的文件夹 if not os.path.exists(save_folder): os.makedirs(save_folder) # 设置请求头,模拟浏览器访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } try: # 发送请求获取网页内容 print(f"正在访问: {url}") response = requests.get(url, headers=headers, timeout=10) response.raise_for_status() # 检查请求是否成功 # 解析HTML soup = BeautifulSoup(response.text, 'html.parser') # 查找所有img标签 img_tags = soup.find_all('img') print(f"找到 {len(img_tags)} 个图片标签") downloaded_count = 0 for i, img in enumerate(img_tags): # 获取图片URL(优先使用src,如果没有则尝试data-src等) img_url = img.get('src') or img.get('data-src') or img.get('data-original') if not img_url: continue # 拼接完整的URL if not img_url.startswith('http'): img_url = urljoin(url, img_url) # 获取图片文件名 parsed_url = urlparse(img_url) img_name = os.path.basename(parsed_url.path) # 如果没有扩展名,尝试从Content-Type获取 if not img_name or '.' not in img_name: img_name = f"image_{i+1}.jpg" # 确保文件名安全(移除特殊字符) img_name = "".join(c for c in img_name if c.isalnum() or c in '.-_') if not img_name: img_name = f"image_{i+1}.jpg" # 完整的保存路径 save_path = os.path.join(save_folder, img_name) try: # 下载图片 print(f"正在下载: {img_url}") img_response = requests.get(img_url, headers=headers, timeout=10) img_response.raise_for_status() # 保存图片 with open(save_path, 'wb') as f: f.write(img_response.content) downloaded_count += 1 print(f"✓ 已保存: {img_name} (大小: {len(img_response.content)} bytes)") # 添加延迟,避免请求过快 time.sleep(0.5) except Exception as e: print(f"✗ 下载失败 {img_url}: {e}") print(f"\n完成!共下载 {downloaded_count} 张图片,保存到 '{save_folder}' 文件夹") except Exception as e: print(f"访问网页失败: {e}") def download_images_with_selenium(url, save_folder="downloaded_images"): """ 使用Selenium处理动态加载的页面(如果需要) 需要先安装: pip install selenium 还需要下载对应的浏览器驱动 """ try: from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC except ImportError: print("请先安装selenium: pip install selenium") return # 创建保存图片的文件夹 if not os.path.exists(save_folder): os.makedirs(save_folder) # 设置Chrome选项 options = webdriver.ChromeOptions() options.add_argument('--headless') # 无头模式,不显示浏览器窗口 options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') driver = webdriver.Chrome(options=options) try: print(f"正在访问: {url}") driver.get(url) # 等待页面加载完成 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.TAG_NAME, "img"))) # 滚动页面,触发懒加载的图片 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) # 获取所有图片元素 img_elements = driver.find_elements(By.TAG_NAME, "img") print(f"找到 {len(img_elements)} 个图片元素") downloaded_count = 0 for i, img in enumerate(img_elements): img_url = img.get_attribute('src') or img.get_attribute('data-src') if not img_url or 'data:image' in img_url: continue # 获取图片文件名 img_name = f"image_{i+1}.jpg" save_path = os.path.join(save_folder, img_name) try: print(f"正在下载: {img_url}") response = requests.get(img_url, timeout=10) response.raise_for_status() with open(save_path, 'wb') as f: f.write(response.content) downloaded_count += 1 print(f"✓ 已保存: {img_name}") time.sleep(0.3) except Exception as e: print(f"✗ 下载失败: {e}") print(f"\n完成!共下载 {downloaded_count} 张图片") finally: driver.quit() if __name__ == "__main__": # 要下载的网页地址(你的CSDN编辑页面) # 注意:CSDN编辑页面通常需要登录才能访问 target_url = "https://www.doubao.com/chat/38425461077570050?channel=cnblogs" print("=" * 50) print("图片批量下载工具") print("=" * 50) # 方式1:使用简单的requests方法 print("\n方式1:使用requests方法下载") download_images_from_page(target_url, "csdn_images") # 方式2:如果需要处理动态加载的内容,使用selenium # print("\n方式2:使用selenium方法下载") # download_images_with_selenium(target_url, "csdn_images_selenium")