processing像素画教程

简介: 本文提供了一个Processing像素画教程,包括创建网格画布、绘制像素、将图片像素化以及调整图片像素化的模糊程度,并通过示例代码展示了如何实现这些效果。

前提:各位已经安装了processing

第一步:创建一个简单的网格

我们首先创建一个网格来定义我们作品的像素画布。网格将帮助您在适当的位置绘制每个像素。

int gridSize = 20; // 每个像素的大小
int cols, rows;
void setup() {
  size(400, 400); // 设置画布大小
  cols = width / gridSize;
  rows = height / gridSize;
  noLoop(); // 不需要在draw中不断重复
}

void draw() {
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      stroke(200); // 网格线颜色
      noFill();
      rect(i * gridSize, j * gridSize, gridSize, gridSize);
    }
  }
}

这个width是内置的变量,height也是内置变量,一般和你 size(400, 400);就是上面你设置的400,400

cols = width / gridSize; 代表的是多少列个方格,rows = height / gridSize; 代表的是多少行个方格

咱们使用 rect()函数,咱们可以查看官网,官网是这样介绍的:

就是绘制矩形而已

运行展示:

第二步:绘制像素

使用fill()和rect()来填充网格中的特定方块,这就是“绘制”一个像素。

void draw() {
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      stroke(200);
      noFill();

      rect(i * gridSize, j * gridSize, gridSize, gridSize);
      // 示例:绘制一个红色色块
      if (i == 5 && j == 5) {
        fill(255, 0, 0); // 红色
        rect(i * gridSize, j * gridSize, gridSize, gridSize);
      }
    }
  }
}

fill函数是填充颜色的意思,它在 rect()函数的前面,就意味着填充这个单独的rect方块

运行展示:

完整代码:

int gridSize = 20; // 每个像素的大小
int cols, rows;
void setup() {
  size(400, 400); // 设置画布大小
  cols = width / gridSize;
  rows = height / gridSize;
  noLoop(); // 不需要在draw中不断重复
}

void draw() {
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      stroke(200);
      noFill();

      rect(i * gridSize, j * gridSize, gridSize, gridSize);
      // 示例:绘制一个红色色块
      if (i == 5 && j == 5) {
        fill(255, 0, 0); // 红色
        rect(i * gridSize, j * gridSize, gridSize, gridSize);
      }
    }
  }
}

第三步:将图片像素化

咱们了解以上基本内容之后,就可以实现将图片像素化的过程

完整演示代码如下:

PImage img;       // 存储加载的图像
int blockSize = 10; // 每个像素块的大小

void setup() {
  size(400, 400);
  img = loadImage("C:\\Users\\Administrator\\Desktop\\t1.png"); // 替换为您图像的文件名
  img.resize(width, height); // 调整图像大小以适应窗口
}

void draw() {
  pixelateImage();
}

void pixelateImage() {
  for (int x = 0; x < img.width; x += blockSize) {
    for (int y = 0; y < img.height; y += blockSize) {
      color avgColor = averageColor(x, y);
      fill(avgColor);
      noStroke();
      rect(x, y, blockSize, blockSize);
    }
  }
}

// 计算给定块的平均颜色
color averageColor(int startX, int startY) {
  int r = 0, g = 0, b = 0;
  int count = 0;

  for (int dx = 0; dx < blockSize; dx++) {
    for (int dy = 0; dy < blockSize; dy++) {
      int currentX = startX + dx;
      int currentY = startY + dy;

      // 检查是否在图像边界内
      if (currentX < img.width && currentY < img.height) {
        color currentColor = img.get(currentX, currentY);
        r += red(currentColor);
        g += green(currentColor);
        b += blue(currentColor);
        count++;
      }
    }
  }

  // 返回平均颜色
  return color(r / count, g / count, b / count);
}

效果展示图:

首先,咱们需要一个存储加载的图像,就是上文的PImage img;

第二,设置每个像素块的大小,int blockSize = 10;

第三, 给每个像素块上色,这里上色用的是 给定块的平均颜色 (这里说一下,noStroke();是不设置网格线颜色)

其算法我单独拿下来给各位讲解:

// 计算给定块的平均颜色
color averageColor(int startX, int startY) {
  int r = 0, g = 0, b = 0;
  int count = 0;
  for (int dx = 0; dx < blockSize; dx++) {
    for (int dy = 0; dy < blockSize; dy++) {
      int currentX = startX + dx;
      int currentY = startY + dy;

      // 检查是否在图像边界内
      if (currentX < img.width && currentY < img.height) {
        color currentColor = img.get(currentX, currentY);
        r += red(currentColor);
        g += green(currentColor);
        b += blue(currentColor);
        count++;
      }
    }
  }

  // 返回平均颜色
  return color(r / count, g / count, b / count);
}

众所周知,颜色是由rgb决定的,这个算法很简单img.get是获取图片每一处的颜色的,r/count意味着这个像素块里面的红色除以这个像素块每个像素点,得到的就是像素的平均颜色,同理如下,count++是计算每个像素块的像素点的,按照我说的这个count应该为100.咱们可以测试一下:在返回平均颜色的上面加入打印count

咱们可以看到就是100,因为一个像素块长10像素点,宽10像素点,10*10可不就100.

第四步:修改图片像素化的模糊程度

咱们经过上面的学习,可以明白,如果想要图片像素更加清晰,那么咱们可以直接将像素块调小一点,这样计算平均值填充的颜色将会更加清晰。以下是将像素块调成5之后的效果

当然,咱们调成1,那就是原画了

后续教学我会继续在以下项目的processing版本进行更新nanshaws/LibgdxTutorial: libgdx 教程项目 本项目旨在提供完整的libgdx桌面教程,帮助开发者快速掌握libgdx游戏开发框架的使用。成功的将gdx-ai和ashley的tests从官网剥离出来,并成功运行。libgdx tutorial project This project aims to provide a complete libgdx desktop tutorial to help developers quickly master the use of libgdx game development framework. Successfully separated GDX-AI and Ashley's tests from the official website and ran them (github.com)

目录
相关文章
|
8月前
|
机器学习/深度学习 算法 物联网
基于WOA-CNN-LSTM-Attention、CNN-LSTM-Attention、WOA-CNN-LSTM、CNN-LSTM、LSTM、CNN6模型多变量时序预测一键对比研究(Matlab代码)
基于WOA-CNN-LSTM-Attention、CNN-LSTM-Attention、WOA-CNN-LSTM、CNN-LSTM、LSTM、CNN6模型多变量时序预测一键对比研究(Matlab代码)
302 0
|
11月前
|
JSON 前端开发 JavaScript
前端工具方法整理
前端工具方法整理
235 8
|
6月前
|
缓存 API 调度
70_大模型服务部署技术对比:从框架到推理引擎
在2025年的大模型生态中,高效的服务部署技术已成为连接模型能力与实际应用的关键桥梁。随着大模型参数规模的不断扩大和应用场景的日益复杂,如何在有限的硬件资源下实现高性能、低延迟的推理服务,成为了所有大模型应用开发者面临的核心挑战。
852 0
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
343 1
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
1162 4
|
JSON API 数据格式
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
|
运维 算法 数据挖掘
5个适合新手练习的Python刷题网站
5个适合新手练习的Python刷题网站
2177 0
|
域名解析 缓存 负载均衡
【域名解析DNS专栏】域名解析在CDN服务中的应用与优化
【5月更文挑战第30天】本文探讨了域名解析在CDN服务中的重要性,强调其对访问速度和稳定性的影响。文中提出了三种优化方法:使用智能解析以动态选择最佳节点,配置负载均衡保证服务稳定,以及利用DNS缓存提升访问速度。通过Python代码示例展示了基本的DNS解析过程,结论指出优化域名解析对于提升网站性能至关重要。
462 1
【qt】如何添加背景图片?
【qt】如何添加背景图片?
465 0
|
JavaScript 前端开发 开发者
Vue2、Vue3封装组件
封装组件有以下几点好处: 简化开发过程:在开发过程中,我们经常会遇到一些相似的功能需求,比如表单验证、数据展示等。 提高代码的可读性和可维护性:组件封装将代码块封装成一个整体,使代码结构更加清晰,逻辑更加明确。开发者只需关注组件的输入和输出,无需关心其内部实现细节。同时,由于组件是独立的,修改一个组件不会影响其他组件,使得代码的维护更加方便。