⌨️ EK BÖLÜM

CLI Araçları ile Bilgisayar Grafiği

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ı

🛠️ ImageMagick, FFmpeg, ExifTool
🐍 Python / Bash Otomasyon
🤖 AI CLI Araçları
📌 Bu Bölüm Hakkında

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.

1. Genel Bakış: Neden CLI Araçları? 🤔

💡 GUI vs CLI

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:

ImageMagick logo FFmpeg logo GIMP logo Inkscape logo

Bu derste kullanacağımız temel CLI araçlarının logoları

Popüler CLI Araçları

Araç Alan Dil Lisans
ImageMagickGörüntü işleme (her şey)CApache 2.0
FFmpegVideo / ses işlemeCLGPL/GPL
ExifToolMetadata okuma/yazmaPerlGPL
PotraceBitmap → VektörCGPL
OptiPNG / oxipngPNG optimizasyonC / Rustzlib / MIT
pngquantPNG kayıplı sıkıştırmaCGPL
gifskiYüksek kalite GIFRustAGPL
svgoSVG optimizasyonNode.jsMIT
rembgAI arka plan kaldırmaPythonMIT
Real-ESRGANAI süper çözünürlükPythonBSD

2. ImageMagick — İsviçre Çakısı 🔧

ImageMagick Logo

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.

💡 magick vs convert

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.

Kurulum

# Ubuntu / Debian
sudo apt install imagemagick

# macOS (Homebrew)
brew install imagemagick

# Windows (winget)
winget install ImageMagick.ImageMagick

# Doğrulama
magick --version

Boyutlandırma (Resize)

# 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 İçin Önemli

Pixel art büyütürken mutlaka -filter Point kullanın! Varsayılan bicubic filtre pikselleri bulanıklaştırır.

Kırpma ve Döndürme

# 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

Renk İşlemleri

# 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

Format Dönüşümü

# 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

Efekt ve Filtreler

# 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

GIF Animasyon Oluşturma

# 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

Sprite Sheet ve Montaj

💡 Sprite Sheet Nedir?

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.

Sprite sheet örneği

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

Toplu (Batch) İşlemler

# 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

İleri Düzey İşlemler

# 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 Güvenlik Notu

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.

3. FFmpeg — Video İşlemenin Kralı 🎬

FFmpeg Logo

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.

Kurulum

# Ubuntu / Debian
sudo apt install ffmpeg

# macOS
brew install ffmpeg

# Doğrulama
ffmpeg -version

Kare Çıkarma (Video → Görüntü)

# 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

Karelerden Video / GIF Oluşturma

# 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

Video Ölçekleme ve Efektler

# 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

Format Dönüşümü

# 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

ffprobe — Video Bilgisi

# 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

4. ExifTool — Metadata Uzmanı 📋

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.

Kurulum

# Ubuntu / Debian
sudo apt install libimage-exiftool-perl

# macOS
brew install exiftool

Metadata Okuma ve Yazma

# 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/
⚠️ Gizlilik Uyarısı

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.

5. Görüntü Optimizasyon Araçları ⚡

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
OptiPNGPNGKayıpsızPNG sıkıştırmayı optimize eder
oxipngPNGKayıpsızRust ile yazılmış, çok hızlı OptiPNG alternatifi
pngquantPNGKayıplı24-bit → 8-bit dönüşüm, %60-80 küçülme
jpegoptimJPEGKayıpsız/KayıplıJPEG optimizasyonu
mozjpegJPEGKayıplıMozilla'nın gelişmiş JPEG encoder'ı
gifskiGIFKayıplıEn yüksek kalite GIF encoder
cwebpWebPKayıplı/KayıpsızGoogle'ın WebP encoder'ı
avifencAVIFKayıplı/KayıpsızAVIF encoder (en modern format)

Kurulum

# 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

Kullanım Örnekleri

# 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 {} \;
💡 Format Seçim Rehberi

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ı)

6. Potrace — Bitmap'ten Vektöre 🖊️

Bitmap vs SVG karşılaştırması

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.

Kurulum

# Ubuntu / Debian
sudo apt install potrace

# macOS
brew install potrace

Kullanım

# 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
💡 El Çizimi → Vektör Pipeline

Kağıda çizdiğiniz bir karakteri vektöre dönüştürmek için: Fotoğraflamagick ile kontrastı artır → -threshold ile siyah-beyaza çevir → potrace ile vektörize et → svgo ile SVG'yi optimize et.

7. GIMP ve Inkscape CLI Modu 🖥️

GIMP logo Inkscape logo

GIMP ve Inkscape sadece GUI araçları değildir — komut satırından toplu işlem yapabilirsiniz.

GIMP Script-Fu ve Python-Fu

# 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)
'

Inkscape CLI

# 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"

8. Modern CLI Araçları 🚀

Terminalde Görüntü Görüntüleme

Terminalde çalışırken görüntüleri hızlıca önizlemek için:

Araç Dil Özellik
chafaCUnicode/sixel ile yüksek kalite terminal gösterimi
viuRustHızlı terminal görüntüleyici
catimgCBasit terminal görüntüleyici
timgC++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!

pastel — Renk Aracı 🎨

# 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"

SVG Optimizasyon

# 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

Modern Format Araçları

# 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

9. GraphicsMagick — Hızlı Alternatif 🏎️

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
ÖzellikImageMagickGraphicsMagick
HızOrtaGenellikle daha hızlı
Bellek kullanımıYüksekDaha düşük
Format desteği200+ format88+ format
Aktif geliştirmeÇok aktifKararlı, yavaş güncelleme
Yeni özelliklerSürekli ekleniyorKararlılığa odaklı

10. AI Destekli CLI Araçları 🤖

Yapay zeka ile güçlendirilmiş CLI araçları, daha önce elle yapılması gereken karmaşık işlemleri otomatikleştiriyor.

rembg — Arka Plan Kaldırma

# 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

Real-ESRGAN — AI Süper Çözünürlük

# 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')
"

Diğer AI Araçları

Araç İşlev GPU? Boyut
rembgArka plan kaldırmaHayır (CPU yeterli)~170 MB
Real-ESRGANSüper çözünürlük (4x büyütme)Önerilir~65 MB
waifu2xAnime/çizim büyütmeÖnerilir~20 MB
GFPGANYüz onarma / restorasyonuEvet~330 MB
Stable DiffusionGörüntü üretme (txt2img)Evet (>4GB VRAM)~4 GB
SAM (Meta)Otomatik segmentasyonEvet~2.5 GB
Depth AnythingDerinlik 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

11. Otomasyon ve Pipeline Oluşturma 🔄

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.

Sprite Sheet Pipeline (Bash)

💡 Pipeline Akışı

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

Toplu Asset Dönüştürme Pipeline

#!/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!"

Video → Sprite Sheet Pipeline

#!/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"

Otomatik İkon Seti Oluşturma

#!/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 ile Asset Pipeline

💡 Neden Makefile?

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)

Python ile Asset Pipeline

#!/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)

12. Pratik Proje Fikirleri 🎯

Başlangıç Seviyesi

⭐ CLI Görüntü Galerisi

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

⭐ Retro Pixel Art Filtre

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

⭐ Metadata Temizleyici ve Raporlayıcı

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/

Orta Seviye

⭐⭐ Animasyonlu GIF Kartpostal

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

⭐⭐ Format Karşılaştırma Raporu

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

İleri Seviye

⭐⭐⭐ AI Asset Pipeline

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.

⭐⭐⭐ Procedural Texture

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

⭐⭐⭐ El Çizimi → Vektör Pipeline

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-Araç Matrisi

Proje Zorluk Ana Araçlar Ders Konusu
CLI GaleriImageMagickDosya Formatları
Retro Pixel ArtImageMagick2D Grafik
Metadata RaporuExifToolDosya Formatları
GIF Kartpostal⭐⭐ImageMagick, gifskiAnimasyon
Sprite Sheet⭐⭐ImageMagick, Python2D Grafik
Format Karşılaştırma⭐⭐Çoklu araçOptimizasyon
Vektörizasyon⭐⭐Potrace, Inkscape, svgoRaster/Vektör
AI Asset Pipeline⭐⭐⭐rembg, Real-ESRGANİleri Teknikler
Procedural Texture⭐⭐⭐ImageMagick, Python2D/3D Grafik

13. Hızlı Referans Kartı 📌

En Sık Kullanılan Komutlar

# ═══ 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

Kurulum Komutları Özeti

# ═══ 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

14. Kaynaklar ve Bağlantılar 📚

📖 Resmi Dokümantasyonlar

🔧 Modern Araçlar (GitHub)

  • rembg — AI arka plan kaldırma
  • Real-ESRGAN — AI süper çözünürlük
  • gifski — Yüksek kalite GIF
  • pastel — Renk aracı
  • chafa — Terminal görüntüleyici
  • svgo — SVG optimizasyon