如何为8倍放大的Sprite添加像素间填充或叠加网格?
为放大后的Sprite添加像素间距/网格的实现方法
我需要将小型Mario Sprite放大8倍,同时在放大后的每个原像素块(8x8大小)之间添加1像素的间距,或者在放大后的图像上叠加网格。目前已有的基础放大命令是:
convert -scale 800% -quality 100 mario.png mario-big.png
原始Sprite可通过以下命令生成:
# mario sprite in base64 writing to file: magick 'inline:data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAO xAGVKw4bAAAA00lEQVQ4ja1UwRGDMAyTe7zLJmWUzMoodBO6gHmkhsRWcukVvYID kiKbiKoqbsTjTjIAmLq7IvXzwGHahJ5sUKBJKKhf3rcVAPB8pZ5BTihyEcxLomuD Fxhqyryk06WtDZ93LSB+bMqYvBtPBsQYA2FP3YPl2XUIAIpcsCZ5eRM18slvALyL CoFAu5EApCn7tsbx+hY0U55llmkYG7NefuhzKAVFUv1Mm8L+EgKWa5zDQbIWqiNn riuvID8g1r4c2Hi6Ghvg6sg/mqEIDv+9v2+/sQ8vtmAvY/Wf0QAAAABJRU5ErkJg gg==' mario.png
方法一:给像素块添加空白间距
该方法会在每个8x8的像素块之间插入1像素的空白,让块与块彻底分开,命令如下:
# 先获取原始图像尺寸,再放大并绘制分隔线 W=$(identify -format %w mario.png) H=$(identify -format %h mario.png) convert mario.png -scale 800% -quality 100 \ -fill white -stroke white -strokewidth 1 \ $(for ((x=8; x<8*W; x+=9)); do echo "-draw 'line $x,0 $x,$((8*H))'"; done) \ $(for ((y=8; y<8*H; y+=9)); do echo "-draw 'line 0,$y $((8*W)),$y'"; done) \ mario-big-with-gap.png
- 核心逻辑:先将原图放大8倍,再在每个原像素块的边缘位置(每8像素偏移1像素)绘制1像素宽的线条,实现块间分隔。
- 可将
white替换为你需要的背景色,比如black。
方法二:叠加网格线
如果只需要在放大后的图像上叠加网格(不改变块的位置,仅添加线条),可以用更简洁的命令:
convert mario.png -scale 800% -quality 100 \ -stroke white -strokewidth 1 -fill none \ -draw "for x from 8 to %w step 8 rectangle x,0 x+1,%h" \ -draw "for y from 8 to %h step 8 rectangle 0,y %w,y+1" \ mario-big-with-grid.png
- 核心逻辑:利用ImageMagick内置循环,每隔8像素绘制1像素宽的垂直线和水平线,形成覆盖整个图像的网格。
- 可修改
white为其他对比色,调整strokewidth参数可改变网格线的粗细。
内容的提问来源于stack exchange,提问作者PedroSangre
相关产品推荐
相关产品推荐

