Commit 0fc55007 authored by 时海鑫's avatar 时海鑫

first commit

parent 90eb94e6
import requests
import os
import json
from bs4 import BeautifulSoup
from urllib.parse import quote
# ==========================================================
# 可配置参数
# ==========================================================
# 1. 你想搜索的关键词
SEARCH_KEYWORD = "薄荷"
# 2. 你想下载的图片数量
DOWNLOAD_LIMIT = 50
# 3. 图片保存的根目录 (脚本会自动创建以关键词命名的子文件夹)
OUTPUT_DIR = "bing_images"
# ==========================================================
class BingImageScraper:
def __init__(self, keyword, limit, output_dir):
self.base_url = "https://cn.bing.com/images/search"
self.keyword = keyword
self.limit = limit
self.output_dir = os.path.join(output_dir, keyword)
self.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'
}
self.downloaded_count = 0
# 确保输出目录存在
if not os.path.exists(self.output_dir):
os.makedirs(self.output_dir)
print(f"创建文件夹: {self.output_dir}")
def fetch_images(self):
print(f"开始爬取 '{self.keyword}' 的图片...")
# 通过循环和调整 first 参数来实现翻页
while self.downloaded_count < self.limit:
# 构造请求 URL
# first 参数控制分页,每次请求后递增
params = {
'q': self.keyword,
'form': 'HDRSC2',
'first': self.downloaded_count + 1
}
try:
response = requests.get(self.base_url, params=params, headers=self.headers, timeout=10)
response.raise_for_status() # 如果请求失败则抛出异常
except requests.exceptions.RequestException as e:
print(f"请求搜索页面失败: {e}")
break
# 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(response.text, 'lxml')
# 查找所有包含图片信息的 <a> 标签
# Bing 将图片数据存储在 class="iusc" 的 a 标签的 "m" 属性中
image_elements = soup.find_all('a', class_='iusc')
if not image_elements:
print("没有找到更多图片,或者页面结构已改变。")
break
for element in image_elements:
if self.downloaded_count >= self.limit:
break
# "m" 属性是一个 JSON 字符串,包含图片元数据
m_attr = element.get('m')
if not m_attr:
continue
try:
# 解析 JSON 数据
m_data = json.loads(m_attr)
# 获取高清图片 URL
image_url = m_data.get('murl')
if image_url:
self.download_image(image_url)
except (json.JSONDecodeError, KeyError) as e:
# print(f"解析图片元数据失败: {e}")
continue
print(f"\n任务完成!总共下载了 {self.downloaded_count} 张图片。")
def download_image(self, url):
try:
print(f"[{self.downloaded_count + 1}/{self.limit}] 正在下载: {url}")
img_response = requests.get(url, headers=self.headers, timeout=15, stream=True)
img_response.raise_for_status()
# 从 URL 中获取文件名和扩展名
filename = url.split('/')[-1].split('?')[0]
if '.' not in filename: # 如果没有扩展名,则默认 .jpg
filename += '.jpg'
# 防止文件名过长或包含非法字符 (简单处理)
safe_filename = f"{self.downloaded_count + 1}_{''.join(c for c in filename if c.isalnum() or c in '._-')[-50:]}"
filepath = os.path.join(self.output_dir, safe_filename)
# 以二进制写模式保存图片
with open(filepath, 'wb') as f:
for chunk in img_response.iter_content(1024):
f.write(chunk)
self.downloaded_count += 1
except requests.exceptions.RequestException as e:
print(f"下载失败: {url}, 错误: {e}")
except Exception as e:
print(f"保存文件时发生未知错误: {e}")
if __name__ == "__main__":
# 创建爬虫实例并开始执行
scraper = BingImageScraper(
keyword=SEARCH_KEYWORD,
limit=DOWNLOAD_LIMIT,
output_dir=OUTPUT_DIR
)
scraper.fetch_images()
\ No newline at end of file
def calculate_crc8(data: bytes) -> int:
"""
根据给定的参数计算CRC-8/DVB-S2校验和。
- Polynomial: 0x1D
- Initial Value: 0xFF
- No Refin, No Refout, No Xorout
"""
crc_value = 0xFF
crc_poly = 0x1D
for byte in data:
crc_value ^= byte
for _ in range(8):
if (crc_value & 0x80) != 0:
# 如果最高位是1,左移一位并与多项式异或
crc_value = ((crc_value << 1) ^ crc_poly) & 0xFF
else:
# 如果最高位是0,仅左移一位
crc_value = (crc_value << 1) & 0xFF
return crc_value
def parse_hex_string(hex_string: str) -> bytes or None:
"""
将空格分隔的十六进制字符串(如 '0x41 0x23')解析为bytes对象。
"""
try:
# 去除首尾空格,并按空格分割
parts = hex_string.strip().split()
# 将每个部分从16进制字符串转换为整数,然后创建bytes对象
return bytes([int(part, 16) for part in parts])
except (ValueError, TypeError):
print(f"错误: 无法解析输入的十六进制字符串。请确保格式正确。")
return None
def verify_data_with_crc(full_data: bytes) -> bool:
"""
验证一个完整数据帧的CRC校验和是否正确。
数据帧的最后一位被视为期望的CRC值。
"""
if not full_data or len(full_data) < 2:
print("错误: 数据太短,无法进行CRC校验。")
return False
# 分离数据和期望的CRC
data_to_check = full_data[:-1] # 所有字节,除了最后一个
expected_crc = full_data[-1] # 最后一个字节
# 计算CRC
calculated_crc = calculate_crc8(data_to_check)
# 打印验证过程信息
print("-" * 40)
print(f"待计算的数据 ({len(data_to_check)} bytes):")
# 为了方便查看,每16个字节换一行
for i in range(0, len(data_to_check), 16):
print(" ".join(f"{b:02X}" for b in data_to_check[i:i+16]))
print("\n--- 校验结果 ---")
print(f"期望的 CRC 值: 0x{expected_crc:02X}")
print(f"计算出的 CRC 值: 0x{calculated_crc:02X}")
print("-" * 18)
# 比较并返回结果
if calculated_crc == expected_crc:
print("✅ CRC 校验通过! 数据正确。")
return True
else:
print("❌ CRC 校验失败! 数据可能已损坏。")
return False
# 主程序入口
if __name__ == '__main__':
# 您可以直接在这里粘贴从设备或日志中复制的完整数据字符串
input_hex_string = "0x41 0x23 0x00 0x05 0x01 0x40 0x03 0xCA 0x02 0xBB 0x02 0x40 0x02 0x84 0x01 0x4A 0x03 0x40 0x02 0xE6 0x02 0x6D 0x04 0x40 0x04 0xC4 0x01 0xBC 0x05 0x40 0x02 0x94 0x02 0x0A 0xBA"
# 1. 解析字符串为字节数据
full_data_bytes = parse_hex_string(input_hex_string)
# 2. 如果解析成功,则进行CRC校验
if full_data_bytes:
verify_data_with_crc(full_data_bytes)
\ No newline at end of file
from flask import Flask, request, jsonify
import requests
app = Flask(__name__)
DEEPSEEK_API_KEY = "sk-54852946bf7d49e99b05250651327453"
DEEPSEEK_API_BASE = "https://api.deepseek.com/v1"
# OpenAI 的模型别名映射到 DeepSeek 模型
MODEL_MAP = {
"gpt-3.5-turbo": "deepseek-chat",
"gpt-4": "deepseek-coder"
}
@app.route("/v1/chat/completions", methods=["POST"])
def chat_completions():
data = request.json.copy()
model = data.get("model")
# 替换成 DeepSeek 的真实模型名
if model in MODEL_MAP:
data["model"] = MODEL_MAP[model]
headers = {
"Authorization": f"Bearer {DEEPSEEK_API_KEY}",
"Content-Type": "application/json"
}
resp = requests.post(
f"{DEEPSEEK_API_BASE}/chat/completions",
headers=headers,
json=data
)
return jsonify(resp.json())
@app.route("/v1/models", methods=["GET"])
def models():
# 伪装成支持 OpenAI 模型
return jsonify({
"object": "list",
"data": [
{"id": "gpt-3.5-turbo", "object": "model"},
{"id": "gpt-4", "object": "model"}
]
})
if __name__ == "__main__":
app.run(host="127.0.0.1", port=8000)
import openai
openai.api_base = "https://api.deepseek.com/v1"
openai.api_key = "sk-47a89b72b6324f4895f01a109b82a253"
#https://zhuanlan.zhihu.com/p/654738377
def deepseek(content_t):
prompt = f"""
你是一位图像场景提取专家。请阅读下面这段中文小说,从中提取出所有**不含人物**、可以用于图像生成的具体子场景。
每个子场景请用一句英文的 Stable Diffusion 风格 prompt 表达,描述中应包含:
- 场景内容(地点、物体、自然光影等)
- 环境细节(光线、氛围、季节、时间)
- 图像风格关键词(如: realistic, ultra-detailed, 8k, cinematic light 等)
禁止出现人物、人形、手、脸、肖像、衣服、姿态、动作等与人物相关的内容。
原文:
{content_t}
输出格式如下:
1. <英文场景描述1>
2. <英文场景描述2>
...
"""
response = openai.ChatCompletion.create(
model="deepseek-chat",
messages=[
{"role": "user", "content": prompt}
]
)
print(response['choices'][0]['message']['content'])
return response['choices'][0]['message']['content']
if __name__ == '__main__':
deepseek("林婉穿过长廊,来到客厅,阳光透过纱帘斜洒进来,茶几上放着刚泡好的茶。厨房里传来锅铲翻炒的声音,空气中弥漫着姜葱的香气")
\ No newline at end of file
import os
import re
def addName(folder_path,prefix):
# 设置文件夹路径
# folder_path = r'C:\Users\18545\Desktop\25601440灰阶图PNG' # 替换为你的文件夹路径,例如 r'C:\Users\you\Pictures'
# 设置前缀
# prefix = 'ic_2560_1440_hj_'
# 遍历文件夹中的所有 .png 文件
for filename in os.listdir(folder_path):
if filename.lower().endswith('.png'):
new_name = prefix + filename
old_path = os.path.join(folder_path, filename)
new_path = os.path.join(folder_path, new_name)
os.rename(old_path, new_path)
print(f'Renamed: {filename} -> {new_name}')
print('批量重命名完成!')
def changeName(folder_path):
# 配置项
# folder_path = r'C:\Users\18545\Desktop\c390' # 替换为你的文件夹路径
old_res = '1920_720'
new_res = '1920_720_hj'
# 遍历文件夹中的所有文件
for filename in os.listdir(folder_path):
if old_res in filename:
new_name = filename.replace(old_res, new_res)
old_path = os.path.join(folder_path, filename)
new_path = os.path.join(folder_path, new_name)
os.rename(old_path, new_path)
print(f'Renamed: {filename} -> {new_name}')
print('批量替换分辨率完成!')
def get_sort_key(filename):
"""
为文件名生成一个用于自然排序的"键"。
它会尝试提取文件名末尾的数字。
- 如果成功,返回 (0, 数字),以便按数值排序。
- 如果失败,返回 (1, 文件名),以便按字母排序。
这样可以确保所有带数字后缀的文件排在前面,并按数字大小正确排序。
"""
# re.search(r'(\d+)$', filename) 查找字符串末尾($)的一个或多个数字(\d+)
match = re.search(r'(\d+)$', filename)
if match:
# 如果找到数字,返回一个元组 (类型标识, 数字值)
# 类型0代表数字,会排在类型1(字符串)前面
return (0, int(match.group(1)))
else:
# 如果没找到数字,返回 (类型标识, 原始字符串)
return (1, filename)
def create_drawable_array_code(image_directory, array_name):
"""
扫描指定目录中的.png文件,并生成一个经过自然排序的Java/Kotlin int数组声明。
:param image_directory: 包含.png图片的文件夹路径。
:param array_name: 你想为生成的数组指定的变量名。
:return: 包含完整数组声明的字符串,如果出错则返回None。
"""
if not os.path.isdir(image_directory):
print(f"错误:找不到目录 '{image_directory}'")
return None
drawable_names = []
for filename in os.listdir(image_directory):
if filename.lower().endswith(".png"):
base_name = os.path.splitext(filename)[0]
drawable_names.append(base_name)
if not drawable_names:
print(f"在目录 '{image_directory}' 中没有找到任何.png文件。")
return f"// 在目录 '{image_directory}' 中没有找到任何.png文件"
# --- 关键改动在这里 ---
# 使用自定义的 get_sort_key 函数进行自然排序
drawable_names.sort(key=get_sort_key)
indent = " "
array_items = [f"{indent}R.drawable.{name}" for name in drawable_names]
array_content_string = ",\n".join(array_items)
final_code = f"int[] {array_name} = {{\n{array_content_string}\n}};"
return final_code
if __name__ == '__main__':
url=r'C:\Users\18545\Desktop\1920532灰阶图PNG'
prex=r'ic_1920_532_hj_'
addName(url,prex)
# changeName()
s=create_drawable_array_code(url,prex)
print(s)
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment