qrencode config file

Started by StarGeek, August 05, 2024, 09:34:06 PM

Previous topic - Next topic

StarGeek

Based upon Alan Clifford's idea to create QR codes from an image's GPS coordinate, I put together this config file that will create a QR PNG image if a file has a GPSLatitude/GPSLongitude.

It can be run with a command such as this
exiftool -config GPSQRCode.config -GPSQRCode -b -W %d%f-QR.png /path/to/files/

#------------------------------------------------------------------------------
# File:         GPSQRCode.config
#
# Description:  User-defined Composite tag to create a GPS QR code
#                   by running qrencode
#
# Tag definition and example:
#
#   GPSQRCode
#       This will create a QR code image for any file that has GPS coordinates.
#
#       Example:
#           exiftool -config GPSQRCode.config -GPSQRCode -b -W %d%f-QR.png /path/to/files/
#
#
# Revisions:    Ver. 1.0 - 2024-08-05 - Bryan K. Williams (aka StarGeek) Created
#                    1.1 - 2024-08-06 - Fixed output so the returned image shows up tagged as Binary (thanks Phil)
#
# References:
#               https://github.com/fukuchi/libqrencode
#               Windows Port
#               https://sourceforge.net/projects/qrencode-for-windows/
#               Tutorial
#               https://www.howtogeek.com/devops/how-to-create-qr-codes-from-the-linux-command-line/


%Image::ExifTool::UserDefined = (
    'Image::ExifTool::Composite' => {

        GPSQRCode => {
            Require => {
                0 => 'GPSLatitude',
                1 => 'GPSLongitude',
            },
            Binary => 1,
            ValueConv => q{
                # Hide STDERR so it doesn't display on command line
                use File::Spec;
                open STDERR, '>', File::Spec->devnull() or warn "Warning: could not hide STDERR";

                # Set GPS tags in new image
                my $et = new Image::ExifTool;
                $et->SetNewValue('EXIF:GPSLatitude',$val[0]);
                $et->SetNewValue('EXIF:GPSLongitude',$val[1]);

                # run qrencode
                my $QRCode = `qrencode -s 6 -l H -o - "geo:$val[0],$val[1]"`;
                warn "Error running qrencode" and return undef unless $QRCode;
                my $success = $et->WriteInfo($QRCode);
                return \$QRCode;
            },
        },
    },
);
#------------------------------------------------------------------------------
1;  #end

The "Hide STDERR" stuff is in there because I was going to check to make sure qrencode existed first by running
qrencode --version
but the problem with that is that the version info was output to STDERR.  Also, this would mean running qrencode twice for every image. So that might get dropped if there's an update.

The current problem is that exiftool doesn't recognize the data as Binary, so it will display the contents of the PNG file directly on the command line if the -W (-TagOut) option isn't used. Fixed

I'm probably using the Binary => 1, flag incorrectly or in the wrong spot. Phil, what would be the correct way to get the tag marked as binary? Fixed

If there's any interest, it would be possible to add some -UserParams to change some of the command line options, such as making it larger or changing the colors of the output file.

The How To Geek page listed in the file has instructions on installing on the qrencode program on Linux. There is also a Windows port of the program.
* Did you read FAQ #3 and use the command listed there?
* Please use the Code button for exiftool code/output.
 
* Please include your OS, Exiftool version, and type of file you're processing (MP4, JPG, etc).

Phil Harvey

It looks like the Binary flag doesn't work for Composite tags.  But you can do the same thing by returning \$QRCode (a reference to $QRCode) instead of $QRCode directly.

- Phil

Edit:  Ah.  From lib/Image/ExifTool/README:

                  Binary' - set to 1 for binary data.  This has the same effect
                  as setting ValueConv to '\$val', but it it a bit cleaner and
                  avoids dummy ValueConvInv entries for writable tags.  Has no
                  effect if ValueConv is defined for the tag.
...where DIR is the name of a directory/folder containing the images.  On Mac/Linux/PowerShell, use single quotes (') instead of double quotes (") around arguments containing a dollar sign ($).

Alan Clifford

@StarGeek I'm a little confused.  In my photos, exif:gpslatitude doesn't have a north or south of the equator

[EXIF]          GPS Latitude Ref                : South
[EXIF]          GPS Latitude                    : 33 deg 13' 54.68"
[XMP]           GPS Latitude                    : 33 deg 13' 54.68" S
[Composite]     GPS Latitude                    : 33 deg 13' 54.68" S
[Composite]     GPS Latitude Ref                : South


StarGeek

Quote from: Alan Clifford on August 06, 2024, 08:06:01 AMIn my photos, exif:gpslatitude doesn't have a north or south of the equator

The EXIF GPS tags (called GPS tags by exiftool) are split into two separate tags. The GPSLatitude/GPSLongitude/GPSAltitude tags hold the actual coordinate values and the GPSLatitudeRef/GPSLongitudeRef/GPSAltitudeRef tags hold the directional values (N/S, E/W, Above/Below).

It shouldn't be a problem with this config file, as it doesn't use a specific location, so it should default to the Composite GPS tags. Those tags should include the reference direction if it is in the file somewhere.
* Did you read FAQ #3 and use the command listed there?
* Please use the Code button for exiftool code/output.
 
* Please include your OS, Exiftool version, and type of file you're processing (MP4, JPG, etc).

StarGeek

Quote from: Phil Harvey on August 06, 2024, 07:07:20 AMEdit:  Ah.  From lib/Image/ExifTool/README:

Somehow I always overlook that file. I have to do something to make sure that is the first thing I check.

Looks good now
C:\>exiftool -config GPSQRCode.config -GPSQRCode -G1 -a -s y:\!temp\Test4.jpg
[Composite]     GPSQRCode                       : (Binary data 448 bytes, use -b option to extract)
* Did you read FAQ #3 and use the command listed there?
* Please use the Code button for exiftool code/output.
 
* Please include your OS, Exiftool version, and type of file you're processing (MP4, JPG, etc).

wywh

Quote from: StarGeek on August 06, 2024, 09:44:31 AMComposite GPS tags. Those tags should include the reference direction if it is in the file somewhere.

In images GPS is very verbose while in movies it is terse (-e does not generate composite tags)...

exiftool -a -G1 -s -n -e  -Location:All .
======== ./image.jpg
[GPS]           GPSVersionID                    : 2 3 0 0
[GPS]           GPSLatitudeRef                  : S
[GPS]           GPSLatitude                     : 36.6101
[GPS]           GPSLongitudeRef                 : W
[GPS]           GPSLongitude                    : 66.91515
[GPS]           GPSAltitudeRef                  : 0
[GPS]           GPSAltitude                     : 119.9
======== ./movie.mp4
[Keys]          GPSCoordinates                  : -36.6101 -66.91515 119.9


I like Composite:GPSPosition because it acts the same in images and movies which otherwise have different tags for GPS.

The only thing I dislike is that Composite:GPSPosition ignores altitude and puts it to Composite:GPSAltitude.

exiftool -a -G1 -s -n -Composite:GPSPosition -Composite:GPSAltitude .
======== ./image.jpg
[Composite]     GPSPosition                     : -36.6101 -66.91515
[Composite]     GPSAltitude                     : 119.9
======== ./movie.mp4
[Composite]     GPSPosition                     : -36.6101 -66.91515
[Composite]     GPSAltitude                     : 119.9

- Matti