diff --git a/pkg/images/imgconv/default_format.go b/pkg/images/imgconv/default_format.go
index d57a97020ec815d19471cfffa6125c1db6acb166..e8e5bd27458994ae7d742689b347a8ad559f126c 100644
--- a/pkg/images/imgconv/default_format.go
+++ b/pkg/images/imgconv/default_format.go
@@ -12,17 +12,17 @@ import (
 )
 
 const (
-	JPEG = "jpeg"
-	PNG  = "png"
-	GIF  = "gif"
-	TIFF = "tiff"
-	BMP  = "bmp"
+	JPEG Format = "jpeg"
+	PNG  Format = "png"
+	GIF  Format = "gif"
+	TIFF Format = "tiff"
+	BMP  Format = "bmp"
 )
 
 func init() {
-	RegisterFormatEncoder(JPEG, func(w io.Writer, img image.Image) error { return jpeg.Encode(w, img, nil) })
-	RegisterFormatEncoder(PNG, func(w io.Writer, img image.Image) error { return png.Encode(w, img) })
+	RegisterFormatEncoder(JPEG, func(w io.Writer, img image.Image) error { return jpeg.Encode(w, img, nil) }, "jpg", "jpeg")
+	RegisterFormatEncoder(PNG, png.Encode, "png")
 	RegisterFormatEncoder(GIF, func(w io.Writer, img image.Image) error { return gif.Encode(w, img, nil) })
 	RegisterFormatEncoder(TIFF, func(w io.Writer, img image.Image) error { return tiff.Encode(w, img, nil) })
-	RegisterFormatEncoder(BMP, func(w io.Writer, img image.Image) error { return bmp.Encode(w, img) })
+	RegisterFormatEncoder(BMP, bmp.Encode)
 }
diff --git a/pkg/images/imgconv/imgconv.go b/pkg/images/imgconv/imgconv.go
index 9f00fcb8676bffeda1fc9de3883adf4b806c1fba..7944a619ca98bf10c77eb9b7a444984a194638fe 100644
--- a/pkg/images/imgconv/imgconv.go
+++ b/pkg/images/imgconv/imgconv.go
@@ -9,20 +9,24 @@ import (
 	"git.perx.ru/perxis/perxis-go/pkg/errors"
 )
 
-var builtinFormats = map[string]string{
-	"jpg": "jpeg",
-	"tif": "tiff",
-}
-
-var defaultFormatEncoderRegistry = make(map[string]EncodeFunc)
+type (
+	EncodeFunc func(w io.Writer, img image.Image) error
+	Format     string
+)
 
-type EncodeFunc func(w io.Writer, img image.Image) error
+var (
+	defaultFormatEncoderRegistry = make(map[Format]EncodeFunc)
+	formatExtensions             = make(map[string]Format)
+)
 
-func RegisterFormatEncoder(format string, fn EncodeFunc) {
+func RegisterFormatEncoder(format Format, fn EncodeFunc, extensions ...string) {
 	defaultFormatEncoderRegistry[format] = fn
+	for _, ext := range extensions {
+		formatExtensions[strings.TrimPrefix(strings.ToLower(ext), ".")] = format
+	}
 }
 
-func Encode(w io.Writer, format string, img image.Image) error {
+func Encode(w io.Writer, format Format, img image.Image) error {
 	encoder, ok := defaultFormatEncoderRegistry[format]
 	if !ok {
 		return errors.Errorf("unknown format: %s", format)
@@ -55,11 +59,19 @@ func Open(filename string) (image.Image, string, error) {
 	return img, ext, nil
 }
 
-func NormalizeFormat(format string) string {
-	format = strings.ToLower(format)
-	format = strings.TrimPrefix(format, ".")
-	if v, ok := builtinFormats[format]; ok {
-		return v
+func FormatFromExtension(ext string) (Format, error) {
+	ext = strings.TrimPrefix(strings.ToLower(ext), ".")
+	if f, ok := formatExtensions[ext]; ok {
+		return f, nil
 	}
-	return format
+	return "", errors.Errorf("unsupported format")
 }
+
+//func NormalizeFormat(format string) string {
+//	format = strings.ToLower(format)
+//	format = strings.TrimPrefix(format, ".")
+//	//if v, ok := builtinFormats[format]; ok {
+//	//	return v
+//	//}
+//	return format
+//}
diff --git a/pkg/images/imgconv/webp.go b/pkg/images/imgconv/webp.go
index 0358d9ca76240229ac274e3e5751e332dd378127..f5f42e0454e913faf98f68f19914da8a4f40e8ad 100644
--- a/pkg/images/imgconv/webp.go
+++ b/pkg/images/imgconv/webp.go
@@ -15,7 +15,7 @@ import (
 )
 
 const (
-	WEBP = "webp"
+	WEBP Format = "webp"
 )
 
 func init() {