Skip to content

Releases: bluescan/tacentview

Pixel Formats and PowerVR

02 Jan 11:26
Compare
Choose a tag to compare

Overview

This release features experimental support for PowerVR (PVR) files, output filename formatting using the CLI, support for more pixel formats including some exotic ones, UI improvements like better control over visibility of on-screen buttons, consistent display of long filenames, and tweaks to the preferences and levels dialog windows.

PVR support uses a custom parser similar to the current DDS and KTX parsers. It is capable of opening and reading PVR V1 V2 and the latest V3 files. All BC, ETC, EAC, and ASTC pixel formats are supported. PVRTC1 at 4 BPP and 2 BPP is supported. Most packed formats (adjacent RGBA bits in some defined order) are supported including HDR floating point formats, shared-exponent E5R9G9B9uf, and B10G11R11uf. The screenshot below shows Tacent View with a R8G8B8M8 PVR3 file. The max-range was saved as 8 so the value set in the UI is causing under-exposure.

Screenshot_2024-01-01-17-29-10_R8G8B8M8

Cubemap, mipmap, and PVR files with orientation meta-data are supported. The PVR feature overall is still considered experimental because PVRTC2 (not to be confused with PVRTC1 at 2bpp), the YUV formats, and volume textures are not supported yet.

The newly added pixel-formats include RGBM, RGBD, ERGB999, RGB111110, PVR4BPP, PVR2BPP, and any previously missing 16 and 32-bit-per-component integral R, RG, RGB, and RGBA formats. DDS and KTX containers leverage the new pixel-formats if possible.

In addition to PVR support, improvements to the UI have been made including Cyrillic glyphs, better display of filenames in the thumbnail view (by using ellipsis for long names), and fixes to popup windows at various UI sizes. The details panel displays channel-type information (UNORM, SNORM, UINT, SINT, SFLOAT, UFLOAT) and, if present, the alpha-channel mode. The levels modal updates the mid-point value live when in auto-mid-point mode.

Most of the upgrades in this release (PVR support, additional pixel-formats, detection of channel-type/alpha-mode, etc) are inherited from the Tacent base libraries -- for this reason relevant changes made to Tacent are listed in addition to the summary for Tacent View.

Summary of Changes

  • Support for PVR V1,V2, and V3 files. PVR properties popup supports gamma-correction, exposure for HDR images, and spread-luminance.
  • PVR3 meta-data orientation loading. The new preferences option is enabled by default. Updated test suite images for PVR3 to include BC test images and images with orientation meta-data set (horizontal and vertical).
  • Combined meta-data re-orient loading option for jpg (EXIF) and pvr files into a single option. No need for them to be separate. The latest Tacent libs support EAC, ETC1/2, ASTC, BC, PVR1BPP4, PVR1BPP2, shared-exponent, short float, RGBM, and RGBD pixel formats. Added relevant pvr test images.
  • PVR properties now allow alternate mipmap and cubemap display (T-layout).
  • Details panel now shows both alpha-mode and channel-type if the current image supplies this information. Added tooltip text for both new fields. Moved tooltip for colour-profile to the Colour Profile field instead of the title field.
  • Refresh whole directory with Shift-F5 or Ctrl-F5. Remappable.
  • Better names for tabs in the preferences window. Added hide-on-screen-controls to interface tab. By default Basic and Kiosk profiles hide the on-screen controls. On-screen controls may be set to always, never, or auto.
  • CLI now supports simple filename manipulation including prefix, suffix, and string replace. The relevant command is --outname and examples have been added to the website along with help text (-h) to describe the syntax for the option.
  • Cleaned up more of the UI modals and made their title-bar style/sizing consistent.
  • Font glyph range now includes Cyrillic and the ellipsis Unicode code-point. Added a crop-string function to reduce a string to a specified render width based on the current font and scale.
  • Fixed the delete-file and delete-file-permanently modals to support wider paths and printing of ellipsis when they are too long. In these cases hovering over the path will display the whole thing.
  • Thumbnail view now uses the string-crop render-width function to produce consistently sized filenames. If too long to fit the whole thing, an ellipsis is used.
  • Tacent pixel-format names now match the in-memory footprint.
  • Include modification time in the hash computation that determines if something changed when focus is regained.
  • Fix overwrite-file and overwrite-multiple-files dialogs so that paths and filenames do not over-extend the dialog window beyond the right button. Uses the text-cropping functionality that may add an ellipsis if necessary.
  • Levels Window. PowerMidGamma, AutoMidPoint, and LogarithmicHisto are now saved to config and persist between runs. When AutoMidPoint is on: a) the mid-point slider now remains visible, b) the mid-point slider can continue to be used for manual adjustments and is only 'auto-set' when the black or white points are adjusted, and c) will 'push' the extents of the black and white points when adjusted. In non-auto mode, the midpoint is constrained to the black/white points and will not affect them.
  • If ellipsis displayed for overwrite files you can now hover to see the full file name or directory path.

Full Changelog: v1.0.42...v1.0.43

Relevant Tacent Library Changes

This release introduces experimental support for loading and decoding PowerVR images, extends pixel-format support for image container formats (DDS, KTX, and PVR), adds new packed floating-point classes, improves the drive-information API (especially for removeable media), updates the PNG loading library, and allows saving/loading of image meta-data to disk. Any bugs and improvements listed below have been automatically inherited by Tacent View.

Features

  • Saving and loading of image tMetaData to/from tChunk binary format.
  • Meta-data focal length is in mm.
  • Updated libpng from 1.6.37 to 1.6.40.
  • Detection of JPG/JFIF content inside a PNG file. Some phone software generates these 'invalid' images and now they will load.
  • Better handling of corrupt tga files that used to cause a buffer overrun. We now check that we're in bounds.
  • PVR supprt for V1, V2, and V3 files.
  • Consistent naming of all pixel-formats.
  • Introduced satellite information for channel-type (UNORM, SNORM, UINT, UFLOAT, etc).
  • Packed small-float classes. F11F11F10 and F10F11F11 are 32-bit packed formats supporting 2xE5M6 and 1xE5M5 floats (no sign bit). M9M9M9E5 and E5M9M9M9 are 32-bit packed formats supporting 3xE5M9 (3xF14) but with a shared 5-bit exponent and no sign bit. Because of the shared exponent this format does not used normalized mantissa (always denorm).
  • Support for exotic pixel-formats including PVRBPP2, PVRBPP4, R11G11B10uf, E5R9G9B9uf, R8G8B8M8, R8G8B8D8 plus integral types R16, R16G16, R16G16B16, R16G16B16A16 and their 32-bit-per-component counterparts. Where supported these formats may be contained by DDS, KTX, KTX2, and PVR (V1, V2, V3) files.

Improvements and Fixes

  • Unit test for saving and loading meta-data to a tChunk file. Added operator== and != for both tMetaDatum and tMetaData.
  • Deborder picture function now returns false if there is no change.
  • Consistent use of load params across all image loaders that need them. JPG and PNG now have params instead if just a set of flags.
  • The naming for the PVRTC pixel formats is finalized so they are unambiguous. For version 1: "PVRBPP4", "PVRBPP2", "PVRHDRBPP8", and "PVRHDRBPP6". For version 2: "PVR2BPP4", "PVR2BPP2", "PVR2HDRBPP8", and "PVR2HDRBPP6". Updated the remaining pixel-format query functions and added a tIsLDRFormat in addition to tIsHRDFormat. Note that for the ".pvr" container format (as opposed to the pixel format) it comes in 3 versions (V1 V2 V3) but all use the same "pvr" extension.
  • Fixed issue where tGetDriveInfo was not filling out the drive letter correctly.
  • The state of tImageDDS and specifically the IsValid call could give bad results if a file load wasn't attempted. The Results bitfield is now a more general current State and the IsValid works for all cases. The fix has been propagated to tImageKTX and tImagePVR.
  • If possible, the DDS loader will now set the channel-type - modern dds pixel formats allow it to be determined in some cases.
  • Channel-type determined for VK packed formats in KTX2 files.
  • ICO files always considered to be in sRGB colour profile.
  • Now handle both unsigned and signed versions for BC4 and BC5. These new ATI1 and ATI2 variants are supported in dds, ktx, ktx2, and pvr files. All BC formats exportable by PVRTexTool are now loadable.

Full Tacent Changelog: bluescan/tacent@v0.8.16...v0.8.17

High DPI

01 Oct 10:12
Compare
Choose a tag to compare

Overview

This release features numerous usability updates. The most significant improvement is support for high-resolution screens by reading the OS desktop manager scale setting. This allows 4K monitors to be used without eye-strain due to tiny text. The smallest UI size setting, called nano, is still present and represents about a 75% OS scale -- for those that value screen real estate and have perfect vision. The screenshot shows the font and widget sizes at an OS scale of 250%. It's a little hard to tell because the image is presented downscaled from 2255x1505.

image

Additional usability improvements include the ability to change drives using only the navigation bar (previously you needed to use the file-open dialog), display of the image file name in the nav-bar while in fullscreen mode (the window title bar is not visible in fullscreen, so it couldn't be seen at all), general cleanup of widget alignment/size for many of the dialogs, and the ability to print reference usage examples from the command-line.

Summary of Changes

  • Fixed TAB characters interfering with CLI help-text display.
  • Saving a TGA allows you to override the bits-per-pixel. Normally it is set to auto (decide based on image opacity) but now you can override it forcing 24 or 32 bpp.
  • All CLI examples available from the command-line. Optional argument to generate markup-ready formatting of all examples.
  • Fixed some example descriptions including the contact-sheet description.
  • 8 UI sizes implemented each using their own area of the font atlas. The sizes are called: nano, tiny, small, moderate, medium, large, huge, and massive. The auto setting will automatically determine the correct size based on the OS scale setting. If the scale is adjusted, the viewer will automatically readjust when it gains focus. This works for both Linux and Windows.
  • Separated the output log from the bottom nav-bar. It didn't belong there. The output log is now a separate popup.
  • All dialogs, menus, overlays, and popups cleaned up and support the new UI sizes. This included cleanup of the crop popup and the contact-sheet modal, both of which needed it.
  • Updating the UI size using Shift+/- (or whatever you have bound those operations to) will kick it out of auto mode.
  • Startup speed optimization by loading only the single current font-size. Subsequent UI size modifications during the session will cause the other font atlases to be loaded.
  • Nav-bar now supports changing to a different drive letter on Windows. The '/' directory is considered the parent of all logical drives.
  • Fixed an issue where the nav-bar sub-directory combo would display an unneeded scrollbar at some UI sizes.
  • Both nav-bar and file dialog no longer display drives on Windows that are not ready. This matches Windows Explorer behaviour.
  • In fullscreen mode the current image file name is displayed in the nav-bar on the right since the window title-bar is not visible. There is a display preferences option to display it all the time.

Full Changelog: v1.0.41...v1.0.42

Sort and Shuffle

19 Aug 14:13
Compare
Choose a tag to compare

Overview

This release featuress sorting images by meta-data, shuffle mode for slideshows, fill-colour for contact-sheet generation, numerous command-line improvements including exposure controls for HDR images, and a new kiosk profile.

Sorting by Meta-Data

There are many new sorting options. The sorting keys with an asterisk denote they are stored in image meta-data (JPG EXIF for example). The last item in the dropdown is shuffle which will present the images randomly sorted. To open the thumbnail view where these properties are set, just press the 'T' key. Like all key bindings, it may be modifed from this default.
image

Slideshow and Kiosk

The slideshow settings now include the ability to auto-start, set the sort order directly, and auto-reshuffle.
image
The three different profiles (main, basic, and kiosk) are accessed using Alt-1, Alt-2, and Alt-3. These shortcuts can be re-assigned if desired. The default settings for kiosk profile include being in fullscreen mode with a shuffle slideshow auto-started for you. You may launch Tacent View from the command-line in any profile by calling tacentview --profile name. To launch in the the kiosk profile that would simply be tacentview --profile kiosk.

Contact Sheet Fill

This image shows the contact-sheet (flipbook) parameters dialog. Note that only if there are more page slots than input images does the fill-colour option present itself.
image

Command Line Improvements

Specifying multiple image types for both the input and output is now possible. For example, to convert PKM and JPG images to PNG and BMP:

tacentview -c --in pkm -i jpg -o png --out bmp

This may be written more concisely with comma-separated lists:

tacentview -c -i pkm,jpg -o png,bmp

Output parameters can also be specified more concisely than before. Here is an example that specifies output parameters for GIF files. It takes in a manifest list for what files and directories to process:

tacentview -c @manifest.txt --out gif --outGIF bpp=2,qan=neu,alp=120

The --outGIF is optional and specifies any non-default parameters for creating the GIFs. In this case a 2-bit (4 colour) palette is used, the neu algorithm is used for colour quantization, and the transparency threshold is 120. There are more options for GIF output not shown here including things like loop behaviour, frame duration, etc.

Many image formats have additional load parameters that may be specified. Here we adjust EXR exposure while loading.

tacentview -c --inEXR gamma=1.8,expo=3.5

This specifies a gamma-correction of 1.8 (default is 2.2) and an exposure value of 3.5. Exposure ranges from -10.0 to 10.0 with the neutral default being 1.0. For EXR files additional load parameters, not shown here, include defogging (defog), and adjusting knee values (white and middle points) using knee-low (knelo), and knee-high (knehi).

Extensive information on using Tacent View from the command line is available here: https://bluescan.github.io/tacentview/cli.html

Summary of Changes

  • Image meta-data (EXIF), if present, is now stored cached along with the thumbnail/preview data.
  • Images may be sorted by meta-data. Sorting keys include: latitude, longitude, altitude, roll, pitch, yaw, speed, shutter speed, exposure time, F-Stop, ISO, aperture, orientation, brightness, flash, focal length, time photo taken, time photo modified, camera make/model, and description.
  • Random shuffle for slideshow with option to automatically reshuffle after every loop.
  • The thumbnail-view was inconsistently called "Content View" in some modules. It is now consistently knows as "Thumbnail View". The default key-binding is now the 'T' key. Tile has been moved to 'Ctrl-T'.
  • Some png files in the wild actually contain JPG/JFIF data inside. If strict loading is off (the default) these files will now load in Tacent View. If strict is enabled, they won't.
  • CLI mode now allows load parameters to be set for any image type that supports them. This allows things like exposure control from the CLI. For example, loading an ASTC image allows colour profile, gamma-correction mode, gamma, and exposure/tone to be set. EXR load parameters incude gamma, exposure, defog, knee-low, and knee-high. Other image types with load parameters include KTX, KTX2, DDS, JPG, and HDR (Radiance) files.
  • Respect early-exit for CLI post operations.
  • Fix CLI issue with GIF palette size specification.
  • Reworked how output paramaters are specified in the CLI. The newer syntax a) matches in the input param syntax, and b) allows only those parameters you want to override to be set. This was an issue before for types like GIF that have a lot of options.
  • A corrupt tga file that doesn't contain enough content for the header and image data could cause an exception. We now check that we're not reading beyond what is loaded for both the header and the data.
  • Added a new kiosk profile. There are now 3 profiles: main, basic, and kiosk. They can all be used any way you like -- the difference between them is the default settings. For the kiosk profile it starts in shuffle mode, auto slideshow-play is on, and auto-reshuffle is on.
  • Fullscreen mode used to be a global setting. It is now a per-profile setting. By default the kiosk profile has this set to true. Other profiles (main, basic) have this set to false.
  • Added a command-line parameter to allow setting the profile. This is one of the few CLI options that affect GUI mode.
  • Fixed crash when changing profiles and in a directory that has no images in it.
  • If play pressed and you're on the last image and not looping, start at the beginning again.
  • CLI mode allows you to specify multiple output image types instead of just one. This works for normal operations as well as post-operations.
  • Support empty-page fill colour when generating a contact sheet from the command line.
  • Contact sheet generator dialog now supports user-specified fill colour for empty pages. The colour-picker only shows up if the number of pages is bigger than the number of available images. The fill colour for contact sheets has a separate entry in the config since it has a different default (transparent black). Elsewhere (rotate, resize-canvas, etc) the fill defaults to opaque black.
  • Update LibPNG to 1.6.40
  • Lots of CLI examples added to official Tacent View website.

Full Changelog: v1.0.40...v1.0.41

Post Operations

01 Jul 23:15
Compare
Choose a tag to compare

Overview

A number of operations previously only available from the GUI are available from the command line for pipeline integration or batch processing operations. This brings parity between what can be done in the GUI versus what can be done using the CLI. Specifically, combining multiple images into a single animated image and generating contact-sheets may now both be performed from the CLI. Furthermore, high-quality image quantization is now available in the GUI from the Edit menu. Previously quantization was only an option when saving palettized image formats or from the CLI.

Quantization

Image quantization (determining a reduced colour-palette) is now available for any image rather than just as a parameter when saving GIF files. The quantize operation is available from the Edit menu. In the image below there are only 16 colours being used! The quantization in this case uses the slower Scolourq algorithm with dithering turned on. The faster Wu Bipartition algorithm also yields excellent results even without dithering.

image

Post Operations

Post operations are specified in the CLI using --po opname[arg1,arg2,...]
These are operations that take more than a single image as input and are separated out into a different pass for efficiency. The post-op pass still uses the same set of input images and it runs after all normal operations have completed. If a regular operation modifies any of the input files, the modified file(s) are used as input to the post operation. If a normal operation generates a new file not included in the inputs, the new file is not used by the post operation.

Combine

--po combine[]
Combines multiple input images into a single animated image. The output file type must support animation or be able to store multiple sub-images / pages. Details on using this command are available by passing --help as the command-line parameter.

Contact

--po contact[]
Creates a single contact sheet image (AKA flipbook) from multiple input images. You may specify the number of columns and rows or let the operation determine it automatically for you based on the number of input images. Creating contact-sheets using Tacent View handles transpareny properly. By default if an imput image has transparency, so will the contact sheet. Details on using this command are available by passing --help as the command-line parameter.

Normal Operations

Normal operations run sequentially on each input image and are specified using --op opname[arg1,arg2,...]
One additional normal operation has been added in this release to again bring parity between the CLI features and the GUI features.

Pixel

-op pixel[]
Sets the pixel at (x,y) to the colour supplied. You may specify specific channels to affect as well as offsets from the right and top edges if the input images have different sizes. Details on using this command are available by passing --help as the command-line parameter.

Summary of Changes

  • Quantize an image directly from the GUI. Quantize is available from the edit menu. The UI for the different quantize methods and parameters is now shared between the quantize modal dialog and the save GIF modal.
  • Create contact sheets from the command line interface.
  • Combine images and create animated images from the command line interface.
  • Cleaned up the gif-save, contact-sheet, extract, and multi-frame modal dialogs in the GUI so they take up less real estate.
  • Saving GIFs (both CLI and GUI) now support an auto-detect alpha channel mode. If the source image has transparency a 1-bit alpha channel will be automatically used. If the source image is opaque, all palette entries will be used for colours and the GIF will be opaque.
  • 2 more packed dds pixel formats are supported. Specifically R8G8B8 and R8G8B8A8. These are less efficient than the BGR variants, but some were found in the wild and are now loadable.
  • Fixed gif encoding. It was possible for a fully opaque image to result in a GIF with binary alpha in some circumstances.
  • Improved the warning when an image will take a long time to quantize. This is primarily when the scolorq algorithm is being used. The warning now takes the estimated running time into account and considers both the palette size as well as the image dimensions.

Full Changelog: v1.0.39...v1.0.40

Lossless Transformations

23 May 10:36
Compare
Choose a tag to compare

Overview

Two features that were notably missing have been addressed in this release: Lossless Transformations and Frame Extraction.

Lossless Transformations

Lossless transformations of JPG files are now supported. Flip (horizontal/vertical) and 90 degree rotations (CW/ACW) are supported. In some cases JPGs require a slight adjustment to image dimensions to be able to losslessly transform -- these are 'imperfect' lossless transformations and Tacent View warns you about them.

image

Frame Extraction

The second notable feature is the ability to extract individual images from a file that contains multiple. This includes extracting frames from animated formats like APNG, WEBP, and GIF, extracting pages from multi-page formats like TIFF or EXR, and extracting mipmaps or cubemap-sides from textures like KTX2 or DDS. This complements the pre-existing ability to combine individual images into an animated image -- now we can go in the other direction. Extracted frames may be saved in any of the supported save-formats and the particular frames to extract may be specified using set/interval notation. Extraction of individual images is also available from the command-line interface using the 'extract' operation.

image

Summary of Changes

The following issues and features are covered by this release:

  • Lossless 90-degree rotations and flips of JPG files.
  • Ability to extract frames from animated images, pages from multi-page images (ex. TIFF or EXR files), mipmaps from textures, and sides from cubemaps.
  • Detection of 'imperfect' lossless transformations before they are applied.
  • Sorting by type in the thumbnail viewer now works in a meaningful way by using the file extension as the sort key.
  • Ability to skip saving unchanged files in the CLI interface. --skipunchanged may be useful to use in conjunction with --op extract[]
  • Specifying frames to extract may be done from both the GUI or the CLI using interval-set notation.

Full Changelog: v1.0.38...v1.0.39

Mobile Formats

16 Apr 20:27
Compare
Choose a tag to compare

This release features improved support for common mobile image formats and encodings. A command-line operation for swizzling and setting image channels has been added. Image colour-profile detection is improved and the results are shown in the details panel.

Improvements for Mobile

  • The .atc file extension may be used for ASTC files.
  • ETC1, ETC2 (RGB, RGBA, RGB1A), and EAC (R and RG) pixel encodings are all supported.
  • PKM file viewing supported with all of the ETC-encoding variants.
  • Viewing of DDS files that contain ETC/ETC2 data.
  • Viewing of KTX/KTX2 files that contain ETC/ETC2/EAC data.
  • Auto gamma correction available for ASTC, PKM, DDS, KTX, and KTX2 files. Ability to override the correction for any of these types.
  • More robust detection of image colour profile.

Command Line

To use the new swizzle operation:

--op swizzle[rgba*]
  The swizzle operation allows you to manipulate the RGBA channels of an image
  and swap, duplicate, clear or set them. You can basically take the existing
  channels and rearrange them as you see fit.
  rgba: This is the destination mapping used by the swizzle. It is always in
        the order RGBA. It is made of the characters R, G, B, A, 0, 1, and *.
        The characters are case-insensitive so r, g, b, and a may also be used.
        The asterisk means automatic channel selection. 0 means the channel is
        set to 0 for all pixels. 1 means the channel is set to full for all
        pixels. R means the destiniation channel is taken from the original red
        channel. Similarly for G, B, and A. You do not need to specify all four
        characters if you want the remaining ones to be defaulted to their
        corresponding source channel. This is what the asterisk does.
        The default is **** which is the same as RGBA, both of which leave the
        image unmodified.
  Example 1: --op swizzle[BGR] will swap the red and the blue channels. In
  order, the new red channel gets the original blue channel, the green gets
  green, and the new blue channel gets red. This is the same as swizzle[B*R]
  and is also the same as swizzle[B*R*]. The asterisks just grab the
  corresponding original channel.
  Example 2: --op swizzle[***1] keeps the colours the same but sets the alpha
  to full for all pixels. This is the same as swizzle[RGB1].
  Example 3: --op swizzle[0] clears the red channel. Same as [0GBA] and [0***]
  Example 4: --op swizzle[GGG1] places the original green channel in the new
  red, green and blue channels. It also sets the alpha to full (opaque).

Summary of Changes

Full Changelog: v1.0.37...v1.0.38

Quality of Life

23 Mar 10:55
Compare
Choose a tag to compare

This is a QOL release that fixes a number of critical image loading issues, increases maximum image dimension to 65536x65536, and introduces a locked-aspect mode while cropping.

Image Loading

WEBP

Some animated webp files would cause a crash if frame-size didn't match the canvas-size. This is now addressed and and proper blending of each animated frame is implemented. Webp images that have transparency are often displayed with a background colour in browseers and other viewers. The background colour is stored in the webp. Tacent View now has a checkbox to use the stored background colour. The checkbox is in the properties popup while viewing webp images.

DDS

There are some dds files in the wild that do not have their header flags set correctly. If strict loading is off in the preferences (the default), these files are still loaded so long as a valid FourCC code is still present.

QOI

Qoi images were loaded and saved upside-down. This is now fixed,

Dimension

Some game engines support height-maps up to 64Kx64K in size. Tacent View has increased the maximum allowed image dimensions to match. Previously the max was 32Kx32K.

Ill-formed Images

Tacent View is now more resilient when loading ill-formed image files. Images that fail to load are simply skipped by the viewer and a warning is printed to the log (Ctrl-L).

Cropping

The biggest feature in this release is locked-aspect mode cropping. This was badly needed when cropping photos to a specific ratio. In cropping mode you can now choose to modify the crop area normally (free mode), set the cropping to a specific aspect-ratio (locked-aspect mode) , or specify the aspect ratio manually (custom mode). All common aspect-ratios are supported as presets in the aspect-mode combo box. This includes many that are for prints. Print aspect-ratios have the letter P in them.

Summary of Changes

  • Better handling of ill-formed images.
  • Loading of ill-formed DDS files.
  • Display 'Varies' for opacity in cases where animated or multi-frame images do not have the same opacity for all frames. Opaque means all pixels are opaque. Not opaque means some pixels are semitransparent.
  • Ability to override background colour for semitransparent WEBP files.
  • Increased maximum image dimensions to 65536x65536.
  • In some cases the previously opened image would fail to load when the viewer was re-opened. This could happen if the path to the last opened image file had brackets ( ). This is now fixed.
  • Fixed-aspect mode while cropping. Preset aspect-ratios include all common screen and print sizes.
  • Fixed QOI images loading in upside-down.

Full Changelog: v1.0.36...v1.0.37

Ctrl Cmd Enter

06 Mar 09:57
Compare
Choose a tag to compare

There are three new features in this release -- Ctrl-C/Ctrl-V images to/from the clipboard, a cmd-line interface for batch image processing and build pipelines, and improved focus-handling for all modal dialogs -- which now allow simply pressing Enter to proceed.

Command Line Interface

The most extensive feature is the command-line interface (CLI). On both Windows and Linux the TacentView executable (the same one that is run to bring up the ImGui interface) may also be used in a shell / command-prompt. There is some under-the-hood magic to allow the same executable in Windows to be used in a Command window without bringing up a new console, but it seems to be working fairly well. See this page for more information.

To use Tacent View in CLI mode, you specify the input image files. It then runs a number of operations, in order, on them. Finally the images are saved into whatever format you specify. The easiest way to get your feet wet is to call:

tacentview.exe --help

Further instructions may be found in the Tacent View Wiki.

Input Files

Input files may be of any type that the viewer supports. In addition one or more manifest files may be specified. When processing a directory you may only want to process specific image types -- this is also supported in CLI mode.

For example, to specify a single image plus a directory and a manifest file you would call:

tacentview.exe -c -i tga landscape.jpg foldername/ @imagelist.txt

The -c just means use CLI mode. The -i specifies only load targa files for any input directories that are encountered. The @ means read in a manifest file that lists further files and directories to process. The manifest file may contain empty lines and line comments. If a line is neither of those, it is interpreted as either a directory to look in, or an image file to process.

Operations

The operations are what you want to happen to the input images. Things like rotations, resizing, cropping etc. These operations are appied in-order to each and every input image. Supported operations:

  • resize -- Specify new dimensions, optionally preserve aspect ratio. Choose the resample filter and filter edge mode, etc.
  • canvas -- Resize the image my modifying the canvas area. These are resize modes that do not use resampling. You can choose new dimensions, anchor position, fill colour etc.
  • aspect -- Resize an image using aspect mode. You specify the desired aspect ratio and a specific mode (crop or letterbox). In letterbox mode a fill colour will be used. In crop mode the image sides may need to be cut. In either case there is no non-uniform scaling.
  • deborder -- Remove borders from an image by specifing a border colour. Optionally read the border colour from the image. You may also specify what colour channels to check during removal. This is useful if the border in the image is made of, for example, only transparent pixels but with varying colour values.
  • crop -- Crop an image by specfying a rectangular region. If the region is too big a fill colour wil be used. You may either specify the rectangle extents or an anchor and a size.
  • flip -- Horizontal or vertical flips.
  • rotate -- Rotate an image by specifying an arbitrary angle in degrees or radians. 90 and 180 degree rotations avoid resampling for better quality. After a rotation the image size will be larger. There are three different modes that allow you to choose how to handle this. The modes are fill, crop, and resize. All resampling filters me be optionally chosen.
  • levels -- Adjust image levels by specifying black, white, and mid-points. Choose which frame in animated images to adjust (or choose all of them). The frame number gets clamped to the frame-count of the image being processed. Additinally specify the channels to apply the adjustments to and the algorithm to use for the mid-tone gamma.
  • contrast -- Adjust the contrast of an image up or down. Optionally specify a frame number and channels.
  • brightness -- Adjust the brightness of an image up or down. Optionally specify a frame number and channels.
  • quantize -- Quantize the colours in an image using various high-quaity algorithms. The number of desired colours may be set. Supported algorithms include Wu, Neu, ScolorQ, and Fixed.
  • channel -- Various channel manipulations. This can be used to generate premultiplied-alpha images, spreading one channel to the others, setting a particular channel to a specific value, computing intensity and applying to specific channels (to create, for example, a black-and-white image), etc. The modes are blend, set, spread, and intensity.

Currently supported filters include: nearest box bilinear bicubic bicubic_catmullrom bicubic_mitchell bicubic_cardinal bicubic_bspline lanczos_narrow lanczos and lanczos_wide

Output Images

The output files are generated based on the input files and chosen operations. The type of the output images is specified with --outtype. The short version -o may also be used. If no out-type is specified the default is tga. Supported output types are: tga png jpg gif webp qoi apng bmp tif

The output filename matches the input filename except that the extension/type may be different. Eg. Seascape.jpg would save as Seascape.tga if the outtype was tga.

By default if an output file already exists, it is not overwritten. Use the --overwrite (-w) flag to allow overwrites. To have the tool try a different filename if it aready exists, use the --autoname (-a) flag. It will append the string _NN to the name where NN is a number that keeps incrementing until no existing file is found.

Different output image types have different features and may support different parameters when saving. Here is the list of the currently implemented output file types and what parameters may be specified:

  • APNG : Bits per pixel (or auto-decide) and an optional frame duration override for animated images.
  • BMP: Bits per pixel or auto.
  • GIF: Bits per pixel (2 to 256 colours), colour quantization method., number or loops (explicit or infinite), alpha threshold for GIFs with transparency, an optional duration override for animated GIFs, plus various parameters relating to the chosen quantization method (dither level, filter size, and sample factor).
  • JPG: Quality parameter.
  • PNG: Bits per pixel or auto (inspects image looking for non-opaque pixels).
  • QOI: Bits per pixel or auto, colour space (linear or sRGB).
  • TGA: Bits per pixel or auto, RLE encoding.
  • TIFF: Bits per pixel or auto, ZLib compress, frame duration override for multi-page TIFFs.
  • WEBP: Lossy or lossless image, quality or compression amount (depending on lossy/lossless), optional frame duration override for animated WEBP images.

Exit Code

The return error code is 0 for success and 1 for failure. For 0 to be returned every specified image must be successfully loaded, processed, and saved. A failure in any step for any image results in an error. By default processing continues to the next image even on a failure. If the --earlyexit (-e) flag is set, processing stops immediately on any failure. Either way, any failure returns a non-zero exit code.

Examples

tacentview.exe -cw -i tga images/ -o bmp -v 2 --op rotate[10]

In this example all images in the directory "images" that are tga files will be rotated 10 degrees anti-clockwise and than saved as bmp files. The -cw expands to -c -w. The -c means use CLI mode. The -w means overwrite existing output files. The -o specifies the image type of the output files. The -v 2 sets the verbosity level to high (0 is none, 1 is normal). Finally, the --op rotate[10] is the rotation operation.

Chaining operations together is also possible by specifying more than one operation:

tacentview.exe -cw -i tga images/ -o bmp --op rotate[10] --op channel[blend] --op contrast[0.6]

In this example the rotation is performed, then an alpha pre-multiplication blend is performed, and finally the contrast is bumped up to 0.6 (0.5 is normal). This sequence is applied to all tga files in the images folder and a separate bmp file is written for each one.

Modal Focus

All the modal dialogs have been improved. The currently selected button or widget is now outlined, buttons can be 'pressed' with Enter or Space. For example, if you press 'del' to delete a file, a modal pops up asking you to confirm. You may now press 'OK' by simply pressing the Enter key. This is similar to how OS-native modal dialogs work. The Tab key also cycles between widgets that accept keyboard input.

Clipboard

Ctrl-C and Ctrl-V now work in Tacent View. Want to copy an image and paste into GIMP or PS? This now works. The image in Tacent View will briefly flash white when the copy operation is performed.

You may also paste an image into Tacent View with Ctrl-V. In this case a new image is created with an auto-generated name. The type of the image is specified in Preferences->System->PasteType. The image type may only be a type supporting lossless encoding, as you wouldn't want to lose information simply be pasting. In any event, this behaviour allows tacent to be a sort of 'factory' where you can paste a sequence of images and have it generate new files in a format of your liking.

Regarding Linux, Ctrl-C / Ctrl-V works if using the X11 display server protocol. Wayland is not yet supported by the clipping library. Additionally, cipboard memory is not a kernel-level construct with X11/Linux. If you copy from an app in Linux, that app must remain open when you paste the clipboard into another application.

Additional Improvements

These are in addition to the features listed above and does not represent the fill list of changes:

  • Fixed issue with the bottom...
Read more

Level Up

25 Jan 10:43
Compare
Choose a tag to compare

This release features image levels adjustments, improved UI readability on high-resolution displays, and fixes to the zoom mode when switching images.

Levels

The new levels dialog supports brightness, contrast, and a more comprehensive levels tab. The latter dsiplays a histogram of intensities present in the image and allows adjustments to the black, white, and mid points. The colour channels may be specified individually (R G B or Alpha) or composite RGB intensity may be chosen. To bring up the dialog either press the toolbar button or use the 'L' key on the keyboard. The default key bindings have been updated so that Ctrl-L now brings up the output-log.

LevelsRockyBeach

Tacent View is fast enough to modify the levels of a multi-frame (animated) image at interactive speeds. The image below is 128x128 and 64 frames. Modifying a single image of at least 1024x1024 is fast on even moderate hardware. If you don't want all frames modified uncheck 'All Frames' and only the current frame will be adjusted. Note: this checkbox is only present on images with more than one frame (animated webp, gif, apng, etc). The settings for channel selection and 'All Frames' are also available in the Contrast and Brightness tabs.

LevelsMultiFrame

Readability

The original widget and font size was rather small -- a bit problematic if you have less than 20/20 vision or a 4K display. The UI size (including font) may now be set to Small, Medium, or Large, with Small matching the original font size (Tiny, Small, and Medium might be closer to the truth, but doesn't sound as good.)

The default bindings to increase or decrease the UI size are Shift+ and Shift-

SizeChange

Zoom Mode

The zoom mode and current zoom percent were intended to be either global or remembered with each image individually. This feature never quite worked in a clear and intuitive manner. Now under Preferences->Interface there is a 'Zoom Per Image' checkbox. This behaviour may now be enabled and disabled dynamically by pressing Shift-Z (and is also accessible from the View menu). With this set to true, when cycling through images, each one will have its own zoom settings and percent. Additionally, it is now clear when manually adjusting zoom that you always switch to the 'User' zoom mode. This is apparent by viewing the checks in the View menu.

Additional Changes

  • UI Size saved to config file. Three sizes are supported.
  • Default UI size key bindings set to Shift+ Shift-. Default UI Size set to medium.
  • Faster bootup by embedding the font atlases into the executable.
  • Fixed zoom mode and percent so it properly works whether user chooses to have it remembered with each image individually, or set globally for all images. There is now an explicit option in the preferences for 'zoom per image', and both the global zoom mode and percent are saved to the config file. Any manual zoom adjustment automatically sets the zoom mode to 'user'.
  • Toolbar icon for Levels modal dialog.
  • Adjustments (levels, contrast, brightness) integrated into Image class with full undo/redo stack.
  • Levels modal now has 3 tabs for the different types of adjustments instead of 3 separate dialogs.
  • UI for all 3 adjustment modes implemented.
  • Support colour-channel application for all image adjustments.
  • Levels histogram implemented with different colours depending on chosen channels. The histograms get populated specifically for each of the possible channel modes (R G B A RGB).
  • Logarithmic or linear scale on the levels histogram.
  • Widget dimensions on the Levels modal dialog support the 3 new UI sizes.
  • Ability to modify either a single frame or all frames when processing colour-level changes. This applies to animated images or images that support more than one 'page' (like tiff files). If the image has only one frame, the option is not presented.
  • File Dialog and Nav Bar supports UI Size.
  • Properties window and Save-As popups support UI Size.
  • All currently displayed dialogs save to config.
  • Initial positioning of all dialogs cleaned up to form a grid.
  • Main nav buttons adjust size depending on UI Size.
  • Content View and Colour Channels window supports UI Size.
  • Preferences and Cheat Sheet dialogs support UI Size.
  • File popups and Key-bindings dialogs support UI Size.
  • Crop, Resize Canvas (all 3 tabs) support UI Size.
  • Meta-Data and Zoom menu support UI Size.

Full Changelog: v1.0.34...v1.0.35

Like the Peanut Butter

30 Dec 10:13
Compare
Choose a tag to compare

This release allows high-quality GIFs to be created. GIF support before this did not do a good job of creating colour palettes and did not support saving transparency. In this version 3 high-quality colour quantizers have been added, transparency is supported, and palette-size (BPP) can be set anywhere between 1-bit (2 colour) to 8-bit (256 colour). Dithering is also supported for the spatial quantizer.

The available quantizers are:

  • NeuQuant. This is probably the most well-known high-quality quantizer. It uses a neural net to learn and reduce errors in colour differences. Works well for bigger palette sizes like 128 or 256 colours.
  • Wu Bipartition. With my simple test-case this performed really well at a range of bit-depths and was reasonably fast. it is the default quantizer in Tacent View.
  • Scolorq/Spatial. This is the only method to directly support dithering. It is quite slow but gives superior results for low bit-depths. Try using it for 5-bit (32-colour) or lower.
  • Fixed. A fixed palette. Does not inspect the image pixel colours but is useful for 1-bit palettes as it guarantees both black and white are included. It also highlights how much better the other methods are ;)

Some tests of the quantizers can be found in the Tacent Wiki Quantization Page

The new interface to save a GIF:

GifSave_2022_12_29

Most of the work for this release took place in the base Tacent library. This included the use of gifenc to do the encoding. Here is the related Tacent release.

Additional Improvements and Changes:

  • File dialog now pre-populates the base filename when selecting save-as.
  • Gif palette bit-depth displayed correctly in details panel. From 1 bit to 8 bit.
  • Simplified image loading and saving code to take advantage of the new tImage constructors.
  • No longer using hardcoded extensions for save-as and save-as-multiframe. Now uses the FileTypes object. Config file saves file-type name instead of arbitrary int.

Full Changelog: v1.0.33...v1.0.34