Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/noelyahan/mergi

go library for image programming (merge, crop, resize, watermark, animate, ease, transit)
https://github.com/noelyahan/mergi

animate crop easing gif golang image merge resize transition watermark

Last synced: about 1 month ago
JSON representation

go library for image programming (merge, crop, resize, watermark, animate, ease, transit)

Awesome Lists containing this project

README

        

![Mergi](./logo/logo.png)



Result | Terminal Code
-----------------------------------|------------------------------------------
![Intro](https://i.imgur.com/UmbQ5CJ.gif) | `mergi -t TT -i https://raw.githubusercontent.com/ashleymcnamara/gophers/master/Facepalm_Gopher.png -r "131 131" -i https://raw.githubusercontent.com/ashleymcnamara/gophers/master/Facepalm_Picard_Gopher.png -r "131 131" -a "sprite 50"`

[![Go Doc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://godoc.org/github.com/noelyahan/mergi)
[![Build Status](https://travis-ci.com/noelyahan/mergi.svg?branch=master)](https://travis-ci.com/noelyahan/mergi)
[![codecov](https://codecov.io/gh/noelyahan/mergi/branch/master/graph/badge.svg)](https://codecov.io/gh/noelyahan/mergi)
[![Go Report Card](https://goreportcard.com/badge/github.com/noelyahan/mergi)](https://goreportcard.com/report/github.com/noelyahan/mergi)
[![Teligram Chat](https://img.shields.io/badge/telegram-join%20chat-blue.svg)](https://t.me/joinchat/IzEQ3xEXCiRCh8L2q6pTLg)

## :tada: Basic Overview

Image manipulation [go library](http://godoc.org/github.com/noelyahan/mergi) plus [cross platform CLI tool](https://github.com/noelyahan/mergi/tree/master/cmd/mergi).

## ⚡ Features

- 🛠 Merge
- ✂️ Crop
- 💣 Resize
- 🖃 Watermark
- 💖 Animate
- 🔥 Easing
- 🦎 Transition


## 🚀 Getting started

### Install via `go get`

To install Mergi, use `go get`, or download the binary file from [Releases](https://github.com/noelyahan/mergi/releases) page.

```bash
$ go get github.com/noelyahan/mergi
```

Usage:

```
╔╦╗╔═╗╦═╗╔═╗╦
║║║║╣ ╠╦╝║ ╦║
╩ ╩╚═╝╩╚═╚═╝╩
let's go & make imaging fun
http://mergi.io
version 1.0.0

-a string
Enter animation type=[sprite, slide] and the delay to get mergi gif animation ex: smooth 10
-c value
Enter crop points and height and width ex: x y w h
-f string
Enter true if you want to process the final output
-i value
Enter images that want to merge ex: /path/img1 or url
-o string
Enter image outputs file ex: out.png or out.jpg (default "out.png")
-r value
Enter resize width and height of the output ex: 100 200
-t string
Enter a merge template string ex: TBTBTB (default "T")
-w value
Enter watermark image and points to place it, [-r w h] is optional ex: /path/img -r w h x y

```

#### 🛠 Merge

Image 1 | Image 2 | Result Image
-----------------------------------|-------------------------------------------|------------------------------------------
![dstImage](testdata/mergi_bg_1.png)|![srcImage](testdata/mergi_bg_2.png) | ![dstImage](testdata/doc/merge_tt.png)
![dstImage](testdata/mergi_bg_1.png)|![srcImage](testdata/mergi_bg_2.png) | ![dstImage](testdata/doc/merge_tb.png)

##### `Mergi Tool`
###### Horizontal
```bash
mergi \
-t TT \
-i testdata/mergi_bg_1.png \
-i testdata/mergi_bg_2.png
```

###### Vertical
```bash
mergi \
-t TB \
-i testdata/mergi_bg_1.png \
-i testdata/mergi_bg_2.png
```
##### `Mergi Library`
```go
image1, _ := mergi.Import(impexp.NewFileImporter("./testdata/mergi_bg_1.png"))
image2, _ := mergi.Import(impexp.NewFileImporter("./testdata/mergi_bg_2.png"))

horizontalImage, _ := mergi.Merge("TT", []image.Image{image1, image2})
mergi.Export(impexp.NewFileExporter(horizontalImage, "horizontal.png"))

verticalImage, _ := mergi.Merge("TB", []image.Image{image1, image2})
mergi.Export(impexp.NewFileExporter(verticalImage, "vertical.png"))
```


#### ✂️ Crop
Image | Result Image
-----------------------------------|------------------------------------------
![srcImage](testdata/mergi_bg_1.png) | ![dstImage](testdata/doc/crop.png)

##### `Mergi Tool`
```bash
mergi \
-i testdata/mergi_bg_1.png \
-c "10 40 200 110"
```

##### `Mergi Library`
```go
img, _ := mergi.Import(impexp.NewFileImporter("./testdata/mergi_bg_1.png"))
res, _ := mergi.Crop(img, image.Pt(10, 40), image.Pt(200, 110))
mergi.Export(impexp.NewFileExporter(res, "crop.png"))
```


#### 💣 Resize
Image | Result Image
-----------------------------------|-------------------------------------------
![srcImage](testdata/mergi_bg_1.png) | ![dstImage](testdata/doc/resize.png)

##### `Mergi Tool`
```bash
mergi \
-i testdata/mergi_bg_1.png \
-r "180 80"
```

##### `Mergi Library`
```go
img, _ := mergi.Import(impexp.NewFileImporter("./testdata/mergi_bg_1.png"))
res, _ := mergi.Resize(img, uint(180), uint(80))
mergi.Export(impexp.NewFileExporter(res, "resize.png"))
```


#### 🖃 Watermark
Image | Watermark Image | Result Image
-----------------------------------|-------------------------------------------|------------------------------------------
![srcImage](testdata/mergi_bg_1.png) | ![dstImage](testdata/mergi_logo_watermark_90x40.png) | ![dstImage](testdata/doc/watermark.png)

##### `Mergi Tool`
```bash
mergi \
-i testdata/mergi_bg_1.png \
-w "testdata/mergi_logo_watermark_90x40.png 250 10"
```

##### `Mergi Library`
```go
originalImage, _ := mergi.Import(impexp.NewFileImporter("./testdata/mergi_bg_1.png"))
watermarkImage, _ := mergi.Import(impexp.NewFileImporter("./testdata/glass-mergi_logo_watermark_90x40.jpg"))

res, _ := mergi.Watermark(watermarkImage, originalImage, image.Pt(250, 10))
mergi.Export(impexp.NewFileExporter(res, "watermark.png"))
```


#### 💖 Animate
Image 1 | Image 2 | Result Animation
-----------------------------------|-------------------------------------------|------------------------------------------
![srcImage](testdata/mergi_bg_1.png) | ![dstImage](testdata/mergi_bg_2.png) | ![dstImage](testdata/doc/sprite.gif)
![srcImage](testdata/mergi_bg_1.png) | ![dstImage](testdata/mergi_bg_2.png) | ![dstImage](testdata/doc/smooth.gif)

##### `Mergi Tool`
###### Sprite Animation
```bash
mergi \
-t "TT" \
-i testdata/mergi_bg_1.png \
-i testdata/mergi_bg_2.png \
-a "sprite 50"
```
###### Smooth Animation
```bash
mergi \
-t "TT" \
-i testdata/mergi_bg_1.png \
-i testdata/mergi_bg_2.png \
-a "smooth 5"
```

##### `Mergi Library`
```go
image1, _ := mergi.Import(impexp.NewFileImporter("./testdata/mergi_bg_1.png"))
image2, _ := mergi.Import(impexp.NewFileImporter("./testdata/mergi_bg_2.png"))

gif, _ := mergi.Animate([]image.Image{image1, image2}, 50)
mergi.Export(impexp.NewAnimationExporter(gif, "out.gif"))
```


#### 🔥 Easing

[]() | []() | []() | []()
-----------------------|----------------------|----------------------|----------------------
![dstImage](testdata/doc/ease/InBounce.gif)
InBounce | ![dstImage](testdata/doc/ease/InBack.gif)
InBack | ![dstImage](testdata/doc/ease/InOutQuad.gif)
InOutQuad | ![dstImage](testdata/doc/ease/InSine.gif)
InSine
![dstImage](testdata/doc/ease/InCubic.gif)
InCubic | ![dstImage](testdata/doc/ease/InElastic.gif)
InElastic | ![dstImage](testdata/doc/ease/InOutExpo.gif)
InOutExpo | ![dstImage](testdata/doc/ease/Linear.gif)
Linear
![dstImage](testdata/doc/ease/InOutBounce.gif)
InOutBounce | ![dstImage](testdata/doc/ease/InCirc.gif)
InCirc | ![dstImage](testdata/doc/ease/InOutCubic.gif)
InOutCubic | ![dstImage](testdata/doc/ease/InOutQuart.gif)
InOutQuart
![dstImage](testdata/doc/ease/InOutBack.gif)
InOutBack | ![dstImage](testdata/doc/ease/InCubic.gif)
InCubic | ![dstImage](testdata/doc/ease/InOutCirc.gif)
InOutCirc | ![dstImage](testdata/doc/ease/InOutSine.gif)
InOutSine
![dstImage](testdata/doc/ease/InExpo.gif)
InExpo | ![dstImage](testdata/doc/ease/OutBounce.gif)
OutBounce | ![dstImage](testdata/doc/ease/InQuint.gif)
InQuint

##### `Mergi Library`

`Note: Ease function can be applied with any function, in this example it's applied with Watermark function`
```go
// Load background and the square images
square, _ := mergi.Import(impexp.NewFileImporter("./testdata/square.jpg"))
bg, _ := mergi.Import(impexp.NewFileImporter("./testdata/white_bg.jpg"))

// Init images frames to add applied ease frames
frames := make([]image.Image, 0)

// Init the limts of the Ease
to := bg.Bounds().Max.X - square.Bounds().Max.X
posY := bg.Bounds().Max.Y/2 - square.Bounds().Max.Y/2
speed := 4

// Ease from 0 to width of background
for i := 0; i < to; i += speed {
// Apply Easeing function InBounce
posX := mergi.Ease(float64(i), 0, float64(to), mergi.InBounce)
img, _ := mergi.Watermark(square, bg, image.Pt(int(posX), posY))
frames = append(frames, img)
}

// For preview example, save as a gif
gif, _ := mergi.Animate(frames, 1)
mergi.Export(impexp.NewAnimationExporter(gif, "out.gif"))
```


#### 🦎 Transition

[]() | []() | []() | []()
-----------------------|----------------------|----------------------|----------------------
![dstImage](./testdata/doc/trans/SlideBar.gif)
SlideBar | ![dstImage](./testdata/doc/trans/Ink1.gif)
Ink1 | ![dstImage](./testdata/doc/trans/Ink2.gif)
Ink2 | ![dstImage](./testdata/doc/trans/Ink3.gif)
Ink3
![dstImage](./testdata/doc/trans/ScaleUpFastRect.gif)
ScaleUpFastRect | ![dstImage](./testdata/doc/trans/ScaleDownFastRect.gif)
ScaleDownFastRect | ![dstImage](./testdata/doc/trans/ScaleUpFastCircle.gif)
ScaleUpFastCircle | ![dstImage](./testdata/doc/trans/ScaleDownFastCircle.gif)
ScaleDownFastCircle

Learn more [examples](examples)

## 💻 Contribute

- Clone the repository
```bash
$ go get github.com/noelyahan/mergi
```
- Run unit tests
- Fix bug
- Add new feature
- Push


### 🌠 Contributors

| [
Noel](https://twitter.com/noelyahan)
💻 📖 💬 👀 🤔 🎨 |
| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |


This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification.
Contributions of any kind are welcome!


## Star History

[![Star History Chart](https://api.star-history.com/svg?repos=noelyahan/mergi&type=Timeline)](https://star-history.com/#noelyahan/mergi&Timeline)

### 🔵 License

This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details