先上一张效果图

java中图片使用像素填充数据的方法 java像素画_java中图片使用像素填充数据的方法

逻辑分析

  1. 首先是玩家在游戏里输入命令(指定文件的名字 ,以及一个数(用来区分黑白像素))
  2. 当玩家发送命令后,代码首先会获取玩家的位置, 用来确定生成图片的位置
  3. 分析参数,获取本地文件中的指定的图片
  4. 分析参数,获取区分黑白像素的阈值( 0~255)
  5. 使用java的库, 将图片文件封装为一个BufferedImage对象(用于获取图片的宽高,以及以数组的形式获取图片的像素值)
  6. 使用两层for循环, 在循环内部首先根据下标获取文件的像素点 ,根据设定的阈值判断为黑色或白色
  7. 获取当前坐标下的方块对象(x,y,z)
  8. 黑色使用煤炭块,白色使用羊毛块, 调用方块对象的set方法,设置为对应方块

代码分析

package com.qwrdxer;

import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Drawit extends JavaPlugin{
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (cmd.getName().equalsIgnoreCase("Drawit")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage("Only players can use this command!");
                return true;
            }
            // 检测指令执行者是玩家后,我们便可以安全的进行强制转换类操作。
            Player s = (Player) sender;
            //获取s的 x,y,z坐标
            int x = (int)s.getLocation().getX()+70;
            int y = 4;
            int z = (int)s.getLocation().getZ();
            //获得接口
            World world=s.getWorld();
            //获得命令后的参数
            String arg = args[0];
            int arg2=Integer.parseInt(args[1]); //黑白颜色的判断权值, 0~255  越小判断为黑的范围越大
            String path="C:\\img\\"+arg;
            getLogger().info(path);
            /*
            ->未实现功能
            根据url地址下载网络上的图片,
            获取它的长和宽,每一个像素点对应MC里的12色羊毛
             */


            /*
            使用图片IO获取像素点
             */
            File file = new File(path);//导入文件
            BufferedImage bufImg = null;
            try {
                bufImg = ImageIO.read(file);
            } catch (IOException e) {
                e.printStackTrace();
            }
            int height = bufImg.getHeight();
            int width = bufImg.getWidth();
            /*
            开始绘制图片
             */
            int point;
            for(int zindx=z;zindx<z+width;zindx++){
                for(int yindx=y;yindx<y+height;yindx++){
                    point=bufImg.getRGB(zindx-z,(height-1)-(yindx-y))&0x0000ff;
                    getLogger().info(point+"");
                    Block currentBlock = world.getBlockAt(x+10, yindx,zindx);
                    /*
                    为方便实现,使用黑白两种颜色的羊毛
                    条件判断会根据玩家输入的参数作为阈值
                     */

                    if(point>=arg2){
                        currentBlock.setType(Material.SNOW_BLOCK);
                    }
                    else{
                        currentBlock.setType(Material.COAL_BLOCK);
                    }
                }
            }
            return true;
        }
        return false;
    }

}

使用方式

注:

目前是使用绝对路径,因此需要在C盘下创建一个名字为img的文件夹

在这里存放图片, 游戏里的参数直接输入文件名即可

java中图片使用像素填充数据的方法 java像素画_java中图片使用像素填充数据的方法_02

使用方式

  1. 将插件放到服务器的插件目录
  2. 命令参数 /Drawit 文件名 0~255中的某个数

文件名为C:\img 下的某个图片 ,可自行指定,需要带文件后缀(.jpg 等)

0~255 的某个数是指判断为黑白的阈值, 数值越大,判断为白色的方块越少

示例如下:

/Drawit demo.jpg 127

效果展示

java中图片使用像素填充数据的方法 java像素画_文件名_03

java中图片使用像素填充数据的方法 java像素画_java中图片使用像素填充数据的方法

java中图片使用像素填充数据的方法 java像素画_java中图片使用像素填充数据的方法_05

java中图片使用像素填充数据的方法 java像素画_java_06

挖坑

  1. 稍作修改,玩家可以在本地输入网上图片的url , 代码根据url临时下载到本地,然后后面的操作相同。
  2. 加入 8色 12色 36色等 ( 目前有bug ,库函数显示找不到带颜色的羊毛的对象,可能是版本的问题)