乐于分享
好东西不私藏

被豆包AI水印烦透了,我干脆自己写了个工具

被豆包AI水印烦透了,我干脆自己写了个工具

被豆包AI水印烦透了,我干脆自己写了个工具

平时用豆包AI搞图挺香的,写段提示词等几秒就出图,效率确实高。

但有个问题一直挺烦人的——每张图右下角都会带个豆包角标。自己看看还行,想做公众号配图、PPT素材或者设计稿的时候,这个水印就很尴尬了,直接让图废了一半。

之前也试过一些去水印工具,要么满屏广告,要么要充会员,要么处理完画面糊成一片,修复痕迹比水印本身还显眼。折腾了几次之后,干脆自己动手写了一个。反正也是写代码的,这事儿对我来说其实不算复杂。

效果先看

左边是豆包原图,右下角有角标水印;右边是处理后,水印没了,背景也填得挺自然,基本看不出修过。

整个过程就四步:打开程序、选文件夹、点一个按钮、等进度条走完。几十张图大概也就几十秒的事儿,比手动一张张修快太多了。

能干什么

程序名字叫 WatermarkRemoverUltimate,纯 Java 写的,带图形界面,不用敲命令行。

其实就两个功能,但覆盖了大部分场景:

一键批量去 AI 右下角水印

这个是我最常用的。豆包的水印基本都在右下角,程序会自动定位到那个区域(大概是图片宽高的右下角 20%),然后智能填充修复,整个文件夹的图片可以一次性处理完。

手动框选去水印

如果水印位置不固定,或者你想处理其他类型的水印,可以选单张图片,在预览界面拖拽框选水印位置,然后批量处理。

普通用户怎么用

需要的环境: 电脑上装了 Java 就行,Win/Mac/Linux 都能跑。没装的话去 java.com 下载一个,安装过程基本就是一路下一步。

第一步:把代码跑起来

你可以直接复制文章后面的完整代码,保存成 WatermarkRemoverUltimate.java,然后在同目录下运行:

javac WatermarkRemoverUltimate.java

java WatermarkRemoverUltimate

运行之后就会弹出这样一个界面:

界面很简单,就三个区域:上面选文件夹,中间选处理模式,下面是预览和操作状态。

第二步:选输入和输出文件夹

点「📁 选择待处理图片文件夹」,选中你存放豆包图片的文件夹。输出文件夹可以另选一个空的,也可以不选——程序会自动在输入目录下建一个 auto_output 文件夹放处理结果。

第三步:点一键处理

直接点那个蓝色的「🔥 一键批量去除AI右下角水印」按钮,等进度条跑完,打开输出文件夹就能看到处理好的图片了。

说实话,这个流程我设计的时候就想尽量简单,最好是家里长辈也能用的那种程度。

技术人可能关心的实现细节

去水印本质上是 图像修复(Inpainting),就是拿水印周围的像素信息去推测、填充被遮挡的区域。

这个工具用的是一套纯像素级的多方向采样融合算法,没有调任何深度学习模型,纯 Java 标准库搞定。好处是不用下几十上百兆的模型文件,坏处是效果肯定不如 AI 模型那么精致,但处理豆包这种角标水印已经够用了。

修复算法的核心逻辑

public static BufferedImage highLevelAiInpaint(BufferedImage src, int x, int y, int w, int h) {

BufferedImageimg = copyImage(src);

intwidth = img.getWidth();

intheight = img.getHeight();

intstartX = Math.max(5, x);

intstartY = Math.max(5, y);

intendX = Math.min(width - 5, x + w);

intendY = Math.min(height - 5, y + h);

intsampleNear = 8;// 近邻采样距离

intsampleFar = 20;// 远邻采样距离

for(int dy = startY; dy < endY; dy++) {

for(int dx = startX; dx < endX; dx++) {

//上下左右各两圈像素采样

intn1 = getSafeRgb(img, dx, dy - sampleNear, width, height);

intn2 = getSafeRgb(img, dx, dy + sampleNear, width, height);

intn3 = getSafeRgb(img, dx - sampleNear, dy, width, height);

intn4 = getSafeRgb(img, dx + sampleNear, dy, width, height);

intf1 = getSafeRgb(img, dx, dy - sampleFar, width, height);

intf2 = getSafeRgb(img, dx, dy + sampleFar, width, height);

intf3 = getSafeRgb(img, dx - sampleFar, dy, width, height);

intf4 = getSafeRgb(img, dx + sampleFar, dy, width, height);

//近邻权重 60%,远邻权重 40%

intr = (int) (nearAvg(n1,n2,n3,n4,'r') * 0.6 + farAvg(f1,f2,f3,f4,'r') * 0.4);

intg = (int) (nearAvg(n1,n2,n3,n4,'g') * 0.6 + farAvg(f1,f2,f3,f4,'g') * 0.4);

intb = (int) (nearAvg(n1,n2,n3,n4,'b') * 0.6 + farAvg(f1,f2,f3,f4,'b') * 0.4);

//边缘渐变融合,避免修复区域出现硬边界

doublerate = getEdgeGradientRate(dx - startX, dy - startY, w, h);

r= (int) (r * rate + getR(img.getRGB(dx, dy)) * (1 - rate));

g= (int) (g * rate + getG(img.getRGB(dx, dy)) * (1 - rate));

b= (int) (b * rate + getB(img.getRGB(dx, dy)) * (1 - rate));

img.setRGB(dx,dy, (0xff << 24) | (r << 16) | (g << 8) | b);

}

}

returnimg;

}

算法思路其实挺简单的,三句话就能说清:

对水印区域内每个像素,向上下左右各采两圈颜色——近邻采 8px,远邻采 20px

近邻颜色占 60% 权重,远邻占 40%,加权平均算出填充色。近的地方颜色更准,远的地方能补充一些背景的整体趋势

边缘区域用 getEdgeGradientRate 做渐变过渡,不然修复区域和原图衔接的地方会有一道硬边,看着很假

这个算法对背景简单的图效果挺好——纯色、渐变、模糊虚化背景基本都能无痕修复。但背景复杂的情况(比如水印下面恰好是人脸、细密纹理或者规律图案),效果会打点折扣。日常使用够用了,毕竟豆包生成的图大部分背景也不会太复杂。

右下角水印的自动定位

// 自动计算右下角水印区域(图片宽高的 20%)

int ww = (int) (w * AI_WATERMARK_SCALE);// AI_WATERMARK_SCALE = 0.2

int wh = (int) (h * AI_WATERMARK_SCALE);

int wx = w - ww;// 从右边开始

int wy = h - wh;// 从下边开始

豆包的水印位置基本固定在右下角,所以程序直接按比例(宽高各 20%)自动定位,不需要你手动标坐标。这也是批量模式能无脑处理的关键——你只管选文件夹,剩下的事程序自己搞定。

完整代码

代码已经放在 Gitee 上了,可以直接访问:

👉[https://gitee.com/busyboluo/common-tools/blob/master/WatermarkRemoverUltimate.java](https://gitee.com/busyboluo/common-tools/blob/master/WatermarkRemoverUltimate.java)

不想点链接的话,下面就是完整代码,直接复制保存即可。没有第三方依赖,Java 8 及以上都能编译运行:

package com.ruoyi.common.utils;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.FlowLayout;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.GridLayout;

import java.awt.RenderingHints;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import java.util.List;

import javax.imageio.ImageIO;

import javax.swing.*;

public class WatermarkRemoverUltimate {

privatestatic String batchInputDir = "";

privatestatic String batchOutputDir = "";

privatestatic int selectX, selectY, selectW, selectH;

privatestatic boolean isSelected = false;

privatestatic JFrame mainFrame;

privatestatic JProgressBar progressBar;

privatestatic JLabel statusLabel;

privatestatic JLabel inputPathLabel;

privatestatic JLabel outputPathLabel;

privatestatic BufferedImage currentImage;

privatestatic File currentImgFile;

privatestatic JPanel mainContentPane;

privatestatic final double AI_WATERMARK_SCALE = 0.2;

publicstatic void main(String[] args) {

SwingUtilities.invokeLater(WatermarkRemoverUltimate::initUI);

}

privatestatic void initUI() {

mainFrame= new JFrame("AI智能去水印工具");

mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

mainFrame.setSize(1050,800);

mainFrame.setLocationRelativeTo(null);

mainContentPane= new JPanel();

mainContentPane.setLayout(newBoxLayout(mainContentPane, BoxLayout.Y_AXIS));

mainContentPane.setBackground(Color.WHITE);

mainFrame.setContentPane(mainContentPane);

//文件夹选择面板

JPaneldirPanel = new JPanel(new GridLayout(2, 3, 15, 12));

dirPanel.setBorder(BorderFactory.createTitledBorder("第一步:批量文件夹选择(必选)"));

dirPanel.setBackground(Color.WHITE);

dirPanel.setPreferredSize(newDimension(1000, 100));

dirPanel.setMaximumSize(newDimension(1200, 100));

JButtonbtnSelectInput = new JButton("📁 选择待处理图片文件夹");

JButtonbtnSelectOutput = new JButton("📂 选择保存输出文件夹");

inputPathLabel= new JLabel("未选择输入文件夹", SwingConstants.LEFT);

outputPathLabel= new JLabel("未选择输出文件夹", SwingConstants.LEFT);

styleDirButton(btnSelectInput);

styleDirButton(btnSelectOutput);

inputPathLabel.setFont(newFont("微软雅黑", Font.PLAIN, 13));

outputPathLabel.setFont(newFont("微软雅黑", Font.PLAIN, 13));

dirPanel.add(btnSelectInput);dirPanel.add(inputPathLabel); dirPanel.add(new JLabel(""));

dirPanel.add(btnSelectOutput);dirPanel.add(outputPathLabel); dirPanel.add(new JLabel(""));

mainContentPane.add(dirPanel);

mainContentPane.add(Box.createVerticalStrut(10));

//功能按钮

JPanelbtnPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 18, 12));

btnPanel.setBackground(Color.WHITE);

btnPanel.setBorder(BorderFactory.createTitledBorder("第二步:选择处理模式执行操作"));

btnPanel.setPreferredSize(newDimension(1000, 80));

btnPanel.setMaximumSize(newDimension(1200, 80));

JButtonbtnOpenImg = new JButton("1. 选图手动框选水印");

JButtonbtnSingleProcess = new JButton("2. 单张自定义去水印");

JButtonbtnBatchProcess = new JButton("3. 批量自定义去水印");

JButtonbtnAutoAiWatermark = new JButton("🔥 一键批量去除AI右下角水印");

styleButton(btnOpenImg);styleButton(btnSingleProcess); styleButton(btnBatchProcess); styleButton(btnAutoAiWatermark);

btnAutoAiWatermark.setBackground(newColor(60, 120, 255));

btnAutoAiWatermark.setForeground(Color.WHITE);

btnPanel.add(btnOpenImg);btnPanel.add(btnSingleProcess);

btnPanel.add(btnBatchProcess);btnPanel.add(btnAutoAiWatermark);

mainContentPane.add(btnPanel);

mainContentPane.add(Box.createVerticalStrut(10));

//图片预览区

JPanelimgPanel = new JPanel(new BorderLayout());

imgPanel.setBorder(BorderFactory.createTitledBorder("图片预览& 手动框选区域"));

imgPanel.setBackground(Color.WHITE);

imgPanel.setPreferredSize(newDimension(1000, 520));

JLabelimgTipLabel = new JLabel("自动模式:选好文件夹直接点一键去除AI水印 | 手动模式:选图拖拽框选", SwingConstants.CENTER);

imgTipLabel.setFont(newFont("微软雅黑", Font.PLAIN, 16));

imgPanel.add(imgTipLabel,BorderLayout.CENTER);

mainContentPane.add(imgPanel);

mainContentPane.add(Box.createVerticalStrut(10));

//状态栏

JPanelbottomPanel = new JPanel(new BorderLayout(15, 5));

bottomPanel.setBorder(BorderFactory.createEmptyBorder(12,15, 12, 15));

bottomPanel.setPreferredSize(newDimension(1000, 50));

statusLabel= new JLabel("就绪 | 请先选择待处理图片文件夹");

statusLabel.setFont(newFont("微软雅黑", Font.PLAIN, 14));

progressBar= new JProgressBar(0, 100);

progressBar.setPreferredSize(newDimension(320, 26));

progressBar.setStringPainted(true);

progressBar.setVisible(false);

bottomPanel.add(statusLabel,BorderLayout.WEST);

bottomPanel.add(progressBar,BorderLayout.EAST);

mainContentPane.add(bottomPanel);

btnSelectInput.addActionListener(e-> selectInputDir());

btnSelectOutput.addActionListener(e-> selectOutputDir());

btnOpenImg.addActionListener(e-> openAndSelectImage());

btnSingleProcess.addActionListener(e-> startSingleProcess());

btnBatchProcess.addActionListener(e-> startBatchProcess());

btnAutoAiWatermark.addActionListener(e-> startAutoAiWatermarkRemove());

mainFrame.setVisible(true);

}

privatestatic void styleDirButton(JButton btn) {

btn.setFont(newFont("微软雅黑", Font.PLAIN, 14));

btn.setPreferredSize(newDimension(200, 38));

btn.setFocusPainted(false);

}

privatestatic void styleButton(JButton btn) {

btn.setFont(newFont("微软雅黑", Font.PLAIN, 14));

btn.setPreferredSize(newDimension(175, 38));

btn.setFocusPainted(false);

}

privatestatic void selectInputDir() {

JFileChooserchooser = new JFileChooser();

chooser.setDialogTitle("选择【待处理图片文件夹】");

chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

if(chooser.showOpenDialog(mainFrame) == JFileChooser.APPROVE_OPTION) {

batchInputDir= chooser.getSelectedFile().getAbsolutePath() + "/";

inputPathLabel.setText("✅已选输入:" + batchInputDir);

statusLabel.setText("✅输入文件夹配置完成");

}

}

privatestatic void selectOutputDir() {

JFileChooserchooser = new JFileChooser();

chooser.setDialogTitle("选择【处理后保存文件夹】");

chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

if(chooser.showOpenDialog(mainFrame) == JFileChooser.APPROVE_OPTION) {

batchOutputDir= chooser.getSelectedFile().getAbsolutePath() + "/";

outputPathLabel.setText("✅已选输出:" + batchOutputDir);

statusLabel.setText("✅输出文件夹配置完成");

}

}

privatestatic String getSafeOutputPath() {

if(batchOutputDir.isEmpty()) {

batchOutputDir= batchInputDir.isEmpty()

?new File("").getAbsolutePath() + "/ai_watermark_output/"

:batchInputDir + "auto_output/";

}

FileoutDir = new File(batchOutputDir);

if(!outDir.exists()) outDir.mkdirs();

returnbatchOutputDir;

}

privatestatic void openAndSelectImage() {

JFileChooserchooser = new JFileChooser();

chooser.setDialogTitle("选择单张图片");

chooser.setFileFilter(newjavax.swing.filechooser.FileNameExtensionFilter("图片文件", "jpg", "jpeg", "png"));

if(chooser.showOpenDialog(mainFrame) != JFileChooser.APPROVE_OPTION) return;

currentImgFile= chooser.getSelectedFile();

try{ currentImage = ImageIO.read(currentImgFile); } catch (IOException e) {

JOptionPane.showMessageDialog(mainFrame,"图片读取失败!", "错误", JOptionPane.ERROR_MESSAGE); return;

}

JPanelpreviewPanel = new JPanel() {

finalBufferedImage img = currentImage;

intsx, sy, ex, ey;

{addMouseListener(new MouseAdapter() {

@Overridepublic void mousePressed(MouseEvent e) { sx = e.getX(); sy = e.getY(); }

@Overridepublic void mouseReleased(MouseEvent e) {

ex= e.getX(); ey = e.getY();

selectX= Math.min(sx, ex); selectY = Math.min(sy, ey);

selectW= Math.abs(ex - sx); selectH = Math.abs(ey - sy);

isSelected= true;

statusLabel.setText("✅水印框选完成");

JOptionPane.showMessageDialog(mainFrame,"水印区域框选成功!", "完成", JOptionPane.INFORMATION_MESSAGE);

repaint();

}

});}

@Overrideprotected void paintComponent(Graphics g) {

super.paintComponent(g);

if(img != null) {

doublescale = Math.min((double)getWidth()/img.getWidth(), (double)getHeight()/img.getHeight());

intdw = (int)(img.getWidth()*scale), dh = (int)(img.getHeight()*scale);

intox = (getWidth()-dw)/2, oy = (getHeight()-dh)/2;

g.drawImage(img,ox, oy, dw, dh, null);

if(isSelected) {

g.setColor(newColor(255,0,0,130));

g.fillRect(selectX+ox,selectY+oy, selectW, selectH);

g.setColor(Color.RED);

g.drawRect(selectX+ox,selectY+oy, selectW, selectH);

}

}

}

};

previewPanel.setBackground(Color.WHITE);

previewPanel.setPreferredSize(newDimension(1000, 520));

mainContentPane.remove(2);

mainContentPane.add(previewPanel,2);

mainFrame.revalidate();mainFrame.repaint();

}

privatestatic void startSingleProcess() {

if(!isSelected || currentImage == null) {

JOptionPane.showMessageDialog(mainFrame,"请先选图并手动框选水印!", "提示", JOptionPane.WARNING_MESSAGE); return;

}

newSwingWorker() {

@Overrideprotected Void doInBackground() throws Exception {

progressBar.setVisible(true);

statusLabel.setText("处理单张图片中...");

publish(30);

BufferedImageres = highLevelAiInpaint(currentImage, selectX, selectY, selectW, selectH);

publish(80);

Stringout = currentImgFile.getParent() + "/no_watermark_" + currentImgFile.getName();

saveImage(res,out);

publish(100);

statusLabel.setText("✅处理完成:" + out);

returnnull;

}

@Overrideprotected void process(Listc) { progressBar.setValue(c.get(c.size()-1)); }

@Overrideprotected void done() {

progressBar.setVisible(false);

JOptionPane.showMessageDialog(mainFrame,"✅ 单张去水印完成!", "成功", JOptionPane.INFORMATION_MESSAGE);

}

}.execute();

}

privatestatic void startBatchProcess() {

if(!isSelected) { JOptionPane.showMessageDialog(mainFrame, "请先手动框选水印区域!", "提示", JOptionPane.WARNING_MESSAGE); return; }

if(batchInputDir.isEmpty()) { JOptionPane.showMessageDialog(mainFrame, "请先选择待处理图片文件夹!", "错误", JOptionPane.ERROR_MESSAGE); return; }

FileinputDir = new File(batchInputDir);

File[]files = inputDir.listFiles((d,n) -> n.toLowerCase().matches(".*\\.(jpg|jpeg|png)"));

if(files == null || files.length == 0) { JOptionPane.showMessageDialog(mainFrame, "文件夹内无有效图片!", "提示", JOptionPane.WARNING_MESSAGE); return; }

StringsafeOut = getSafeOutputPath();

newSwingWorker() {

inttotal = files.length, finish = 0;

@Overrideprotected Void doInBackground() throws Exception {

progressBar.setVisible(true);

for(File f : files) {

statusLabel.setText("处理:"+ f.getName() + " (" + finish + "/" + total + ")");

BufferedImageimg = ImageIO.read(f);

if(img == null) { finish++; continue; }

saveImage(highLevelAiInpaint(img,selectX, selectY, selectW, selectH), safeOut + f.getName());

publish((int)((double)(++finish)/total*100));

Thread.sleep(30);

}

statusLabel.setText("✅批量处理完成,共" + finish + "张");

returnnull;

}

@Overrideprotected void process(Listc) { progressBar.setValue(c.get(c.size()-1)); }

@Overrideprotected void done() {

progressBar.setVisible(false);

JOptionPane.showMessageDialog(mainFrame,"✅ 批量处理完成!总计" + total + "张", "完成", JOptionPane.INFORMATION_MESSAGE);

}

}.execute();

}

privatestatic void startAutoAiWatermarkRemove() {

if(batchInputDir.isEmpty()) { JOptionPane.showMessageDialog(mainFrame, "请先选择【待处理图片文件夹】!", "错误", JOptionPane.ERROR_MESSAGE); return; }

FileinputDir = new File(batchInputDir);

File[]files = inputDir.listFiles((d,n) -> n.toLowerCase().matches(".*\\.(jpg|jpeg|png)"));

if(files == null || files.length == 0) { JOptionPane.showMessageDialog(mainFrame, "文件夹内无有效图片!", "提示", JOptionPane.WARNING_MESSAGE); return; }

StringsafeOut = getSafeOutputPath();

newSwingWorker() {

inttotal = files.length, finish = 0;

@Overrideprotected Void doInBackground() throws Exception {

progressBar.setVisible(true);

for(File f : files) {

statusLabel.setText("AI水印处理:"+ f.getName() + " (" + finish + "/" + total + ")");

BufferedImageimg = ImageIO.read(f);

if(img == null) { finish++; continue; }

intw = img.getWidth(), h = img.getHeight();

intww = (int)(w * AI_WATERMARK_SCALE), wh = (int)(h * AI_WATERMARK_SCALE);

saveImage(highLevelAiInpaint(img,w-ww, h-wh, ww, wh), safeOut + f.getName());

publish((int)((double)(++finish)/total*100));

Thread.sleep(20);

}

statusLabel.setText("✅AI水印全部去除完成,共" + finish + "张");

returnnull;

}

@Overrideprotected void process(Listc) { progressBar.setValue(c.get(c.size()-1)); }

@Overrideprotected void done() {

progressBar.setVisible(false);

JOptionPane.showMessageDialog(mainFrame,"✅ 一键去除完成!\n总数:" + total + "张\n保存目录:" + safeOut, "全自动完成", JOptionPane.INFORMATION_MESSAGE);

}

}.execute();

}

publicstatic BufferedImage highLevelAiInpaint(BufferedImage src, int x, int y, int w, int h) {

BufferedImageimg = copyImage(src);

intwidth = img.getWidth(), height = img.getHeight();

intstartX = Math.max(5, x), startY = Math.max(5, y);

intendX = Math.min(width-5, x+w), endY = Math.min(height-5, y+h);

intsampleNear = 8, sampleFar = 20;

for(int dy = startY; dy < endY; dy++) {

for(int dx = startX; dx < endX; dx++) {

intn1=getSafeRgb(img,dx,dy-sampleNear,width,height), n2=getSafeRgb(img,dx,dy+sampleNear,width,height);

intn3=getSafeRgb(img,dx-sampleNear,dy,width,height), n4=getSafeRgb(img,dx+sampleNear,dy,width,height);

intf1=getSafeRgb(img,dx,dy-sampleFar,width,height),f2=getSafeRgb(img,dx,dy+sampleFar,width,height);

intf3=getSafeRgb(img,dx-sampleFar,dy,width,height),f4=getSafeRgb(img,dx+sampleFar,dy,width,height);

intnr=(getR(n1)+getR(n2)+getR(n3)+getR(n4))/4, ng=(getG(n1)+getG(n2)+getG(n3)+getG(n4))/4, nb=(getB(n1)+getB(n2)+getB(n3)+getB(n4))/4;

intfr=(getR(f1)+getR(f2)+getR(f3)+getR(f4))/4, fg=(getG(f1)+getG(f2)+getG(f3)+getG(f4))/4, fb=(getB(f1)+getB(f2)+getB(f3)+getB(f4))/4;

intr=(int)(nr*0.6+fr*0.4), g=(int)(ng*0.6+fg*0.4), b=(int)(nb*0.6+fb*0.4);

doublerate = getEdgeGradientRate(dx-startX, dy-startY, w, h);

r=(int)(r*rate+getR(img.getRGB(dx,dy))*(1-rate));

g=(int)(g*rate+getG(img.getRGB(dx,dy))*(1-rate));

b=(int)(b*rate+getB(img.getRGB(dx,dy))*(1-rate));

img.setRGB(dx,dy, (0xff<<24)|(r<<16)|(g<<8)|b);

}

}

returnimg;

}

privatestatic int getSafeRgb(BufferedImage img, int x, int y, int mw, int mh) {

returnimg.getRGB(Math.max(0,Math.min(mw-1,x)), Math.max(0,Math.min(mh-1,y)));

}

privatestatic double getEdgeGradientRate(int x, int y, int w, int h) {

intedge = 6;

if(x > edge && y > edge && x < w-edge && y < h-edge) return 1.0;

returnMath.min(1.0, Math.min(Math.min(x,y), Math.min(w-x,h-y)) / (double)edge);

}

publicstatic BufferedImage copyImage(BufferedImage src) {

BufferedImagecopy = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_ARGB);

Graphics2Dg2d = copy.createGraphics();

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

g2d.drawImage(src,0, 0, null); g2d.dispose();

returncopy;

}

publicstatic void saveImage(BufferedImage img, String path) throws IOException {

ImageIO.write(img,path.toLowerCase().endsWith("png") ? "png" : "jpg", new File(path));

}

publicstatic int getR(int c) { return (c>>16)&0xff; }

publicstatic int getG(int c) { return (c>>8)&0xff; }

publicstatic int getB(int c) { return c&0xff; }

}

先泼点冷水:这事儿有局限

这个工具处理大多数豆包AI生成的图是没问题的,但有些情况确实搞不定,提前说清楚免得你用的时候失望:

背景复杂的图效果会打折:如果水印下面正好是人脸、细密纹理或者复杂建筑,纯像素采样修复会有明显失真。这种时候建议换其他工具,或者干脆不用这张图

隐形溯源水印去不掉:有些平台会在图片频域里嵌入肉眼看不见的水印,这个工具处理不了,它只能去掉肉眼可见的角标

商用请注意合规:去水印后的图片能不能商用取决于原平台的使用协议,这个工具只是技术分享,别拿它干违法的事

另外代码写得其实挺糙的,没有异常兜底,没有日志系统,Swing 代码也是一股脑堆在一起。如果有谁想拿去改进,欢迎 fork 或者给我提 issue。

如果你也在做 Java 图像处理,或者有更好的 inpainting 思路,欢迎在评论区留言。我写这玩意儿的时候其实偷了不少懒,能优化的地方肯定很多。

顺手转发一下呗,没准你朋友圈里也有人在被这个水印烦着。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-29 02:08:32 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/680526.html
  2. 运行时间 : 0.167122s [ 吞吐率:5.98req/s ] 内存消耗:4,935.35kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=09184323e5baf53a09d742536f59ae2d
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000767s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000743s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000334s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000285s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000518s ]
  6. SELECT * FROM `set` [ RunTime:0.000219s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000539s ]
  8. SELECT * FROM `article` WHERE `id` = 680526 LIMIT 1 [ RunTime:0.000468s ]
  9. UPDATE `article` SET `lasttime` = 1779991712 WHERE `id` = 680526 [ RunTime:0.002762s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000235s ]
  11. SELECT * FROM `article` WHERE `id` < 680526 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000409s ]
  12. SELECT * FROM `article` WHERE `id` > 680526 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000380s ]
  13. SELECT * FROM `article` WHERE `id` < 680526 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000775s ]
  14. SELECT * FROM `article` WHERE `id` < 680526 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001940s ]
  15. SELECT * FROM `article` WHERE `id` < 680526 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001405s ]
0.168823s