Bash
go run main.go -w 800 -h 600 -gray
Uruchomienie skompilowanego pliku .exe:
DOS
main.exe -w 1280 -h 720
- package main
- import (
- "flag"
- "image"
- "image/color"
- "image/jpeg"
- "log"
- "math"
- "os"
- "path/filepath"
- )
- func bilinear(src image.Image, x, y float64) color.RGBA {
- x0 := int(math.Floor(x))
- y0 := int(math.Floor(y))
- x1 := x0 + 1
- y1 := y0 + 1
- c00 := src.At(x0, y0)
- c10 := src.At(x1, y0)
- c01 := src.At(x0, y1)
- c11 := src.At(x1, y1)
- dx := x - float64(x0)
- dy := y - float64(y0)
- r00, g00, b00, a00 := c00.RGBA()
- r10, g10, b10, a10 := c10.RGBA()
- r01, g01, b01, a01 := c01.RGBA()
- r11, g11, b11, a11 := c11.RGBA()
- r0 := float64(r00)*(1-dx) + float64(r10)*dx
- g0 := float64(g00)*(1-dx) + float64(g10)*dx
- b0 := float64(b00)*(1-dx) + float64(b10)*dx
- a0 := float64(a00)*(1-dx) + float64(a10)*dx
- r1 := float64(r01)*(1-dx) + float64(r11)*dx
- g1 := float64(g01)*(1-dx) + float64(g11)*dx
- b1 := float64(b01)*(1-dx) + float64(b11)*dx
- a1 := float64(a01)*(1-dx) + float64(a11)*dx
- r := r0*(1-dy) + r1*dy
- g := g0*(1-dy) + g1*dy
- b := b0*(1-dy) + b1*dy
- a := a0*(1-dy) + a1*dy
- // RGBA() zwraca 0–65535, więc dzielimy przez 257, żeby mieć 0–255
- return color.RGBA{
- uint8(r / 257.0),
- uint8(g / 257.0),
- uint8(b / 257.0),
- uint8(a / 257.0),
- }
- }
- func processImage(path string, outDir string, width, height int, grayscale bool) error {
- inFile, err := os.Open(path)
- if err != nil {
- return err
- }
- defer inFile.Close()
- srcImg, err := jpeg.Decode(inFile)
- if err != nil {
- return err
- }
- dst := image.NewRGBA(image.Rect(0, 0, width, height))
- srcW := srcImg.Bounds().Dx()
- srcH := srcImg.Bounds().Dy()
- scaleX := float64(srcW) / float64(width)
- scaleY := float64(srcH) / float64(height)
- for y := 0; y < height; y++ {
- sy := float64(y) * scaleY
- for x := 0; x < width; x++ {
- sx := float64(x) * scaleX
- c := bilinear(srcImg, sx, sy)
- if grayscale {
- r := float64(c.R)
- g := float64(c.G)
- b := float64(c.B)
- gray := uint8(0.299*r + 0.587*g + 0.114*b)
- c = color.RGBA{gray, gray, gray, c.A}
- }
- dst.Set(x, y, c)
- }
- }
- outPath := filepath.Join(outDir, filepath.Base(path))
- outFile, err := os.Create(outPath)
- if err != nil {
- return err
- }
- defer outFile.Close()
- return jpeg.Encode(outFile, dst, &jpeg.Options{Quality: 95})
- }
- func main() {
- width := flag.Int("w", 1920, "docelowa szerokość (Full HD)")
- height := flag.Int("h", 1080, "docelowa wysokość (Full HD)")
- grayscale := flag.Bool("gray", false, "czy zastosować grayscale")
- flag.Parse()
- inDir := "jpg"// Stworzyc ikone "jpg" i tam skopiowac fotki.jpg // Jak zrobisz "bin" Tam skopiowac ikony "jpg" oraz "wynik"
- outDir := "wynik"// Sam stworzy ikone "wynik" Przy nacisnieciu "Go Run" // Przy nacisnieciu "Go BUILD" zrobisz "exe"
- os.MkdirAll(outDir, 0755)
- err := filepath.Walk(inDir, func(path string, info os.FileInfo, err error) error {
- if err != nil {
- return err
- }
- if !info.IsDir() && filepath.Ext(path) == ".jpg" {
- log.Println("Przetwarzam:", path)
- if err := processImage(path, outDir, *width, *height, *grayscale); err != nil {
- log.Println("Błąd:", err)
- }
- }
- return nil
- })
- if err != nil {
- log.Fatal(err)
- }
- log.Println("Zakończono obróbkę zdjęć.")
- }