桌面添加视疲劳缓解图

程序员的眼睛长时间盯着计算机屏幕,很容易导致眼睛疲劳,且在办公室看不了远处,于是想起了视疲劳缓解图,又叫远眺图。用程序员的方法,在自己喜欢的壁纸上绘制这个远眺图,把远眺图搬到桌面上。但是不能一直显示在桌面上,那样就看不到自己喜欢的壁纸了,将桌面壁纸设置为幻灯片放映,让远眺图每隔一段时间显示几分钟。因为工作时主要使用外接显示器,笔记本的显示屏经常是空闲的,当发现笔记本桌面出现了远眺图时,就可以抽空看一会儿。至于每隔多久显示多久,我的做法是将没有远眺图的壁纸复制几份,文件名使用数字顺序编号,至于复制几份,就结合幻灯片切换时间来定吧。

以下是该功能的Java代码:

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class AddDistantView {
    static final int initLineWidth = 45;        // 最外绿框线条宽度
    static final int reduceWidth = 1;           // 线条每次减少宽度
    static final int reduceEveryFewLayers = 1;  // 每几层减少一次线条宽度
    static final int taskbarWidth = 100;        // 任务栏宽度,远眺图不绘制到任务栏区域
    static final Position taskbarPosition = Position.Down; // 任务栏位置

    // 打开壁纸,绘制远眺图,并另存
    public static void main(String[] args) throws IOException {
        // 弹出文件选择框,选择壁纸文件
        FileDialog fileDialog = new FileDialog(new Frame(), "选择壁纸", FileDialog.LOAD);
        fileDialog.setVisible(true);
        if (fileDialog.getFile() == null) {
            System.exit(0);
        }
        String fileName = fileDialog.getFile();
        String path = fileDialog.getDirectory() + fileName;
        BufferedImage image = ImageIO.read(new File(path));

        paint(image, false);

        String formatName = fileName.substring(fileName.lastIndexOf(".") + 1);
        // 弹出文件选择框,选择保存路径
        fileDialog = new FileDialog(new Frame(), "选择保存路径", FileDialog.SAVE);
        fileDialog.setFile(fileName);
        fileDialog.setVisible(true);
        if (fileDialog.getFile() == null) {
            System.exit(0);
        }
        path = fileDialog.getDirectory() + fileDialog.getFile();
        ImageIO.write(image, formatName, new File(path));

        System.exit(0);
    }

    /**
     * 绘制远眺图
     * @param image
     * @param full
     */
    public static void paint(BufferedImage image, boolean full) {
        Color[] color = new Color[2];
        // 比Color.GREEN鲜艳的绿色
        color[0] = new Color(0, 176, 80);
        color[1] = Color.WHITE;

        int lineWidth = initLineWidth, x = 0, y = 0, w, h;
        if (full) {
            // 全图绘制
            w = image.getWidth();
            h = image.getHeight();
        } else {
            // 正方形区域绘制,且不绘制到任务栏区域
            int areaWidth = taskbarPosition.isVertical() ? image.getWidth() : image.getWidth() - taskbarWidth;
            int areaHeight = taskbarPosition.isVertical() ? image.getHeight() - taskbarWidth : image.getHeight();
            w = Math.min(areaWidth, areaHeight);
            h = w;
            x = (image.getWidth() - w) / 2;
            y = (image.getHeight() - h) / 2;
            if (taskbarPosition.isVertical()) {
                y += taskbarPosition.value * taskbarWidth / 2;
            } else {
                x += taskbarPosition.value * taskbarWidth / 2;
            }
        }

        // 绘制绿白间隔框,每层线条宽度逐渐减少
        Graphics2D g2D = image.createGraphics();
        int i = 0;
        while (lineWidth > 0 && w > 0 && h > 0) {
            g2D.setColor(color[i % 2]);
            g2D.fillRect(x, y, w, h);
            i++;
            if (i % reduceEveryFewLayers == 0) {
                lineWidth -= reduceWidth;
            }
            x += lineWidth;
            y += lineWidth;
            w -= 2 * lineWidth;
            h -= 2 * lineWidth;
        }
        g2D.dispose();
    }

    /**
     * 任务栏位置枚举
     */
    public enum Position {
        Up(1), Down(-1), Left(1), Right(-1);

        private int value;

        Position(int value) {
            this.value = value;
        }

        /**
         * 是否在垂直方向
         * @return
         */
        public boolean isVertical() {
            return this.equals(Up) || this.equals(Down);
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

创意程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值