Flutter隐写术插件steganograph的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter隐写术插件steganograph的使用

Steganograph 是一个支持使用最低有效位(Least Significant Bit, LSB)隐写术在图像中隐藏信息的Dart库。

安装 🚀

在你的Flutter/Dart项目的pubspec.yaml文件中添加如下依赖:

dependencies:
  steganograph: ^2.0.0

在项目中导入包 📥

在需要使用的Dart文件中导入此包:

import 'package:steganograph/steganograph.dart';

嵌入消息 🔏

方法1:通过文件路径嵌入

你可以通过指定原始图片文件路径、要嵌入的消息和输出文件路径来嵌入秘密消息。以下代码将返回一个包含隐藏消息的新图像文件,该文件除了包含秘密消息外与原始图像相同。

File? stegoImageFile = await Steganograph.cloak(
  image: File('sample_image.jpg'), // 原始图像路径
  message: 'Some secret message',  // 要嵌入的秘密消息
  outputFilePath: 'result.png',    // 输出文件路径
);

方法2:通过字节数组嵌入

如果你想直接处理字节数组而不是文件,可以使用cloakBytes方法:

Uint8List? stegoImageBytes = await Steganograph.cloakBytes(
  imageBytes: Uint8List(...), // 封面图像字节数组
  message: 'Some secret message',
  outputFilePath: 'result.png',
);

提取消息 📨

方法1:从文件中提取

如果你有一个之前用Steganograph嵌入了消息的图像文件,可以通过下面的方法来提取消息:

String? message = await Steganograph.uncloak(File('result.png'));

方法2:从字节数组中提取

如果想从字节数组中提取消息,可以这样做:

String? message = await Steganograph.uncloakBytes(stegoImageBytes);

支持的图像格式 🗂

当前版本支持以下格式的图像进行消息嵌入:

  • PNG
  • JPEG
  • WebP
  • BMP
  • GIF
  • ICO
  • PNM
  • PSD

示例Demo

以下是一个完整的示例demo,演示如何使用steganograph库进行消息的嵌入和提取:

import 'dart:io';
import 'package:steganograph/steganograph.dart';

void main() async {
  // 嵌入消息到图像中并保存为新文件
  final file = await Steganograph.cloak(
    image: File('example/assets/scribble.png'),
    message: "Insert some really top secret message here!",
    outputFilePath: 'example/assets/result.png',
  );

  // 从新生成的图像文件中提取消息
  final embeddedMessage = await Steganograph.uncloak(File(file!.path));
  print("Extracted Message from Image File: $embeddedMessage");

  // 通过字节数组嵌入消息
  final coverImage = File('example/assets/scribble.png');
  final coverImageBytes = await coverImage.readAsBytes();

  final stegoImageBytes = await Steganograph.cloakBytes(
    imageBytes: coverImageBytes,
    message: 'Some other secret message',
  );

  // 从字节数组中提取消息
  final messageFromBytes = await Steganograph.uncloakBytes(stegoImageBytes!);
  print("Extracted Message from Bytes: $messageFromBytes");
}

这段代码首先将一条秘密消息嵌入到名为scribble.png的图像文件中,并将其保存为result.png。然后它会从这个新的图像文件中读取并打印出嵌入的消息。接着,它再次以字节数组的形式执行同样的操作,并展示了如何从字节数组中提取已嵌入的消息。

贡献 🫱🏾‍🫲🏼

如果你发现了bug或者有想要的功能但是不知道如何实现,请提交一个issue。如果你已经修复了一个bug或实现了新功能,请发送一个pull request。欢迎任何贡献!


更多关于Flutter隐写术插件steganograph的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter隐写术插件steganograph的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用steganograph插件的一个简单示例。steganograph是一个用于在图像中隐藏和提取数据的Flutter插件。

首先,确保你已经在pubspec.yaml文件中添加了steganograph依赖:

dependencies:
  flutter:
    sdk: flutter
  steganograph: ^latest_version  # 请替换为最新的版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以在Dart代码中使用steganograph插件。以下是一个完整的示例,展示了如何隐藏和提取信息:

import 'package:flutter/material.dart';
import 'package:steganograph/steganograph.dart';
import 'dart:io';
import 'dart:typed_data';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _hiddenMessage = '';
  String _extractedMessage = '';

  Future<void> hideMessageInImage(File imageFile, String message) async {
    try {
      await Steganograph.encodeImage(
        imagePath: imageFile.path,
        outputPath: (imageFile.parent.path / '${imageFile.basenameWithoutExtension}_encoded.${imageFile.extension}').path,
        message: message,
      );
      setState(() {
        _hiddenMessage = 'Message hidden successfully!';
      });
    } catch (e) {
      setState(() {
        _hiddenMessage = 'Failed to hide message: $e';
      });
    }
  }

  Future<void> extractMessageFromImage(File imageFile) async {
    try {
      String result = await Steganograph.decodeImage(imagePath: imageFile.path);
      setState(() {
        _extractedMessage = 'Extracted Message: $result';
      });
    } catch (e) {
      setState(() {
        _extractedMessage = 'Failed to extract message: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Steganograph Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(_hiddenMessage),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  // 假设你有一个图像文件路径,这里你需要选择图像文件
                  // File imageFile = ...; // 从文件选择器获取图像文件
                  // 为了示例,这里我们假设已经有一个File对象
                  // 注意:在实际应用中,你需要使用文件选择器让用户选择图像文件
                  File imageFile = File('/path/to/your/image.jpg'); // 替换为实际路径
                  String message = 'Hello, this is a hidden message!';
                  await hideMessageInImage(imageFile, message);
                },
                child: Text('Hide Message in Image'),
              ),
              SizedBox(height: 20),
              Text(_extractedMessage),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  // 假设你已经有一个隐藏了消息的图像文件
                  // File encodedImageFile = ...; // 从文件选择器获取已编码的图像文件
                  // 为了示例,这里我们假设已经有一个File对象
                  // 注意:在实际应用中,你需要使用文件选择器让用户选择已编码的图像文件
                  File encodedImageFile = File('/path/to/your/encoded_image.jpg'); // 替换为实际路径
                  await extractMessageFromImage(encodedImageFile);
                },
                child: Text('Extract Message from Image'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意

  1. 在实际使用中,你需要通过文件选择器让用户选择图像文件。这里为了简化示例,直接使用了文件路径。
  2. 替换/path/to/your/image.jpg/path/to/your/encoded_image.jpg为实际的文件路径。
  3. 插件的API可能会随着版本更新而变化,请参考最新的steganograph插件文档以获取最新信息。

这个示例展示了如何使用steganograph插件在Flutter应用中隐藏和提取消息。希望这对你有所帮助!

回到顶部