Image Library lets you manage images and videos by associating tags to them. This is a full re-implementation of my Python-based application.
Main features:
- Image and video file tagging
- Tagged files searching with a simple querying language
- Replace/move files while keeping all associated tags
- Manage tags (create, remove, organize with types)
- Tag completion in queries and tags editor
- Apply pattern-based transformations to file paths and tags
- List similar images (hash-based); not available for video files
- Fully translated interface, available in English, French, and Esperanto
Simply drop the .jar
file where you want the application to run from.
Replace the old .jar
file by the new one. The database will be updated automatically the next time the app is
launched.
Note: video files are not playable from the application itself, only their first frame is displayed.
Go through the File menu and click on Add Files to add files or Add Directory to import all valid files from a directory; or you can simply drag-and-drop files and directories into the main window.
You should see a dialog window with a preview of an image and a text area. This text area is where you have to type the tags for the displayed image. Once you’re done, click on Next to go to the next file or Finish to finish. You can click on Skip to skip the current file and go directly to the next one.
While editing tags, you can choose where to move the current file by clicking on Move to…; the path is then displayed below the button.
If the application found similar images already registered, a button labelled Show similar images… will be available above the text area. It will show a list of similar images, ordered by decreasing estimated similarity. You can select one of these images and copy its tags by clicking on the button above the tags list (Warning: it will replace all tags in the text box).
You can search for files by typing queries in the search field.
Tag names can contain any Unicode letters and digits, as well as underscores _
.
a
will match files with taga
a b
will match files with both tagsa
andb
a + b
will match files with tagsa
orb
or both-a
will match files without taga
- Parentheses
(
and)
can be used to group query elements
Flags are special tags that represent a specific file property.
#<name>
Where <name>
is the flag’s name.
Name | Description |
---|---|
no_tags |
Match files that have no attached tags |
no_file |
Match entries whose file is missing |
no_hash |
Match images whose hash could not be computed |
video |
Match files that are videos based on their extension |
#no_file a b
This will match all entries whose file is missing that have both tags a
and b
.
#no_file #no_tags
This will match all images whose file is missing and that have no tags.
There exist special tags called pseudo-tags. Their syntax is as follows:
<name>=<flags><value>
Where <name>
is the pseudo-tag’s name, <value>
is its value, and <flags>
are optional flags that modify how the
value is interpreted.
This value may be one of two types:
- A string, delimited by double quotes
"
(e.g.:"this is text"
), to specify a plain text value. String values may support some special placeholder tags:?
to match 0 or 1 character,*
to match 0 or more characters. For instance,"a*b"
will match any text starting with ana
and ending with ab
with any character in-between. You can disable them by putting a\
before (e.g.:\*
will match the character*
literally). You also have to escape all single\
by doubling them:\\
. Double quotes must be escaped as well. - A RegEx, delimited by slashes
/
(e.g.:/this is a RegEx/
). RegExs use the Java Pattern syntax. Note that you have to escape all/
too, as this is the delimiter.
Both types support flags. Flags are specified before the value, without any spaces in-between (e.g. i/regex/
and i"text"
).
Available flags are:
s
to force case-sensitive matchingi
to force case-insensitive matching
The default case-sensitivity depends on the app’s configuration.
Full syntax examples:
ext=i"jp?g"
matches all files whose extension is eitherjpg
orjpeg
, regardless of case.name=s/illustration_\d+/
matches all files whose name contains the stringillustration_
followed by a one or more digits (e.g.:illustration_1
orillustration_22_background
).ext="png"
matches all files whose extension ispng
, using the application’s default case-sensitivity.
Name | Supports string placeholders | Supports RegEx values | Description |
---|---|---|---|
ext |
Yes | Yes | Match files based on their extension (without the dot) |
name |
Yes | Yes | Match files based on their name, including extension |
path |
Yes | Yes | Match files based on their full path |
similar_to |
No | No | Match images that are similar to the specified one |
path="/home/user/images/summer?.png
This will match images with paths like /home/user/images/summer.png
, /home/user/images/summer1.png
,
/home/user/images/summers.png
, etc.
similar_to="/home/user/images/house.png"
This will match all images that are similar to /home/user/images/house.png
(if it is registered in the database).
a (b + c) + -(d + e) ext=i"jp?g"
Here’s how to interpret it:
a (b + c)
returns the set of files with both tagsa
andb
and/or both tagsa
andc
.-(d + e) ext=i"jp?g"
=-d -e ext=i"jp?g"
returns the set of JPG images without tagsd
nore
; note the?
to match bothjpg
andjpeg
extensions, and thei
flag to disregard case.
The result is the union of both file sets.
The application supports tag definitions, i.e. tags defined from tag queries (e.g.: tag animal
could be defined
as cat + dog + bird
). You cannot tag files directly with tags that have a definition, they exist only for querying
purposes.
The following configurations can be modified in the settings.ini
file. If the file does not exist, launch the
application at least once to create it.
- Section
[App]
:database_file
: path to database file; can be absolute, or relative to the app’s root directorylanguage
: language code of app’s interface; can be eitheren
for English,fr
for French, oreo
for Esperantotheme
: the theme to apply; can be eitherlight
ordark
- Section
[Queries]
:case_sensitive_by_default
(boolean): specifies whether pseudo-tags matches should be case sensitive by defaultsyntax_highlighting
(boolean): specifies whether tag queries syntax highlighting should be activated
- Section
[Slideshow]
:delay
(integer): the delay in seconds between each slideshow imageshuffle
(boolean): specifies whether slideshow images should be shuffled
If you encounter a bug or the app crashed, check the error log located in the logs
directory where you put the
application’s JAR file and see if there’s an error.
You can send me a message or open an issue with the error and a description of how you got this error, that would be
really appreciated!
Soon…
- Java 17 or later (untested on Java 18+)
- Damia Vergnet @Darmo117