当前位置: 首页 > news >正文

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)

相关文章:

processing像素画教程

前提&#xff1a;各位已经安装了processing 第一步&#xff1a;创建一个简单的网格 我们首先创建一个网格来定义我们作品的像素画布。网格将帮助您在适当的位置绘制每个像素。 int gridSize 20; // 每个像素的大小 int cols, rows; void setup() {size(400, 400); // 设置画…...

【秋招笔试】10.13字节跳动(已改编)秋招-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 本次的三题全部上线…...

牛客网上最全的Java八股文整理,涵盖Java全栈技术点

Java 面试 “金九银十”这个字眼对于程序员应该是再熟悉不过的了&#xff0c;每年的金九银十都会有很多程序员找工作、跳槽等一系列的安排。说实话&#xff0c;面试中 7 分靠能力&#xff0c;3 分靠技能&#xff1b;在刚开始的时候介绍项目都是技能中的重中之重&#xff0c;它…...

Skyeye 云智能制造 v3.14.9 发布,ERP 商城 + AI

Skyeye 云智能制造&#xff0c;采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程&#xff0c;CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…...

Element-快速入门

什么是 Element 在现代前端开发中&#xff0c;组件化的思想日益盛行&#xff0c;Element组件库作为一款流行的UI组件库&#xff0c;特别适用于基于Vue.js的项目&#xff0c;它为开发者提供了丰富的组件和良好的开发体验。 想要使用Element的组件库&#xff0c;我们需要完成下面…...

利士策分享,从“亮剑精神”汲取财富智慧

利士策分享&#xff0c;从“亮剑精神”汲取财富智慧 在某一广袤区域内&#xff0c;一场寓意深远的活动正如火如荼地展开&#xff0c;它不仅象征着直面挑战的勇气&#xff0c;更隐含着经济社会发展的深层启示。 对于广大民众来说&#xff0c;这场活动背后所传达的理念与机遇&am…...

【JavaScript】关于使用JS对word文档实现预览的一些思考

文章目录 mammothdocx4js mammoth 官网地址&#xff1a;https://github.com/mwilliamson/mammoth.js#readme 安装mammoth&#xff1a; npm i mammoth -S我们可以安装mammoth来实现上传的word文件的在线预览&#xff0c;我们以element的上传组件为示例&#xff1a; <temp…...

安宝特方案 | AR技术在轨交行业的应用优势

随着轨道交通行业不断向智能化和数字化转型&#xff0c;传统巡检方式的局限性日益凸显。而安宝特AR眼镜以其独特的佩戴方式和轻便设计&#xff0c;为轨道交通巡检领域注入了创新活力&#xff0c;提供了全新的解决方案。 01 多样化佩戴方法&#xff0c;完美适应户外环境 安宝特…...

K8S配置MySQL主从自动水平扩展

前提环境 操作系统Ubuntu 22.04 K8S 1.28.2集群&#xff08;1个master2个node&#xff09; MySQL 5.7.44部署在K8S的主从集群 metrics-server v0.6.4 概念简介 在K8s中扩缩容分为两种 ●Node层面&#xff1a;对K8s物理节点扩容和缩容&#xff0c;根据业务规模实现物理节点自动扩…...

Excel:将一列拆分成多列

实现的效果是&#xff1a; 操作步骤如下&#xff1a; 1.选中列 → 点击菜单栏中的"数据" → 分列 2.选择"分列符号"&#xff0c;点击下一步 3.我想要按照空格分列&#xff0c;就选择空格 4.点击完成&#xff0c;就可以实现分列的效果了...

一款强大灵活的流程图引擎,支持React 和 Svelte 框架

大家好&#xff0c;今天给大家分享一个专注于处理流程可视化和交互的项目xyflow。它旨在为开发者和用户提供一种直观、高效的方式来表示、管理和操作各种流程。 项目介绍 xyflow是一款强大灵活的流程图引擎。该项目是用于构建基于节点的编辑器和交互式图表&#xff0c;支持 Re…...

基于STM32 ARM+FPGA+AD的电能质量分析仪方案设计(一)硬件设计

电能质量分析系统硬件设计 3.1 电能质量分析系统设计要求 本系统实现对电能质量的高精度测量&#xff0c;根据国家相关电能质量分析仪器规定 标准以及对市场电能质量分析仪的分析&#xff0c;指定以下设计目标。 &#xff08; 1 &#xff09;电能质量参数测量精度&#xf…...

LLM - 配置 ModelScope SWIFT 测试 Qwen2-VL 视频微调(LoRA) 教程(3)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142882496 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 SWIFT …...

jmeter实现SSL双向验证

前提: 预先了解:SSL单向/双向认证详解握手请求以及tomcat配置https请求的请到以下网址了解Java nginx https 双向认证 der,cer文件一般是二进制格式的,只放证书,不含私钥 crt 文件可能是二进制的,也可能是文本格式的,应该以文本格式居多,功能同der/cer pem文件一般是…...

数据结构 ——— 单链表oj题:相交链表(链表的共节点)

目录 题目要求 手搓两个相交简易链表 代码实现 题目要求 两个单链表的头节点 headA 和 headB &#xff0c;请找出并返回两个单链表相交的起始节点&#xff0c;如果两个链表不存在相交节点&#xff0c;则返回 NULL 手搓两个相交简易链表 代码演示&#xff1a; struct Lis…...

【WKWebview】WKWebView Cookie 同步

个人实测&#xff1a;js注入的方式更靠谱一点 ⌈iOS⌋WKWebView Cookie 同步的一种方式 屈服于 Apple 的“淫威”&#xff0c;开发者不得不将 App 的网页容器从 UIWebView 迁移到 WKWebView。我们在享受后者带来的性能和功能提升的同时&#xff0c;也被诸如 Cookie 同步、截图…...

vue-router拦截器

在 Vue 项目中&#xff0c;vue-router 的路由拦截器和组件内部的路由拦截器&#xff08;如 beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave&#xff09;虽然都能拦截路由&#xff0c;但它们的作用范围和使用场景有所不同。下面是二者的区别总结&#xff1a; 1. 全局路…...

SpringBoot驱动的人事管理系统:高效办公新选择

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…...

大数据干了什么?

1.大数据技术主要解决的问题是海量数据的 存储 和 查询...

android studio可用下载地址

AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 在此记录一下...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...