一个简单的图片混淆加密工具库,提供多种图片加密混淆算法,可以轻松集成到你的 Java 项目中。
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependency>
<groupId>com.github.2195517546</groupId>
<artifactId>ObfuscationUtils</artifactId>
<version>1.1.0</version>
</dependency>
主要的图片数据封装类。
构造方法:
- ImageData(int[] pixels, int width, int height) - 从像素数组创建
- ImageData(int[] pixels, int width, int height, String format) - 指定格式
静态方法:
- static ImageData fromFile(String filePath) - 从文件加载
- static ImageData fromInputStream(InputStream is) - 从输入流加载
- static ImageData fromInputStream(InputStream is, String format) - 指定格式
- static ImageData fromBytes(byte[] bytes) - 从字节数组加载
- static ImageData fromBytes(byte[] bytes, String format) - 指定格式
- static ImageData fromMultipartFile(MultipartFile file) - 从 Spring Boot MultipartFile 加载
- static ImageData fromBufferedImage(BufferedImage image) - 从 BufferedImage 加载
- static ImageData fromBufferedImage(BufferedImage image, String format) - 指定格式
实例方法:
- void saveToFile(String filePath) - 保存到文件
- int[] getPixels() - 获取像素数组
- int getWidth() - 获取宽度
- int getHeight() - 获取高度
- String getFormat() - 获取格式
- byte[] toBytes() - 转换为字节数组
- byte[] toBytes(String format) - 指定格式转换为字节数组
- InputStream toInputStream() - 转换为输入流
- InputStream toInputStream(String format) - 指定格式转换为输入流
- BufferedImage toBufferedImage() - 转换为 BufferedImage
- BufferedImage toBufferedImage(String format) - 指定格式转换为 BufferedImage
提供快捷的加密/解密方法,所有方法都是静态方法。
方法列表:
- tomatoEncrypt(String key, ImageData imageData) / tomatoDecrypt(...)
- blockEncrypt(String key, ImageData imageData) / blockDecrypt(...)
- rowPixelEncrypt(String key, ImageData imageData) / rowPixelDecrypt(...)
- perPixelEncrypt(String key, ImageData imageData) / perPixelDecrypt(...)
- picEncryptRowEncrypt(String key, ImageData imageData) / picEncryptRowDecrypt(...)
- picEncryptRowColumnEncrypt(String key, ImageData imageData) / picEncryptRowColumnDecrypt(...)
# Windows
.\gradlew clean build
# Linux/Mac
./gradlew clean build
构建完成后,jar 包位于:build/libs/ObfuscationUtils-${version}.jar
# Windows
.\gradlew clean build sourcesJar javadocJar
# Linux/Mac
./gradlew clean build sourcesJar javadocJar
这将生成三个 jar 包:
- ObfuscationUtils-${version}.jar - 主 jar 包
- ObfuscationUtils-${version}-sources.jar - 源码包
- ObfuscationUtils-${version}-javadoc.jar - 文档包
# Windows
.\gradlew publishToMavenLocal
# Linux/Mac
./gradlew publishToMavenLocal
ObfuscationUtils-${version}.jar 复制到你的项目中Gradle 项目:
dependencies {
implementation(files("libs/ObfuscationUtils-${version}.jar"))
}
Maven 项目:
<dependency>
<groupId>com.uiloalxise</groupId>
<artifactId>ObfuscationUtils</artifactId>
<version>${version}</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/ObfuscationUtils-${version}.jar</systemPath>
</dependency>
如果你已经执行了 publishToMavenLocal:
Gradle 项目:
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
implementation("com.uiloalxise:ObfuscationUtils:${version}")
}
Maven 项目:
<dependency>
<groupId>com.uiloalxise</groupId>
<artifactId>ObfuscationUtils</artifactId>
<version>${version}</version>
</dependency>
import com.uiloalxise.ImageData;
import com.uiloalxise.Util;
public class Example {
public static void main(String[] args) throws Exception {
// 加载图片
ImageData originalImage = ImageData.fromFile("path/to/image.jpg");
// Tomato 混淆加密
ImageData encrypted = Util.tomatoEncrypt("114514", originalImage);
encrypted.saveToFile("encrypted.jpg");
// 解密
ImageData decrypted = Util.tomatoDecrypt("114514", encrypted);
decrypted.saveToFile("decrypted.jpg");
}
}
// 加密
ImageData encrypted = Util.tomatoEncrypt("密钥数字", imageData);
// 解密
ImageData decrypted = Util.tomatoDecrypt("密钥数字", encrypted);
// 加密
ImageData encrypted = Util.blockEncrypt("任意字符串密钥", imageData);
// 解密
ImageData decrypted = Util.blockDecrypt("任意字符串密钥", encrypted);
// 加密
ImageData encrypted = Util.rowPixelEncrypt("密钥", imageData);
// 解密
ImageData decrypted = Util.rowPixelDecrypt("密钥", encrypted);
// 加密
ImageData encrypted = Util.perPixelEncrypt("密钥", imageData);
// 解密
ImageData decrypted = Util.perPixelDecrypt("密钥", encrypted);
// 加密(支持小数密钥)
ImageData encrypted = Util.picEncryptRowEncrypt("0.618", imageData);
// 解密
ImageData decrypted = Util.picEncryptRowDecrypt("0.618", encrypted);
// 加密(支持小数密钥)
ImageData encrypted = Util.picEncryptRowColumnEncrypt("0.618", imageData);
// 解密
ImageData decrypted = Util.picEncryptRowColumnDecrypt("0.618", encrypted);
// 加密(无需密钥)
ImageData encrypted = Util.sortEncrypt(imageData);
// 解密
ImageData decrypted = Util.sortDecrypt(encrypted);
// 使用种子加密
ImageData encrypted = Util.randomEncrypt("114514", imageData);
// 使用相同种子解密
ImageData decrypted = Util.randomDecrypt("114514", encrypted);
从 v1.2 开始,ObfuscationUtils 提供了完整的异步操作支持,适用于高并发场景和响应式编程。
import com.uiloalxise.async.AsyncImageData;
import com.uiloalxise.async.AsyncUtil;
// 异步加载图片
CompletableFuture<ImageData> future = AsyncImageData.fromFileAsync("input.png");
// 异步保存图片
CompletableFuture<Void> saveFuture = AsyncImageData.saveToFileAsync(imageData, "output.png");
// 链式异步操作
AsyncImageData.fromFileAsync("input.png")
.thenCompose(img -> AsyncUtil.tomatoEncryptAsync("0.618", img))
.thenCompose(encrypted -> AsyncImageData.saveToFileAsync(encrypted, "encrypted.png"))
.thenRun(() -> System.out.println("完成!"))
.exceptionally(ex -> {
ex.printStackTrace();
return null;
});
// 异步 Tomato 加密
CompletableFuture<ImageData> encrypted = AsyncUtil.tomatoEncryptAsync("0.618", imageData);
// 异步解密
CompletableFuture<ImageData> decrypted = AsyncUtil.tomatoDecryptAsync("0.618", encrypted.get());
// 对象级异步 API
TomatoObfuscation obfuscation = new TomatoObfuscation(imageData, 0.618);
CompletableFuture<ImageData> future = obfuscation.encryptAsync();
@RestController
@RequestMapping("/api/image")
public class ImageController {
@PostMapping("/encrypt")
public CompletableFuture<ResponseEntity<byte[]>> encryptImage(
@RequestParam("file") MultipartFile file,
@RequestParam("key") String key) {
return AsyncImageData.fromMultipartFileAsync(file)
.thenCompose(img -> AsyncUtil.tomatoEncryptAsync(key, img))
.thenCompose(encrypted -> AsyncImageData.toBytesAsync(encrypted))
.thenApply(bytes -> ResponseEntity.ok()
.contentType(MediaType.IMAGE_PNG)
.body(bytes))
.exceptionally(ex -> ResponseEntity.status(500).build());
}
}
// 从文件路径加载
ImageData image1 = ImageData.fromFile("path/to/image.jpg");
ImageData image2 = ImageData.fromFile("path/to/image.png");
// 从 Spring Boot MultipartFile 加载(Controller 接口)
ImageData image3 = ImageData.fromMultipartFile(file);
// 从 InputStream 加载
ImageData image4 = ImageData.fromInputStream(inputStream, "jpg");
// 从字节数组加载
ImageData image5 = ImageData.fromBytes(bytes, "png");
// 从像素数组创建
int[] pixels = ...; // ARGB 格式的像素数组
ImageData image6 = new ImageData(pixels, width, height);
ImageData image7 = new ImageData(pixels, width, height, "jpg");
// 保存到文件
image1.saveToFile("output.jpg");
image2.saveToFile("output.png");
// 转换为字节数组
byte[] bytes = image1.toBytes();
// 转换为 InputStream
InputStream is = image1.toInputStream();
ObfuscationExecutor.shutdown() 关闭线程池MIT License
Uiloalxise
GitHub: https://github.com/2195517546/ObfuscationUtils
$ claude mcp add ObfuscationUtils \
-- python -m otcore.mcp_server <graph>