Komut satırından görüntü işleme, format dönüşümü, sprite sheet oluşturma, video işleme, optimizasyon ve AI araçları
Grafik işlemleri her zaman GUI (görsel arayüz) ile yapılmak zorunda değildir. Komut satırı araçları, özellikle toplu işlemler, otomasyon ve pipeline oluşturma gibi senaryolarda çok daha hızlı ve güçlüdür. Oyun geliştirmede yüzlerce asset'i tek seferde dönüştürmek, optimize etmek veya sprite sheet oluşturmak CLI araçlarıyla dakikalar içinde yapılabilir.
GUI: İnteraktif çalışma, tek dosya düzenleme, görsel kontrol.
CLI: Toplu işlem (batch), otomasyon (pipeline), tekrarlanabilirlik, betik yazma, CI/CD entegrasyonu.
CLI araçları özellikle şu durumlar için idealdir:
Bu derste kullanacağımız temel CLI araçlarının logoları
| Araç | Alan | Dil | Lisans |
|---|---|---|---|
| ImageMagick | Görüntü işleme (her şey) | C | Apache 2.0 |
| FFmpeg | Video / ses işleme | C | LGPL/GPL |
| ExifTool | Metadata okuma/yazma | Perl | GPL |
| Potrace | Bitmap → Vektör | C | GPL |
| OptiPNG / oxipng | PNG optimizasyon | C / Rust | zlib / MIT |
| pngquant | PNG kayıplı sıkıştırma | C | GPL |
| gifski | Yüksek kalite GIF | Rust | AGPL |
| svgo | SVG optimizasyon | Node.js | MIT |
| rembg | AI arka plan kaldırma | Python | MIT |
| Real-ESRGAN | AI süper çözünürlük | Python | BSD |
ImageMagick, 200'den fazla görüntü formatını destekleyen, komut satırından neredeyse her türlü görüntü işlemi yapabilen en kapsamlı araçtır. 1990'dan beri geliştiriliyor ve endüstri standardıdır.
ImageMagick 7'de tüm komutlar magick altında birleşti. Eski sürümlerdeki convert, mogrify, montage gibi komutlar artık magick convert, magick mogrify şeklinde kullanılır. Yeni kurulumda doğrudan magick yeterlidir.
# Ubuntu / Debian
sudo apt install imagemagick
# macOS (Homebrew)
brew install imagemagick
# Windows (winget)
winget install ImageMagick.ImageMagick
# Doğrulama
magick --version
# Sabit boyut (en-boy oranını koru)
magick input.png -resize 800x600 output.png
# Yüzde ile küçült
magick input.png -resize 50% output.png
# Tam boyuta zorla (en-boy bozulabilir!)
magick input.png -resize 800x600! output.png
# Sadece küçült (büyütme)
magick input.png -resize 800x600\> output.png
# Pixel art için nearest neighbor (piksel keskinliğini korur)
magick input.png -filter Point -resize 400% output.png
Pixel art büyütürken mutlaka -filter Point kullanın! Varsayılan bicubic filtre pikselleri bulanıklaştırır.
# Kırpma: 300x200 boyutunda, sol üst köşeden (50,50) başla
magick input.png -crop 300x200+50+50 +repage output.png
# Otomatik kırp (boş kenarları kes)
magick input.png -trim +repage output.png
# Döndürme
magick input.png -rotate 90 output.png
magick input.png -rotate -45 -background none output.png
# Yatay / dikey aynalama
magick input.png -flip output.png # Dikey
magick input.png -flop output.png # Yatay
# Gri tonlama
magick input.png -colorspace Gray output.png
# Renk sayısını sınırla (retro efekt)
magick input.png -colors 16 output.png
# Dithering ile renk azaltma
magick input.png -colors 8 -dither FloydSteinberg output.png
# Parlaklık ve kontrast
magick input.png -brightness-contrast 10x20 output.png
# Rengi değiştir (hue shift)
magick input.png -modulate 100,100,150 output.png
# Sepya tonu
magick input.png -sepia-tone 80% output.png
# Negatif (ters çevir)
magick input.png -negate output.png
# PNG → JPEG (kalite ayarıyla)
magick input.png -quality 85 output.jpg
# PNG → WebP
magick input.png -quality 80 output.webp
# JPEG → PNG (kayıpsız)
magick photo.jpg output.png
# Toplu dönüşüm (tüm PNG'leri WebP'ye)
magick mogrify -format webp -quality 80 *.png
# BMP → PNG
magick input.bmp output.png
# Bulanıklaştırma (Gaussian Blur)
magick input.png -blur 0x5 output.png
# Keskinleştirme (Sharpen)
magick input.png -sharpen 0x2 output.png
# Kenar algılama (Edge Detection)
magick input.png -edge 1 output.png
# Kabartma (Emboss)
magick input.png -emboss 1 output.png
# Yağlı boya efekti
magick input.png -paint 4 output.png
# Karakalem çizim efekti
magick input.png -colorspace Gray -sketch 0x20+120 output.png
# Filigran (watermark) ekleme
magick input.png \
-gravity SouthEast \
-fill "rgba(255,255,255,0.3)" \
-pointsize 24 \
-annotate +10+10 "© 2025" \
output.png
# Karelerden GIF
magick -delay 10 -loop 0 frame_*.png animation.gif
# GIF hızını ayarla (delay = 1/100 saniye)
magick -delay 5 -loop 0 frame_*.png fast.gif # Hızlı
magick -delay 20 -loop 0 frame_*.png slow.gif # Yavaş
# GIF'i optimize et (boyutu küçült)
magick animation.gif -layers Optimize optimized.gif
# GIF'ten kareleri çıkar
magick animation.gif frame_%03d.png
Oyun motorlarında tüm karakter animasyon karelerini tek bir büyük görüntüde birleştirmeye sprite sheet denir. Bu sayede GPU tek bir texture yükler ve draw call sayısı azalır.
Bir sprite sheet örneği — tüm animasyon kareleri tek görüntüde
# Sprite sheet (8 sütunluk)
magick montage frame_*.png \
-geometry 64x64+0+0 \
-tile 8x \
-background none \
spritesheet.png
# Thumbnail tablosu (5x4)
magick montage *.jpg \
-geometry 200x150+5+5 \
-tile 5x4 \
thumbnails.png
# Sprite sheet'ten tek kare çıkarma
magick spritesheet.png -crop 64x64+128+0 +repage frame3.png
# Tüm görüntüleri 800px genişliğe küçült
magick mogrify -resize 800x *.png
# Tüm JPEG'leri %85 kaliteyle yeniden sıkıştır
magick mogrify -quality 85 *.jpg
# Tüm PNG'lere çerçeve ekle
for f in *.png; do
magick "$f" -bordercolor "#333" -border 5 "framed_$f"
done
# Klasördeki her görüntüyü farklı boyutlarda kaydet
for f in *.png; do
base=$(basename "$f" .png)
magick "$f" -resize 256x256 "sm_${base}.png"
magick "$f" -resize 512x512 "md_${base}.png"
magick "$f" -resize 1024x1024 "lg_${base}.png"
done
# Bileşik (composite) - iki görüntüyü birleştir
magick background.png overlay.png -gravity Center -composite result.png
# Alpha kanalı işlemleri
magick input.png -alpha set -channel A -evaluate set 50% +channel semi_transparent.png
# Histogramdan baskın renkleri çıkar
magick input.png -colors 5 -unique-colors -scale 100x20! palette.png
# Renk paleti oluştur (oyun geliştirmede kullanışlı)
magick input.png -colors 16 -unique-colors txt:- | tail -n +2
# Procedural texture: Plasma
magick -size 256x256 plasma: plasma_texture.png
# Procedural texture: Noise
magick -size 256x256 xc: +noise Random noise_texture.png
# Procedural texture: Checkerboard
magick -size 256x256 pattern:checkerboard checkerboard.png
# Tileable (döşenebilir) noise
magick -size 256x256 xc: +noise Gaussian -virtual-pixel tile -blur 0x5 tileable.png
ImageMagick'te /etc/ImageMagick-6/policy.xml dosyası bazı işlemleri güvenlik nedeniyle kısıtlayabilir. SVG, PDF gibi formatlarla sorun yaşarsanız bu dosyayı kontrol edin.
FFmpeg, video/ses dönüştürme, kare çıkarma, GIF oluşturma ve daha fazlası için endüstri standardı araçtır. YouTube, Netflix gibi platformlar bile arka planda FFmpeg kullanır.
# Ubuntu / Debian
sudo apt install ffmpeg
# macOS
brew install ffmpeg
# Doğrulama
ffmpeg -version
# Tüm kareleri PNG olarak çıkar
ffmpeg -i video.mp4 frame_%04d.png
# Saniyede 2 kare çıkar (fps filtresi)
ffmpeg -i video.mp4 -vf "fps=2" frame_%04d.png
# Belirli bir anın karesini çıkar (ss = zaman)
ffmpeg -ss 00:01:30 -i video.mp4 -frames:v 1 screenshot.png
# Her 10. saniyede bir kare
ffmpeg -i video.mp4 -vf "fps=1/10" thumb_%03d.jpg
# PNG karelerden MP4 video
ffmpeg -framerate 24 -i frame_%04d.png \
-c:v libx264 -pix_fmt yuv420p output.mp4
# Karelerden GIF
ffmpeg -framerate 12 -i frame_%04d.png \
-vf "split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
output.gif
# Videodan yüksek kalite GIF (palette optimizasyonu)
ffmpeg -i video.mp4 \
-vf "fps=15,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
output.gif
# Videoyu ölçekle
ffmpeg -i input.mp4 -vf "scale=1280:720" output.mp4
# Video kırpma (crop)
ffmpeg -i input.mp4 -vf "crop=640:480:100:50" output.mp4
# Hız değiştirme (2x hızlı)
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" fast.mp4
# Ters oynatma
ffmpeg -i input.mp4 -vf reverse reversed.mp4
# Siyah-beyaz filtre
ffmpeg -i input.mp4 -vf "hue=s=0" bw.mp4
# Video döndürme
ffmpeg -i input.mp4 -vf "transpose=1" rotated.mp4 # 90° saat yönünde
# Metin ekleme (filigran)
ffmpeg -i input.mp4 \
-vf "drawtext=text='© 2025':fontsize=24:fontcolor=white:x=w-tw-10:y=h-th-10" \
watermarked.mp4
# MP4 → WebM
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 output.webm
# MOV → MP4
ffmpeg -i input.mov -c:v libx264 -crf 23 output.mp4
# Video → sadece ses
ffmpeg -i video.mp4 -vn -acodec libmp3lame audio.mp3
# Timelapse (her 30. kareyi al)
ffmpeg -i video.mp4 -vf "select='not(mod(n\,30))',setpts=N/FRAME_RATE/TB" timelapse.mp4
# Video bilgisi (JSON)
ffprobe -v quiet -print_format json -show_streams video.mp4
# Sadece çözünürlük
ffprobe -v error -select_streams v -show_entries stream=width,height \
-of csv=s=x:p=0 video.mp4
# Video süresi (saniye)
ffprobe -v error -show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 video.mp4
Fotoğraf ve görüntü dosyalarındaki metadata'yı (EXIF, IPTC, XMP) okumak, yazmak ve düzenlemek için en güçlü araçtır.
# Ubuntu / Debian
sudo apt install libimage-exiftool-perl
# macOS
brew install exiftool
# Tüm metadata'yı göster
exiftool photo.jpg
# Sadece belirli alanlar
exiftool -Make -Model -DateTimeOriginal -ImageSize photo.jpg
# CSV formatında rapor (toplu)
exiftool -csv -r -Make -Model -DateTimeOriginal photos/ > report.csv
# Metadata yaz
exiftool -Artist="İsim Soyisim" -Copyright="© 2025" photo.jpg
# GPS bilgisini sil (gizlilik!)
exiftool -GPS:all= -overwrite_original photo.jpg
# TÜM metadata'yı sil
exiftool -all= -overwrite_original photo.jpg
# Klasördeki tüm dosyalardaki GPS bilgisini toplu sil
exiftool -GPS:all= -overwrite_original -r photos/
Fotoğrafları internette paylaşmadan önce GPS metadata'sını mutlaka kaldırın! Akıllı telefonlarla çekilen fotoğraflar tam konum bilgisi içerebilir.
Oyun ve web projelerinde dosya boyutu kritiktir. Bu araçlar görüntüleri kaliteden fazla ödün vermeden küçültür.
| Araç | Format | Tür | Açıklama |
|---|---|---|---|
| OptiPNG | PNG | Kayıpsız | PNG sıkıştırmayı optimize eder |
| oxipng | PNG | Kayıpsız | Rust ile yazılmış, çok hızlı OptiPNG alternatifi |
| pngquant | PNG | Kayıplı | 24-bit → 8-bit dönüşüm, %60-80 küçülme |
| jpegoptim | JPEG | Kayıpsız/Kayıplı | JPEG optimizasyonu |
| mozjpeg | JPEG | Kayıplı | Mozilla'nın gelişmiş JPEG encoder'ı |
| gifski | GIF | Kayıplı | En yüksek kalite GIF encoder |
| cwebp | WebP | Kayıplı/Kayıpsız | Google'ın WebP encoder'ı |
| avifenc | AVIF | Kayıplı/Kayıpsız | AVIF encoder (en modern format) |
# Ubuntu / Debian
sudo apt install optipng pngquant jpegoptim webp libavif-bin
# macOS
brew install optipng pngquant jpegoptim oxipng gifski webp libavif
# Rust araçları
cargo install oxipng gifski
# PNG kayıpsız optimizasyon
optipng -o5 image.png
oxipng -o 4 --strip all image.png # Daha hızlı alternatif
# PNG kayıplı sıkıştırma (%65-80 küçülme!)
pngquant --quality=65-80 --output small.png image.png
# JPEG optimizasyon
jpegoptim -m85 --strip-all photo.jpg # %85 kalite, metadata sil
# WebP encode
cwebp -q 80 input.png -o output.webp # Kayıplı
cwebp -lossless input.png -o output.webp # Kayıpsız
# AVIF encode (en küçük dosya boyutu)
avifenc -q 30 --speed 6 input.png output.avif
# Yüksek kalite GIF (gifski)
gifski --fps 15 --width 480 -o output.gif frame_*.png
# Toplu PNG optimizasyon
find . -name "*.png" -exec oxipng -o 4 --strip all {} \;
# Toplu JPEG optimizasyon
find . -name "*.jpg" -exec jpegoptim -m85 --strip-all {} \;
Pixel art / Sprite: PNG (kayıpsız, şeffaflık)
Fotoğraf (web): WebP > AVIF > JPEG
Fotoğraf (arşiv): PNG veya TIFF
Kısa animasyon: GIF (gifski ile) veya WebP animasyonlu
Vektör: SVG (web), PDF (baskı)
Bitmap (raster) ve vektör grafik karşılaştırması — Potrace bu dönüşümü otomatik yapar
Potrace, bitmap (raster) görüntüleri vektör grafiğe (SVG, PDF, EPS) dönüştürür. El çizimleri, logolar ve siyah-beyaz görsellerde mükemmel sonuç verir.
# Ubuntu / Debian
sudo apt install potrace
# macOS
brew install potrace
# Temel vektörizasyon (BMP/PBM → SVG)
potrace input.pbm -s -o output.svg
# PNG → SVG (önce bitmap'e dönüştür)
magick input.png -threshold 50% pbm:- | potrace -s -o output.svg
# Daha pürüzsüz çıktı (tolerance ayarı)
potrace input.pbm -s -a 1.5 -t 5 -o smooth.svg
# Renkli vektörizasyon (farklı eşik seviyeleri)
for level in 30 50 70 90; do
magick input.png -threshold ${level}% pbm:- | potrace -s -o "layer_${level}.svg"
done
# mkbitmap ile ön işleme (daha iyi sonuç)
mkbitmap input.png -f 2 -s 2 -t 0.48 -o preprocessed.pbm
potrace preprocessed.pbm -s -o output.svg
Kağıda çizdiğiniz bir karakteri vektöre dönüştürmek için: Fotoğrafla → magick ile kontrastı artır → -threshold ile siyah-beyaza çevir → potrace ile vektörize et → svgo ile SVG'yi optimize et.
GIMP ve Inkscape sadece GUI araçları değildir — komut satırından toplu işlem yapabilirsiniz.
# GIMP ile toplu işlem (Script-Fu)
gimp -i -b '(let* (
(image (car (gimp-file-load RUN-NONINTERACTIVE "input.png" "input.png")))
(drawable (car (gimp-image-get-active-drawable image)))
)
(gimp-image-scale image 512 512)
(file-png-save RUN-NONINTERACTIVE image drawable "output.png" "output.png" 0 9 1 1 1 1 1)
(gimp-image-delete image)
)' -b '(gimp-quit 0)'
# GIMP Python-Fu ile toplu filtre uygulama
gimp -i -b '
import glob, os
for f in glob.glob("input_dir/*.png"):
image = pdb.gimp_file_load(f, f)
drawable = pdb.gimp_image_get_active_drawable(image)
pdb.plug_in_cartoon(image, drawable, 7.0, 1.0)
out = os.path.join("output_dir", os.path.basename(f))
pdb.file_png_save(image, drawable, out, out, 0, 9, 1, 1, 1, 1, 1)
pdb.gimp_image_delete(image)
pdb.gimp_quit(0)
'
# SVG → PNG dışa aktarma
inkscape input.svg -o output.png -w 512
# SVG → PDF
inkscape input.svg -o output.pdf
# Toplu SVG → PNG (farklı boyutlar)
for size in 16 32 48 64 128 256 512; do
inkscape icon.svg -o "icon_${size}.png" -w $size -h $size
done
# Inkscape Actions (zincirleme komutlar)
inkscape input.svg \
--actions="select-all;object-align:center x;object-align:center y;export-filename:centered.svg;export-do"
Terminalde çalışırken görüntüleri hızlıca önizlemek için:
| Araç | Dil | Özellik |
|---|---|---|
| chafa | C | Unicode/sixel ile yüksek kalite terminal gösterimi |
| viu | Rust | Hızlı terminal görüntüleyici |
| catimg | C | Basit terminal görüntüleyici |
| timg | C++ | Terminal image viewer, video desteği |
# Kurulum
brew install chafa viu timg # macOS
sudo apt install chafa timg # Ubuntu
cargo install viu # Rust
# Kullanım
chafa image.png # Terminalde göster
chafa image.png -s 40x20 # Boyut belirt
chafa image.png --symbols block # Blok karakterleri kullan
viu image.png # Rust tabanlı gösterici
timg image.png # Video da destekler
timg video.mp4 # Video terminalde!
# Kurulum
brew install pastel # macOS
cargo install pastel # Rust ile
# Renk bilgisi
pastel color "#FF6B35"
pastel color "rgb(59,130,246)"
# Renk paleti (tamamlayıcı, analojik, vb.)
pastel complement "#FF6B35"
pastel saturate 0.2 "#FF6B35"
pastel lighten 0.1 "#FF6B35"
# Gradient (geçiş) oluştur
pastel gradient -n 10 "#FF0000" "#0000FF"
# Farklı renk uzaylarında göster
pastel format hsl "#FF6B35"
pastel format rgb "#FF6B35"
# svgo (Node.js)
npm install -g svgo
svgo input.svg -o output.svg
svgo -f icons/ # Klasördeki tüm SVG'leri optimize et
# svgcleaner (Rust — daha agresif)
cargo install svgcleaner
svgcleaner input.svg output.svg
# sharp-cli (Node.js — çok hızlı)
npm install -g sharp-cli
sharp -i input.png -o output.webp --format webp --quality 80
sharp -i input.png -o output.avif --format avif --quality 30
# sharp ile toplu boyutlandırma
sharp -i input.png -o sm.png resize 256 256
sharp -i input.png -o md.png resize 512 512
# Lottie araçları (JSON animasyon)
npm install -g lottie-web puppeteer-lottie-cli
puppeteer-lottie -i animation.json -o animation.gif
puppeteer-lottie -i animation.json -o animation.mp4
GraphicsMagick, ImageMagick'in bir fork'udur. Daha kararlı, daha hızlı (özellikle sunucu tarafında) ve daha az bellek tüketir. API neredeyse aynıdır.
# Kurulum
sudo apt install graphicsmagick # Ubuntu
brew install graphicsmagick # macOS
# Kullanım (gm komutu ile)
gm convert input.png -resize 800x600 output.png
gm convert input.png -quality 85 output.jpg
gm montage *.png -geometry 64x64+0+0 -tile 8x sheet.png
gm mogrify -resize 50% *.png
| Özellik | ImageMagick | GraphicsMagick |
|---|---|---|
| Hız | Orta | Genellikle daha hızlı |
| Bellek kullanımı | Yüksek | Daha düşük |
| Format desteği | 200+ format | 88+ format |
| Aktif geliştirme | Çok aktif | Kararlı, yavaş güncelleme |
| Yeni özellikler | Sürekli ekleniyor | Kararlılığa odaklı |
Yapay zeka ile güçlendirilmiş CLI araçları, daha önce elle yapılması gereken karmaşık işlemleri otomatikleştiriyor.
# Kurulum
pip install rembg[cli]
# Tek dosya
rembg i input.jpg output.png
# Toplu işlem (klasör)
rembg p input_folder/ output_folder/
# Özel model ile
rembg i -m u2net_human_seg input.jpg output.png
# Kurulum
pip install realesrgan
# 4x büyütme (genel)
realesrgan-ncnn-vulkan -i low_res.png -o high_res.png -n realesrgan-x4plus
# Anime/çizim için özel model
realesrgan-ncnn-vulkan -i anime.png -o anime_hd.png -n realesrgan-x4plus-anime
# Python ile
python -c "
from realesrgan import RealESRGANer
from PIL import Image
import numpy as np
model = RealESRGANer(scale=4, model_path='RealESRGAN_x4plus.pth')
img = np.array(Image.open('input.png'))
output, _ = model.enhance(img)
Image.fromarray(output).save('output.png')
"
| Araç | İşlev | GPU? | Boyut |
|---|---|---|---|
| rembg | Arka plan kaldırma | Hayır (CPU yeterli) | ~170 MB |
| Real-ESRGAN | Süper çözünürlük (4x büyütme) | Önerilir | ~65 MB |
| waifu2x | Anime/çizim büyütme | Önerilir | ~20 MB |
| GFPGAN | Yüz onarma / restorasyonu | Evet | ~330 MB |
| Stable Diffusion | Görüntü üretme (txt2img) | Evet (>4GB VRAM) | ~4 GB |
| SAM (Meta) | Otomatik segmentasyon | Evet | ~2.5 GB |
| Depth Anything | Derinlik haritası çıkarma | Önerilir | ~350 MB |
# waifu2x (anime/çizim büyütme)
pip install waifu2x-ncnn-vulkan-python
waifu2x-ncnn-vulkan -i anime.png -o anime_2x.png -s 2 -n 3
# Stable Diffusion (komut satırından görüntü üretme)
pip install diffusers
python -c "
from diffusers import StableDiffusionPipeline
import torch
pipe = StableDiffusionPipeline.from_pretrained(
'runwayml/stable-diffusion-v1-5', torch_dtype=torch.float16
).to('cuda')
image = pipe('pixel art sword, 32x32, game asset').images[0]
image.save('sword.png')
"
# GFPGAN (yüz onarma)
pip install gfpgan
codeformer -i blurry_face.png -o restored.png
# style_transfer (stil transferi)
pip install style_transfer
style_transfer content.png style.png -o stylized.png
CLI araçlarının gerçek gücü, onları birleştirerek otomatik iş akışları (pipeline) oluşturmakta yatar. Aşağıda oyun geliştirmede sıklıkla kullanılan pipeline örnekleri bulunmaktadır.
Ayrı kareler → Boyutlandır → Montaj → Optimize → JSON metadata oluştur
#!/bin/bash
# sprite_pipeline.sh — Bireysel karelerden sprite sheet oluştur
# Kullanım: ./sprite_pipeline.sh <kareler_klasörü> <sprite_boyutu> <sütun_sayısı>
set -e
FRAMES_DIR="${1:?Kullanım: $0 <kareler_klasörü> <sprite_boyutu> <sütun_sayısı>}"
SPRITE_SIZE="${2:-64}"
COLUMNS="${3:-8}"
OUTPUT_DIR="output"
mkdir -p "$OUTPUT_DIR"
# 1. Tüm kareleri aynı boyuta getir
for frame in "$FRAMES_DIR"/*.png; do
base=$(basename "$frame")
magick "$frame" \
-resize "${SPRITE_SIZE}x${SPRITE_SIZE}" \
-gravity Center -background none \
-extent "${SPRITE_SIZE}x${SPRITE_SIZE}" \
"$OUTPUT_DIR/resized_$base"
done
# 2. Sprite sheet oluştur
magick montage "$OUTPUT_DIR"/resized_*.png \
-geometry "${SPRITE_SIZE}x${SPRITE_SIZE}+0+0" \
-tile "${COLUMNS}x" -background none \
"$OUTPUT_DIR/spritesheet.png"
# 3. Optimize et
if command -v oxipng &> /dev/null; then
oxipng -o 4 --strip all "$OUTPUT_DIR/spritesheet.png"
fi
# 4. JSON metadata oluştur (oyun motoru için)
FRAME_COUNT=$(ls "$OUTPUT_DIR"/resized_*.png 2>/dev/null | wc -l)
ROWS=$(( (FRAME_COUNT + COLUMNS - 1) / COLUMNS ))
cat > "$OUTPUT_DIR/spritesheet.json" << EOF
{
"image": "spritesheet.png",
"frameWidth": $SPRITE_SIZE,
"frameHeight": $SPRITE_SIZE,
"columns": $COLUMNS,
"rows": $ROWS,
"totalFrames": $FRAME_COUNT
}
EOF
echo "✅ Sprite sheet: $OUTPUT_DIR/spritesheet.png ($FRAME_COUNT kare)"
rm -f "$OUTPUT_DIR"/resized_*.png
#!/bin/bash
# asset_converter.sh — Oyun asset'lerini farklı platformlar için hazırla
set -e
SOURCE_DIR="${1:?Kullanım: $0 <kaynak_klasör>}"
# Platform hedefleri: Platform:Format:Kalite:MaxBoyut
TARGETS=(
"web:webp:80:1024"
"mobile:webp:70:512"
"desktop:png:_:2048"
"thumbnail:jpg:75:256"
)
for target in "${TARGETS[@]}"; do
IFS=':' read -r platform format quality maxsize <<< "$target"
OUTDIR="build/${platform}"
mkdir -p "$OUTDIR"
echo "🎯 Platform: $platform (${format}, max:${maxsize}px)"
for file in "$SOURCE_DIR"/*.png; do
[ -f "$file" ] || continue
base=$(basename "$file" .png)
case $format in
webp) magick "$file" -resize "${maxsize}x${maxsize}>" -quality "$quality" "$OUTDIR/${base}.webp" ;;
png) magick "$file" -resize "${maxsize}x${maxsize}>" "$OUTDIR/${base}.png" ;;
jpg) magick "$file" -resize "${maxsize}x${maxsize}>" -background white -flatten -quality "$quality" "$OUTDIR/${base}.jpg" ;;
esac
done
SIZE=$(du -sh "$OUTDIR" | cut -f1)
echo " → $(ls "$OUTDIR" | wc -l) dosya, toplam $SIZE"
done
echo "✅ Tüm platformlar hazır!"
#!/bin/bash
# video_to_spritesheet.sh — Videodan otomatik sprite sheet oluştur
set -e
VIDEO="${1:?Kullanım: $0 <video> <fps> <sprite_boyutu> <sütun>}"
FPS="${2:-12}"; SIZE="${3:-64}"; COLS="${4:-8}"
TEMP_DIR=$(mktemp -d)
# 1. Videodan kareleri çıkar
ffmpeg -i "$VIDEO" -vf "fps=$FPS" "$TEMP_DIR/frame_%04d.png" -y -loglevel error
FRAME_COUNT=$(ls "$TEMP_DIR"/frame_*.png | wc -l)
echo "$FRAME_COUNT kare çıkarıldı"
# 2. Arka planı kaldır (rembg varsa)
if command -v rembg &> /dev/null; then
rembg p "$TEMP_DIR/" "$TEMP_DIR/nobg/"
FRAMES_DIR="$TEMP_DIR/nobg"
else
FRAMES_DIR="$TEMP_DIR"
fi
# 3. Sprite sheet oluştur
magick montage "$FRAMES_DIR"/frame_*.png \
-geometry "${SIZE}x${SIZE}+0+0" -tile "${COLS}x" \
-background none -resize "${SIZE}x${SIZE}" \
spritesheet_from_video.png
# 4. Optimize et
command -v oxipng &> /dev/null && oxipng -o 4 --strip all spritesheet_from_video.png
echo "✅ spritesheet_from_video.png oluşturuldu ($FRAME_COUNT kare)"
rm -rf "$TEMP_DIR"
#!/bin/bash
# icon_generator.sh — Tek bir kaynak görüntüden tüm platform ikonları oluştur
set -e
SOURCE="${1:?Kullanım: $0 <kaynak_görüntü.png>}"
OUTPUT_DIR="icons"
mkdir -p "$OUTPUT_DIR"/{android,ios,web,windows}
# Android (mipmap)
for entry in "48:mdpi" "72:hdpi" "96:xhdpi" "144:xxhdpi" "192:xxxhdpi"; do
IFS=':' read -r size dpi <<< "$entry"
magick "$SOURCE" -resize "${size}x${size}" "$OUTPUT_DIR/android/ic_launcher_${dpi}.png"
done
# iOS
for size in 20 29 40 58 60 76 80 87 120 152 167 180 1024; do
magick "$SOURCE" -resize "${size}x${size}" "$OUTPUT_DIR/ios/icon_${size}.png"
done
# Web (favicon)
magick "$SOURCE" -resize 16x16 "$OUTPUT_DIR/web/favicon-16x16.png"
magick "$SOURCE" -resize 32x32 "$OUTPUT_DIR/web/favicon-32x32.png"
magick "$SOURCE" -resize 192x192 "$OUTPUT_DIR/web/android-chrome-192x192.png"
magick "$SOURCE" -resize 512x512 "$OUTPUT_DIR/web/android-chrome-512x512.png"
magick "$SOURCE" -define icon:auto-resize=256,128,64,48,32,16 "$OUTPUT_DIR/web/favicon.ico"
echo "✅ İkon seti oluşturuldu!"
find "$OUTPUT_DIR" -type f | wc -l
echo "dosya oluşturuldu"
Makefile, sadece değişen dosyaları yeniden işler. 500 asset'ten sadece 3'ü değiştiyse, sadece o 3'ünü dönüştürür. Büyük projelerde bu ciddi zaman kazandırır.
# Makefile — Oyun asset pipeline'ı
# Kullanım: make all / make sprites / make textures / make clean
SPRITE_SIZE := 64
SPRITE_COLS := 8
WEB_QUALITY := 80
SOURCE_DIR := raw_assets
BUILD_DIR := build
RAW_TEXTURES := $(wildcard $(SOURCE_DIR)/textures/*.png)
WEBP_TEXTURES := $(patsubst $(SOURCE_DIR)/textures/%.png,$(BUILD_DIR)/textures/%.webp,$(RAW_TEXTURES))
.PHONY: all sprites textures clean
all: sprites textures
sprites: $(BUILD_DIR)/sprites/spritesheet.png
$(BUILD_DIR)/sprites/spritesheet.png: $(wildcard $(SOURCE_DIR)/sprites/*.png)
@mkdir -p $(BUILD_DIR)/sprites
magick montage $^ -geometry $(SPRITE_SIZE)x$(SPRITE_SIZE)+0+0 \
-tile $(SPRITE_COLS)x -background none $@
oxipng -o 4 --strip all $@ 2>/dev/null || true
textures: $(WEBP_TEXTURES)
$(BUILD_DIR)/textures/%.webp: $(SOURCE_DIR)/textures/%.png
@mkdir -p $(BUILD_DIR)/textures
cwebp -q $(WEB_QUALITY) $< -o $@
clean:
rm -rf $(BUILD_DIR)
#!/usr/bin/env python3
"""asset_pipeline.py — Python ile kapsamlı asset pipeline"""
import os, json
from pathlib import Path
from PIL import Image
class AssetPipeline:
def __init__(self, source_dir, build_dir="build"):
self.source_dir = Path(source_dir)
self.build_dir = Path(build_dir)
def create_spritesheet(self, frames_dir, output_name,
frame_size=64, columns=8):
"""Karelerden sprite sheet oluştur"""
frames = sorted((self.source_dir / frames_dir).glob("*.png"))
if not frames:
return
rows = (len(frames) + columns - 1) // columns
sheet = Image.new("RGBA",
(columns * frame_size, rows * frame_size), (0,0,0,0))
metadata = {"frames": [], "frameWidth": frame_size,
"frameHeight": frame_size, "columns": columns}
for i, fp in enumerate(frames):
img = Image.open(fp).convert("RGBA")
img = img.resize((frame_size, frame_size), Image.NEAREST)
x = (i % columns) * frame_size
y = (i // columns) * frame_size
sheet.paste(img, (x, y))
metadata["frames"].append(
{"name": fp.stem, "x": x, "y": y,
"w": frame_size, "h": frame_size})
out = self.build_dir / "sprites"
out.mkdir(parents=True, exist_ok=True)
sheet.save(out / f"{output_name}.png", "PNG")
with open(out / f"{output_name}.json", "w") as f:
json.dump(metadata, f, indent=2)
def batch_convert(self, input_dir, fmt="webp",
quality=80, max_size=None):
"""Toplu format dönüşümü"""
dst = self.build_dir / input_dir
dst.mkdir(parents=True, exist_ok=True)
for p in (self.source_dir / input_dir).glob("*.png"):
img = Image.open(p)
if max_size:
img.thumbnail((max_size, max_size), Image.LANCZOS)
out = dst / f"{p.stem}.{fmt}"
if fmt == "webp":
img.save(out, "WEBP", quality=quality)
elif fmt == "jpg":
img.convert("RGB").save(out, "JPEG", quality=quality)
else:
img.save(out)
# Kullanım
if __name__ == "__main__":
pipeline = AssetPipeline("raw_assets")
pipeline.create_spritesheet("walk_frames", "walk_cycle",
frame_size=64, columns=8)
pipeline.batch_convert("textures", "webp", quality=80, max_size=1024)
Araçlar: ImageMagick
Bir klasördeki fotoğraflardan otomatik thumbnail sayfası oluşturun. Her fotoğraf için 150x150 küçük resim ve montaj görüntüsü.
magick mogrify -path thumbs/ \
-thumbnail 150x150^ \
-gravity Center -extent 150x150 \
photos/*.jpg
magick montage thumbs/*.jpg \
-geometry 150x150+5+5 -tile 5x \
gallery.png
Araçlar: ImageMagick
Normal fotoğrafları retro pixel art tarzına dönüştürün: küçült → sınırlı palet → nearest neighbor büyüt.
magick photo.jpg \
-resize 64x64 \
-colors 16 \
-dither FloydSteinberg \
-filter Point -resize 512x512 \
retro_photo.png
Araçlar: ExifTool
Bir klasördeki tüm fotoğrafların metadata'sını analiz edin: kamera modelleri, GPS konumları, çekim tarihleri. CSV raporu oluşturun, gizlilik için GPS bilgisini temizleyin.
# Rapor oluştur
exiftool -csv -r -Make -Model -DateTimeOriginal -GPSPosition photos/ > report.csv
# GPS temizle
exiftool -GPS:all= -overwrite_original -r photos/
Araçlar: ImageMagick, gifski
Renk geçişli arka plan kareleri oluştur, metin ekle, yüksek kalite GIF olarak birleştir.
for i in $(seq 0 29); do
HUE=$((i * 12))
magick -size 480x320 \
"xc:hsl($HUE,100%,50%)" \
-gravity Center -fill white \
-pointsize 48 \
-annotate +0+0 "Merhaba!" \
frame_$i.png
done
gifski --fps 15 -o postcard.gif \
frame_*.png
Araçlar: ImageMagick, cwebp, avifenc
Aynı görüntüyü farklı formatlarda ve kalite seviyelerinde kaydedin. Dosya boyutlarıyla CSV rapor oluşturun.
for q in 30 50 70 85 95; do
magick img.png -quality $q "q${q}.jpg"
cwebp -q $q img.png -o "q${q}.webp"
avifenc -q $q img.png "q${q}.avif"
done
Araçlar: rembg, Real-ESRGAN, ImageMagick
Düşük kaliteli referans görüntülerden tam otomatik: arka plan kaldır → AI büyüt → sprite sheet oluştur.
Araçlar: ImageMagick, Python (Pillow)
Komut satırından parametrik, tile-able texture'lar oluşturun: noise, plasma, tuğla, altıgen desen.
magick -size 256x256 plasma: plasma.png
magick -size 256x256 pattern:bricks bricks.png
magick -size 256x256 pattern:hexagons hex.png
Araçlar: ImageMagick, Potrace, Inkscape, svgo
Kağıda çizilen oyun karakterini fotoğrafla → kontrastı artır → bitmap'e dönüştür → vektörize et → SVG optimize et → farklı boyutlarda PNG dışa aktar.
# 1. Kontrastı artır
magick sketch.jpg -colorspace Gray -auto-level -contrast-stretch 5%x5% enhanced.png
# 2. Bitmap'e dönüştür
magick enhanced.png -threshold 45% sketch.pbm
# 3. Vektörize et
potrace sketch.pbm -s -a 1.0 -t 3 -o sketch.svg
# 4. SVG optimize et
svgo sketch.svg -o sketch_opt.svg
# 5. PNG dışa aktar
inkscape sketch_opt.svg -o sketch_512.png -w 512
| Proje | Zorluk | Ana Araçlar | Ders Konusu |
|---|---|---|---|
| CLI Galeri | ⭐ | ImageMagick | Dosya Formatları |
| Retro Pixel Art | ⭐ | ImageMagick | 2D Grafik |
| Metadata Raporu | ⭐ | ExifTool | Dosya Formatları |
| GIF Kartpostal | ⭐⭐ | ImageMagick, gifski | Animasyon |
| Sprite Sheet | ⭐⭐ | ImageMagick, Python | 2D Grafik |
| Format Karşılaştırma | ⭐⭐ | Çoklu araç | Optimizasyon |
| Vektörizasyon | ⭐⭐ | Potrace, Inkscape, svgo | Raster/Vektör |
| AI Asset Pipeline | ⭐⭐⭐ | rembg, Real-ESRGAN | İleri Teknikler |
| Procedural Texture | ⭐⭐⭐ | ImageMagick, Python | 2D/3D Grafik |
# ═══ BOYUTLANDIRMA ═══
magick in.png -resize 800x600 out.png # Sabit boyut
magick in.png -resize 50% out.png # Yüzde ile
magick in.png -filter Point -resize 400% out.png # Pixel art büyütme
# ═══ FORMAT DÖNÜŞÜM ═══
magick in.png out.jpg # PNG → JPEG
magick in.png out.webp # PNG → WebP
cwebp -q 80 in.png -o out.webp # WebP (cwebp)
avifenc -q 30 in.png out.avif # AVIF
# ═══ GRİ TONLAMA & RENK ═══
magick in.png -colorspace Gray out.png # Gri tonlama
magick in.png -colors 16 out.png # Renk sınırla
magick in.png -sepia-tone 80% out.png # Sepya
# ═══ KIRPMA ═══
magick in.png -crop 300x200+50+50 out.png # Kırp
magick in.png -trim +repage out.png # Otomatik kırp
# ═══ GIF ═══
magick -delay 10 -loop 0 f_*.png anim.gif # GIF oluştur
gifski --fps 24 -o hq.gif frame_*.png # Yüksek kalite GIF
# ═══ VİDEO ═══
ffmpeg -i video.mp4 frame_%04d.png # Video → kareler
ffmpeg -framerate 24 -i f_%04d.png -c:v libx264 -pix_fmt yuv420p out.mp4
# ═══ SPRITE SHEET ═══
magick montage *.png -geometry 64x64+0+0 -tile 8x -background none sheet.png
# ═══ OPTİMİZASYON ═══
oxipng -o 4 --strip all image.png # PNG optimizasyon
pngquant --quality=65-80 image.png # PNG kayıplı sıkıştır
jpegoptim -m85 --strip-all image.jpg # JPEG optimizasyon
# ═══ ARKA PLAN KALDIRMA ═══
rembg i in.jpg out.png # AI arka plan kaldır
# ═══ METADATA ═══
exiftool photo.jpg # Metadata oku
exiftool -all= photo.jpg # Metadata sil
# ═══ VEKTÖRİZASYON ═══
magick in.png -threshold 50% pbm:- | potrace -s -o out.svg
# ═══ SVG ═══
inkscape in.svg -o out.png -w 512 # SVG → PNG
svgo in.svg -o optimized.svg # SVG optimize
# ═══ Ubuntu / Debian ═══
sudo apt install imagemagick ffmpeg libimage-exiftool-perl \
optipng pngquant jpegoptim potrace gimp inkscape \
graphicsmagick webp libavif-bin chafa timg
# ═══ macOS (Homebrew) ═══
brew install imagemagick ffmpeg exiftool \
optipng pngquant jpegoptim potrace graphicsmagick \
webp libavif chafa viu pastel timg gifski oxipng
brew install --cask gimp inkscape
# ═══ pip (Python) ═══
pip install rembg[cli] realesrgan Pillow
# ═══ cargo (Rust) ═══
cargo install oxipng gifski pastel viu svgcleaner
# ═══ npm (Node.js) ═══
npm install -g svgo sharp-cli