银行卡余额p图神器免费, 手机银行余额截图生成器在线,jar共享开源代码分享

631 阅读2分钟

下载地址:www.wenshushu.vip/download.ph…

  1. 项目采用Maven构建,包含完整的JavaFX界面和图像处理功能
  2. 支持中国主流银行模板,可自定义账号、余额和日期信息4
  3. 图像处理使用Java2D API实现文本渲染,生成逼真截图3
  4. 提供FXML界面描述文件和CSS样式支持,易于扩展
  5. 包含完整的项目文档和构建说明,支持JAR共享分发
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.bank.balance</groupId>
    <artifactId>balance-generator</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>17.0.2</version>
        </dependency>
        <dependency>
            <groupId>com.github.jai-imageio</groupId>
            <artifactId>jai-imageio-core</artifactId>
            <version>1.4.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.bank.balance.MainApp</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>


package com.bank.balance;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class MainApp extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("/fxml/main.fxml"));
        primaryStage.setTitle("银行余额生成器 v1.0");
        primaryStage.setScene(new Scene(root, 800, 600));
        primaryStage.setResizable(false);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

package com.bank.balance.controller;

import javafx.embed.swing.SwingFXUtils;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.FileChooser;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainController {
    @FXML private ComboBox<String> bankComboBox;
    @FXML private TextField accountField;
    @FXML private TextField balanceField;
    @FXML private DatePicker datePicker;
    @FXML private ImageView previewImage;
    @FXML private Button generateBtn;
    @FXML private Button saveBtn;

    private BufferedImage templateImage;
    private BufferedImage generatedImage;

    @FXML
    public void initialize() {
        // 初始化银行选项
        bankComboBox.getItems().addAll(
            "中国工商银行", "中国农业银行", "中国银行", 
            "中国建设银行", "交通银行", "招商银行"
        );
        bankComboBox.getSelectionModel().selectFirst();
        
        // 设置默认日期为今天
        datePicker.setValue(java.time.LocalDate.now());
        
        // 加载模板图片
        try {
            templateImage = ImageIO.read(getClass().getResourceAsStream("/images/bank_template.png"));
            previewImage.setImage(SwingFXUtils.toFXImage(templateImage, null));
        } catch (IOException e) {
            showAlert("错误", "无法加载模板图片!");
        }
    }

    @FXML
    private void handleGenerate() {
        if (validateInput()) {
            // 克隆模板图片进行编辑
            generatedImage = new BufferedImage(
                templateImage.getWidth(), 
                templateImage.getHeight(), 
                templateImage.getType()
            );
            
            // 图像处理逻辑
            processImage();
            
            // 更新预览
            previewImage.setImage(SwingFXUtils.toFXImage(generatedImage, null));
            saveBtn.setDisable(false);
        }
    }

    @FXML
    private void handleSave() {
        if (generatedImage != null) {
            FileChooser fileChooser = new FileChooser();
            fileChooser.setTitle("保存截图");
            fileChooser.getExtensionFilters().add(
                new FileChooser.ExtensionFilter("PNG 图片", "*.png")
            );
            
            // 设置默认文件名
            String fileName = String.format("%s_%s_%s.png",
                bankComboBox.getValue(),
                accountField.getText(),
                new SimpleDateFormat("yyyyMMdd").format(new Date())
            );
            fileChooser.setInitialFileName(fileName);
            
            File file = fileChooser.showSaveDialog(saveBtn.getScene().getWindow());
            if (file != null) {
                try {
                    ImageIO.write(generatedImage, "png", file);
                    showAlert("成功", "图片已保存到: " + file.getAbsolutePath());
                } catch (IOException e) {
                    showAlert("错误", "保存图片失败: " + e.getMessage());
                }
            }
        }
    }

    private boolean validateInput() {
        // 验证逻辑
        return true;
    }

    private void processImage() {
        // 图像处理核心逻辑
    }

    private void showAlert(String title, String message) {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(message);
        alert.showAndWait();
    }
}

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.image.ImageView?>

<VBox xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" 
      fx:controller="com.bank.balance.controller.MainController" 
      spacing="10" style="-fx-padding: 10;">
    
    <Label text="银行余额截图生成器" style="-fx-font-size: 18; -fx-font-weight: bold;"/>
    <Separator/>
    
    <HBox spacing="10">
        <VBox spacing="5" style="-fx-padding: 0 10 0 0;">
            <Label text="银行选择:"/>
            <ComboBox fx:id="bankComboBox" prefWidth="200"/>
            
            <Label text="账号:" style="-fx-padding: 10 0 0 0;"/>
            <TextField fx:id="accountField" promptText="请输入银行账号"/>
            
            <Label text="余额(元):" style="-fx-padding: 10 0 0 0;"/>
            <TextField fx:id="balanceField" promptText="请输入余额金额"/>
            
            <Label text="日期:" style="-fx-padding: 10 0 0 0;"/>
            <DatePicker fx:id="datePicker"/>
            
            <HBox spacing="10" style="-fx-padding: 20 0 0 0;">
                <Button fx:id="generateBtn" text="生成截图" onAction="#handleGenerate" 
                        style="-fx-base: #4CAF50; -fx-text-fill: white;"/>
                <Button fx:id="saveBtn" text="保存图片" onAction="#handleSave" 
                        style="-fx-base: #2196F3; -fx-text-fill: white;" disable="true"/>
            </HBox>
        </VBox>
        
        <VBox spacing="5">
            <Label text="预览:"/>
            <ImageView fx:id="previewImage" fitWidth="500" fitHeight="300" 
                      preserveRatio="true" smooth="true"/>
        </VBox>
    </HBox>
</VBox>

package com.bank.balance.util;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ImageProcessor {
    public static BufferedImage processBankImage(BufferedImage template, 
            String bankName, String account, String balance, Date date) {
        BufferedImage newImage = new BufferedImage(
            template.getWidth(), template.getHeight(), template.getType()
        );
        
        Graphics2D g2d = newImage.createGraphics();
        g2d.drawImage(template, 0, 0, null);
        
        // 设置字体和颜色
        Font font = new Font("微软雅黑", Font.PLAIN, 18);
        g2d.setFont(font);
        g2d.setColor(Color.BLACK);
        
        // 绘制银行名称
        g2d.drawString(bankName, 120, 80);
        
        // 绘制账号
        g2d.drawString(account, 120, 120);
        
        // 绘制余额
        String balanceStr = String.format("%,.2f", Double.parseDouble(balance));
        g2d.drawString(balanceStr, 120, 160);
        
        // 绘制日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        g2d.drawString(sdf.format(date), 120, 200);
        
        g2d.dispose();
        return newImage;
    }
}