Textpattern CMS support forum
You are not logged in. Register | Login | Help
- Topics: Active | Unanswered
Thumbnail creation can result in rotated / upside-down images
(split off from this smd_thumbnail thread)
A couple of clients have recently reported that images uploaded to Textpattern appear rotated or upside down. Initially I thought this was smd_thumbnail as the display looked fine in com_article_image in the write panel sidebar but the display on the page was wrong where I was using smd_thumbnail to create srcsets.
After testing one of these images on a brand new txp 4.8.8 PHP 8.1 local installation, I can confirm it happens with thumbnail creation in the core. The main image has the correct orientation, the thumbnail created is upside down –exhaustive details on the image below:
Observed in the following site contexts:
localhost: txp 4.8.8, PHP 8.1.3, GD version 2.3.3, Supported EXIF Version: 0220
online server: txp 4.8.8, PHP 8.1.3, GD version 2.2.5, Supported EXIF Version: 0220 (Lightspeed 8.0)
online server: txp 4.9-d, PHP 8.0.16, GD version 2.2.5, Supported EXIF Version: 0220 (Lightspeed 7.9)
In this particular image, the EXIF information shows orientation as Rotate 180
.
This is the output for this image of exiftool
– Orientation: Rotate 180:
ExifTool Version Number : 12.30
File Name : 2449.jpg
Directory : /Users/julian/Desktop
File Size : 2.6 MiB
File Modification Date/Time : 2022:02:25 12:09:57+01:00
File Access Date/Time : 2022:02:25 12:14:31+01:00
File Inode Change Date/Time : 2022:02:25 12:11:49+01:00
File Permissions : -rw-r--r--
File Type : JPEG
File Type Extension : jpg
MIME Type : image/jpeg
Exif Byte Order : Big-endian (Motorola, MM)
Make : Apple
Camera Model Name : iPhone SE (2nd generation)
Orientation : Rotate 180
X Resolution : 72
Y Resolution : 72
Resolution Unit : inches
Software : 15.2.1
Modify Date : 2022:02:24 19:18:43
Host Computer : iPhone SE (2nd generation)
Y Cb Cr Positioning : Centered
Exposure Time : 1/100
F Number : 1.8
Exposure Program : Program AE
ISO : 64
Exif Version : 0232
Date/Time Original : 2022:02:24 19:18:43
Create Date : 2022:02:24 19:18:43
Components Configuration : Y, Cb, Cr, -
Shutter Speed Value : 1/100
Aperture Value : 1.8
Brightness Value : 4.783037509
Exposure Compensation : 0
Metering Mode : Multi-segment
Flash : Off, Did not fire
Focal Length : 4.0 mm
Subject Area : 2013 1511 2217 1330
Run Time Flags : Valid
Run Time Value : 202663539324958
Run Time Scale : 1000000000
Run Time Epoch : 0
Acceleration Vector : 1.007881523 0.01814972982 -0.02786204592
Sub Sec Time Original : 299
Sub Sec Time Digitized : 299
Flashpix Version : 0100
Color Space : Uncalibrated
Exif Image Width : 4032
Exif Image Height : 3024
Sensing Method : One-chip color area
Scene Type : Directly photographed
Exposure Mode : Auto
White Balance : Auto
Focal Length In 35mm Format : 28 mm
Scene Capture Type : Standard
Lens Info : 3.99000001mm f/1.8
Lens Make : Apple
Lens Model : iPhone SE (2nd generation) back camera 3.99mm f/1.8
Composite Image : General Composite Image
Compression : JPEG (old-style)
Thumbnail Offset : 2274
Thumbnail Length : 6219
Profile CMM Type : Apple Computer Inc.
Profile Version : 4.0.0
Profile Class : Display Device Profile
Color Space Data : RGB
Profile Connection Space : XYZ
Profile Date Time : 2017:07:07 13:22:32
Profile File Signature : acsp
Primary Platform : Apple Computer Inc.
CMM Flags : Not Embedded, Independent
Device Manufacturer : Apple Computer Inc.
Device Model :
Device Attributes : Reflective, Glossy, Positive, Color
Rendering Intent : Perceptual
Connection Space Illuminant : 0.9642 1 0.82491
Profile Creator : Apple Computer Inc.
Profile ID : ca1a9582257f104d389913d5d1ea1582
Profile Description : Display P3
Profile Copyright : Copyright Apple Inc., 2017
Media White Point : 0.95045 1 1.08905
Red Matrix Column : 0.51512 0.2412 -0.00105
Green Matrix Column : 0.29198 0.69225 0.04189
Blue Matrix Column : 0.1571 0.06657 0.78407
Red Tone Reproduction Curve : (Binary data 32 bytes, use -b option to extract)
Chromatic Adaptation : 1.04788 0.02292 -0.0502 0.02959 0.99048 -0.01706 -0.00923 0.01508 0.75168
Blue Tone Reproduction Curve : (Binary data 32 bytes, use -b option to extract)
Green Tone Reproduction Curve : (Binary data 32 bytes, use -b option to extract)
Image Width : 4032
Image Height : 3024
Encoding Process : Baseline DCT, Huffman coding
Bits Per Sample : 8
Color Components : 3
Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2)
Run Time Since Power Up : 2 days 8:17:44
Aperture : 1.8
Image Size : 4032x3024
Megapixels : 12.2
Scale Factor To 35 mm Equivalent: 7.0
Shutter Speed : 1/100
Create Date : 2022:02:24 19:18:43.299
Date/Time Original : 2022:02:24 19:18:43.299
Thumbnail Image : (Binary data 6219 bytes, use -b option to extract)
Circle Of Confusion : 0.004 mm
Field Of View : 65.5 deg
Focal Length : 4.0 mm (35 mm equivalent: 28.0 mm)
Hyperfocal Distance : 2.07 m
Light Value : 9.0
Lens ID : iPhone SE (2nd generation) back camera 3.99mm f/1.8
and of mdls
– kMDItemOrientation = 0:
_kMDItemDisplayNameWithExtensions = "2449.jpg"
kMDItemAcquisitionMake = "Apple"
kMDItemAcquisitionModel = "iPhone SE (2nd generation)"
kMDItemAperture = 1.69599381283836
kMDItemBitsPerSample = 24
kMDItemColorSpace = "RGB"
kMDItemContentCreationDate = 2022-02-24 18:18:43 +0000
kMDItemContentCreationDate_Ranking = 2022-02-24 00:00:00 +0000
kMDItemContentModificationDate = 2022-02-24 18:18:43 +0000
kMDItemContentModificationDate_Ranking = 2022-02-24 00:00:00 +0000
kMDItemContentType = "public.jpeg"
kMDItemContentTypeTree = (
"public.jpeg",
"public.image",
"public.data",
"public.item",
"public.content"
)
kMDItemCreator = "15.2.1"
kMDItemDateAdded = 2022-02-25 11:09:57 +0000
kMDItemDateAdded_Ranking = 2022-02-25 00:00:00 +0000
kMDItemDisplayName = "2449.jpg"
kMDItemDocumentIdentifier = 0
kMDItemDownloadedDate = (
"2022-02-25 11:09:57 +0000"
)
kMDItemEXIFVersion = "2.3.2"
kMDItemExposureMode = 0
kMDItemExposureProgram = 2
kMDItemExposureTimeSeconds = 0.01
kMDItemFlashOnOff = 0
kMDItemFNumber = 1.8
kMDItemFocalLength = 3.99
kMDItemFocalLength35mm = 28
kMDItemFSContentChangeDate = 2022-02-25 11:09:57 +0000
kMDItemFSCreationDate = 2022-02-25 11:09:57 +0000
kMDItemFSCreatorCode = ""
kMDItemFSFinderFlags = 0
kMDItemFSHasCustomIcon = (null)
kMDItemFSInvisible = 0
kMDItemFSIsExtensionHidden = 0
kMDItemFSIsStationery = (null)
kMDItemFSLabel = 0
kMDItemFSName = "2449.jpg"
kMDItemFSNodeCount = (null)
kMDItemFSOwnerGroupID = 20
kMDItemFSOwnerUserID = 501
kMDItemFSSize = 2754240
kMDItemFSTypeCode = ""
kMDItemHasAlphaChannel = 0
kMDItemInterestingDate_Ranking = 2022-02-25 00:00:00 +0000
kMDItemISOSpeed = 64
kMDItemKind = "JPEG-Bild"
kMDItemLastUsedDate = 2022-02-25 11:11:49 +0000
kMDItemLastUsedDate_Ranking = 2022-02-25 00:00:00 +0000
kMDItemLogicalSize = 2754240
kMDItemMeteringMode = 5
kMDItemOrientation = 0
kMDItemPhysicalSize = 2756608
kMDItemPixelCount = 12192768
kMDItemPixelHeight = 3024
kMDItemPixelWidth = 4032
kMDItemProfileName = "Display P3"
kMDItemRedEyeOnOff = 0
kMDItemResolutionHeightDPI = 72
kMDItemResolutionWidthDPI = 72
kMDItemUseCount = 5
kMDItemUsedDates = (
"2022-02-24 23:00:00 +0000"
)
kMDItemWhereFroms = (
"https://domain.com/images/2449.jpg?1645781673"
)
kMDItemWhiteBalance = 0
and of identify -verbose
– Orientation: BottomRight.
Image:
Filename: /Users/julian/Desktop/2449.jpg
Format: JPEG (Joint Photographic Experts Group JFIF format)
Mime type: image/jpeg
Class: DirectClass
Geometry: 4032x3024+0+0
Resolution: 72x72
Print size: 56x42
Units: PixelsPerInch
Colorspace: sRGB
Type: TrueColor
Base type: Undefined
Endianness: Undefined
Depth: 8-bit
Channel depth:
Red: 8-bit
Green: 8-bit
Blue: 8-bit
Channel statistics:
Pixels: 12192768
Red:
min: 0 (0)
max: 255 (1)
mean: 166.7 (0.653726)
median: 211 (0.827451)
standard deviation: 43.8538 (0.171976)
kurtosis: 0.0766166
skewness: -0.614242
entropy: 0.887777
Green:
min: 0 (0)
max: 255 (1)
mean: 166.527 (0.653047)
median: 199 (0.780392)
standard deviation: 39.578 (0.155208)
kurtosis: 1.956
skewness: -1.21061
entropy: 0.882067
Blue:
min: 0 (0)
max: 255 (1)
mean: 161.819 (0.634583)
median: 185 (0.72549)
standard deviation: 37.9978 (0.149011)
kurtosis: 3.01997
skewness: -1.66286
entropy: 0.849631
Image statistics:
Overall:
min: 0 (0)
max: 255 (1)
mean: 165.015 (0.647119)
median: 198.333 (0.777778)
standard deviation: 40.4765 (0.158732)
kurtosis: 1.48286
skewness: -1.07034
entropy: 0.873158
Rendering intent: Perceptual
Gamma: 0.454545
Chromaticity:
red primary: (0.64,0.33)
green primary: (0.3,0.6)
blue primary: (0.15,0.06)
white point: (0.3127,0.329)
Matte color: grey74
Background color: white
Border color: srgb(223,223,223)
Transparent color: none
Interlace: None
Intensity: Undefined
Compose: Over
Page geometry: 4032x3024+0+0
Dispose: Undefined
Iterations: 0
Compression: JPEG
Quality: 94
Orientation: BottomRight
Profiles:
Profile-exif: 8489 bytes
Profile-icc: 548 bytes
Properties:
date:create: 2022-02-25T11:11:49+00:00
date:modify: 2022-02-25T11:09:57+00:00
exif:ApertureValue: 54823/32325
exif:BrightnessValue: 283218/59213
exif:ColorSpace: 65535
exif:ComponentsConfiguration: 1, 2, 3, 0
exif:DateTime: 2022:02:24 19:18:43
exif:DateTimeDigitized: 2022:02:24 19:18:43
exif:DateTimeOriginal: 2022:02:24 19:18:43
exif:ExifOffset: 252
exif:ExifVersion: 48, 50, 51, 50
exif:ExposureBiasValue: 0/1
exif:ExposureMode: 0
exif:ExposureProgram: 2
exif:ExposureTime: 1/100
exif:Flash: 16
exif:FlashPixVersion: 48, 49, 48, 48
exif:FNumber: 9/5
exif:FocalLength: 399/100
exif:FocalLengthIn35mmFilm: 28
exif:LensMake: Apple
exif:LensModel: iPhone SE (2nd generation) back camera 3.99mm f/1.8
exif:LensSpecification: 4183519/1048501, 4183519/1048501, 9/5, 9/5
exif:Make: Apple
exif:MakerNote: 65, 112, 112, 108, 101, 32, 105, 79, 83, 0, 0, 1, 77, 77, 0, 35, 0, 1, 0, 9, 0, 0, 0, 1, 0, 0, 0, 14, 0, 2, 0, 7, 0, 0, 2, 46, 0, 0, 1, 184, 0, 3, 0, 7, 0, 0, 0, 104, 0, 0, 3, 230, 0, 4, 0, 9, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 0, 9, 0, 0, 0, 1, 0, 0, 0, 199, 0, 6, 0, 9, 0, 0, 0, 1, 0, 0, 0, 202, 0, 7, 0, 9, 0, 0, 0, 1, 0, 0, 0, 1, 0, 8, 0, 10, 0, 0, 0, 3, 0, 0, 4, 78, 0, 12, 0, 10, 0, 0, 0, 2, 0, 0, 4, 102, 0, 13, 0, 9, 0, 0, 0, 1, 0, 0, 0, 5, 0, 14, 0, 9, 0, 0, 0, 1, 0, 0, 0, 4, 0, 16, 0, 9, 0, 0, 0, 1, 0, 0, 0, 1, 0, 20, 0, 9, 0, 0, 0, 1, 0, 0, 0, 10, 0, 22, 0, 2, 0, 0, 0, 29, 0, 0, 4, 118, 0, 23, 0, 9, 0, 0, 0, 1, 34, 80, 32, 0, 0, 25, 0, 9, 0, 0, 0, 1, 0, 0, 0, 2, 0, 26, 0, 2, 0, 0, 0, 6, 0, 0, 4, 148, 0, 31, 0, 9, 0, 0, 0, 1, 0, 0, 0, 0, 0, 32, 0, 2, 0, 0, 0, 37, 0, 0, 4, 154, 0, 33, 0, 10, 0, 0, 0, 1, 0, 0, 4, 192, 0, 35, 0, 9, 0, 0, 0, 2, 0, 0, 4, 200, 0, 37, 0, 9, 0, 0, 0, 1, 0, 0, 0, 138, 0, 38, 0, 9, 0, 0, 0, 1, 0, 0, 0, 3, 0, 39, 0, 10, 0, 0, 0, 1, 0, 0, 4, 208, 0, 40, 0, 9, 0, 0, 0, 1, 0, 0, 0, 1, 0, 43, 0, 2, 0, 0, 0, 37, 0, 0, 4, 216, 0, 45, 0, 9, 0, 0, 0, 1, 0, 0, 23, 164, 0, 46, 0, 9, 0, 0, 0, 1, 0, 0, 0, 6, 0, 47, 0, 9, 0, 0, 0, 1, 0, 0, 0, 96, 0, 54, 0, 9, 0, 0, 0, 1, 0, 0, 8, 136, 0, 55, 0, 9, 0, 0, 0, 1, 0, 0, 0, 4, 0, 59, 0, 9, 0, 0, 0, 1, 0, 0, 0, 0, 0, 60, 0, 9, 0, 0, 0, 1, 0, 0, 0, 4, 0, 65, 0, 7, 0, 0, 0, 42, 0, 0, 4, 254, 0, 74, 0, 9, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 98, 112, 108, 105, 115, 116, 48, 48, 79, 17, 2, 0, 153, 0, 107, 0, 165, 0, 147, 0, 125, 0, 107, 0, 90, 0, 111, 0, 135, 0, 151, 0, 182, 0, 223, 0, 229, 0, 231, 0, 222, 0, 208, 0, 164, 0, 115, 0, 172, 0, 149, 0, 114, 0, 162, 0, 173, 0, 142, 0, 116, 0, 129, 0, 150, 0, 160, 0, 200, 0, 230, 0, 225, 0, 213, 0, 180, 0, 127, 0, 191, 0, 184, 0, 164, 0, 166, 0, 196, 0, 200, 0, 204, 0, 156, 0, 122, 0, 135, 0, 153, 0, 178, 0, 219, 0, 222, 0, 198, 0, 141, 0, 213, 0, 212, 0, 207, 0, 186, 0, 227, 0, 222, 0, 225, 0, 211, 0, 196, 0, 170, 0, 133, 0, 141, 0, 161, 0, 199, 0, 212, 0, 155, 0, 232, 0, 232, 0, 235, 0, 241, 0, 236, 0, 230, 0, 236, 0, 223, 0, 219, 0, 223, 0, 203, 0, 152, 0, 135, 0, 150, 0, 218, 0, 158, 0, 239, 0, 241, 0, 228, 0, 215, 0, 241, 0, 244, 0, 240, 0, 228, 0, 222, 0, 221, 0, 176, 0, 156, 0, 161, 0, 102, 0, 220, 0, 161, 0, 232, 0, 220, 0, 175, 0, 210, 0, 241, 0, 2, 1, 254, 0, 244, 0, 235, 0, 230, 0, 194, 0, 163, 0, 149, 0, 92, 0, 229, 0, 139, 0, 119, 0, 104, 0, 156, 0, 241, 0, 252, 0, 245, 0, 249, 0, 206, 0, 243, 0, 242, 0, 188, 0, 159, 0, 142, 0, 112, 0, 235, 0, 149, 0, 189, 0, 179, 0, 156, 0, 207, 0, 222, 0, 206, 0, 202, 0, 212, 0, 201, 0, 207, 0, 144, 0, 169, 0, 155, 0, 126, 0, 238, 0, 154, 0, 187, 0, 193, 0, 194, 0, 199, 0, 189, 0, 192, 0, 199, 0, 205, 0, 210, 0, 207, 0, 184, 0, 175, 0, 165, 0, 162, 0, 245, 0, 157, 0, 189, 0, 191, 0, 192, 0, 195, 0, 198, 0, 202, 0, 205, 0, 207, 0, 206, 0, 203, 0, 176, 0, 190, 0, 190, 0, 188, 0, 252, 0, 160, 0, 192, 0, 195, 0, 199, 0, 202, 0, 205, 0, 209, 0, 212, 0, 216, 0, 214, 0, 213, 0, 207, 0, 220, 0, 1, 1, 27, 1, 1, 1, 165, 0, 195, 0, 198, 0, 201, 0, 203, 0, 207, 0, 213, 0, 220, 0, 222, 0, 223, 0, 225, 0, 222, 0, 220, 0, 9, 1, 47, 1, 9, 1, 179, 0, 199, 0, 201, 0, 203, 0, 207, 0, 210, 0, 217, 0, 227, 0, 239, 0, 253, 0, 7, 1, 4, 1, 6, 1, 39, 1, 49, 1, 13, 1, 188, 0, 202, 0, 203, 0, 205, 0, 209, 0, 208, 0, 222, 0, 243, 0, 8, 1, 63, 1, 101, 1, 96, 1, 83, 1, 66, 1, 55, 1, 45, 1, 210, 0, 204, 0, 237, 0, 31, 1, 47, 1, 204, 0, 250, 0, 57, 1, 48, 1, 175, 1, 113, 1, 83, 1, 81, 1, 73, 1, 64, 1, 0, 8, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 12, 98, 112, 108, 105, 115, 116, 48, 48, 212, 1, 2, 3, 4, 5, 6, 7, 8, 85, 102, 108, 97, 103, 115, 85, 118, 97, 108, 117, 101, 89, 116, 105, 109, 101, 115, 99, 97, 108, 101, 85, 101, 112, 111, 99, 104, 16, 1, 19, 0, 0, 184, 82, 72, 69, 56, 30, 18, 59, 154, 202, 0, 16, 0, 8, 17, 23, 29, 39, 45, 47, 56, 61, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 61, 241, 0, 0, 61, 117, 0, 0, 3, 65, 0, 0, 179, 72, 255, 255, 239, 17, 0, 2, 95, 196, 0, 0, 0, 77, 0, 0, 0, 12
exif:MeteringMode: 5
exif:Model: iPhone SE (2nd generation)
exif:PhotographicSensitivity: 64
exif:PixelXDimension: 4032
exif:PixelYDimension: 3024
exif:SceneCaptureType: 0
exif:SceneType: 1
exif:SensingMethod: 2
exif:ShutterSpeedValue: 61994/9329
exif:Software: 15.2.1
exif:SubjectArea: 2013, 1511, 2217, 1330
exif:SubSecTimeDigitized: 299
exif:SubSecTimeOriginal: 299
exif:thumbnail:Compression: 6
exif:thumbnail:JPEGInterchangeFormat: 2262
exif:thumbnail:JPEGInterchangeFormatLength: 6219
exif:thumbnail:ResolutionUnit: 2
exif:thumbnail:XResolution: 72/1
exif:thumbnail:YResolution: 72/1
exif:WhiteBalance: 0
exif:YCbCrPositioning: 1
icc:copyright: Copyright Apple Inc., 2017
icc:description: Display P3
jpeg:colorspace: 2
jpeg:sampling-factor: 2x2,1x1,1x1
signature: af9e98943dd7fc2ab0c2f3aab88ee544a7978e9729349a165b77ec765bfdd9ae
unknown: iPhone SE (2nd generation)
Artifacts:
verbose: true
Tainted: False
Filesize: 2754240B
Number pixels: 12.1928M
Pixels per second: 71.7668MP
User time: 0.170u
Elapsed time: 0:01.169
Version: ImageMagick 7.1.0-26 Q16-HDRI x86_64 2022-02-21 https://imagemagick.org
TXP Builders – finely-crafted code, design and txp
Offline
Re: Thumbnail creation can result in rotated / upside-down images
Looks like class.thumb.php needs to check the exif orientation prior to creating the thumb.
See this stackoverflow post and this medium post.
If it helps, this is the output of PHP’s exif_read_data
from within Textpattern (i.e. /image/1.jpg) for the above image that shows upside down:
array (
'FileDateTime' => 0,
'FileSize' => 2754240,
'FileType' => 2,
'MimeType' => 'image/jpeg',
'SectionsFound' => 'ANY_TAG, IFD0, THUMBNAIL, EXIF',
'COMPUTED' =>
array (
'html' => 'width="4032" height="3024"',
'Height' => 3024,
'Width' => 4032,
'IsColor' => 1,
'ByteOrderMotorola' => 1,
'ApertureFNumber' => 'f/1.8',
'Thumbnail.FileType' => 2,
'Thumbnail.MimeType' => 'image/jpeg',
),
'Make' => 'Apple',
'Model' => 'iPhone SE (2nd generation)',
'Orientation' => 3,
'XResolution' => '72/1',
'YResolution' => '72/1',
'ResolutionUnit' => 2,
'Software' => '15.2.1',
'DateTime' => '2022:02:24 19:18:43',
'HostComputer' => 'iPhone SE (2nd generation)',
'YCbCrPositioning' => 1,
'Exif_IFD_Pointer' => 252,
'THUMBNAIL' =>
array (
'Compression' => 6,
'XResolution' => '72/1',
'YResolution' => '72/1',
'ResolutionUnit' => 2,
'JPEGInterchangeFormat' => 2262,
'JPEGInterchangeFormatLength' => 6219,
),
'ExposureTime' => '1/100',
'FNumber' => '9/5',
'ExposureProgram' => 2,
'ISOSpeedRatings' => 64,
'ExifVersion' => '0232',
'DateTimeOriginal' => '2022:02:24 19:18:43',
'DateTimeDigitized' => '2022:02:24 19:18:43',
'ComponentsConfiguration' => '' . "\0" . '',
'ShutterSpeedValue' => '61994/9329',
'ApertureValue' => '54823/32325',
'BrightnessValue' => '283218/59213',
'ExposureBiasValue' => '0/1',
'MeteringMode' => 5,
'Flash' => 16,
'FocalLength' => '399/100',
'SubjectLocation' =>
array (
0 => 2013,
1 => 1511,
2 => 2217,
3 => 1330,
),
'MakerNote' => 'Apple iOS',
'SubSecTimeOriginal' => '299',
'SubSecTimeDigitized' => '299',
'FlashPixVersion' => '0100',
'ColorSpace' => 65535,
'ExifImageWidth' => 4032,
'ExifImageLength' => 3024,
'SensingMethod' => 2,
'SceneType' => '',
'ExposureMode' => 0,
'WhiteBalance' => 0,
'FocalLengthIn35mmFilm' => 28,
'SceneCaptureType' => 0,
'UndefinedTag:0xA432' =>
array (
0 => '4183519/1048501',
1 => '4183519/1048501',
2 => '9/5',
3 => '9/5',
),
'UndefinedTag:0xA433' => 'Apple',
'UndefinedTag:0xA434' => 'iPhone SE (2nd generation) back camera 3.99mm f/1.8',
'UndefinedTag:0xA460' => 2,
)
obtained by putting the following in an article:
<txp:php>
$exif = exif_read_data('http://site.com/images/1.jpg', 'IFD0');
dmp($exif);
</txp:php>
(replacing site.com and the image number with whatever image you want to get the details of)
TXP Builders – finely-crafted code, design and txp
Offline
Re: Thumbnail creation can result in rotated / upside-down images
Weird. I wonder why it needs to check the exif data when that’s largely proprietary, compared to using IPTC metadata or equivalent?
We can (should?) probably check orientation first somehow before creating the thumbnail so leave it with me and I’ll fold it into the image branch. Please create an issue so we can track it, thanks.
The smd plugin menagerie — for when you need one more gribble of power from Textpattern. Bleeding-edge code available on GitHub.
Txp Builders – finely-crafted code, design and Txp
Offline
Re: Thumbnail creation can result in rotated / upside-down images
I still find it strange that this never came up earlier. iPhones (and other digital cameras or phones) have been writing those EXIF meta data since forever.
Or ? Has there been a change in what data iOS includes when uploading images?
Where is that emoji for a solar powered submarine when you need it ?
Sand space – admin theme for Textpattern
Offline
Re: Thumbnail creation can result in rotated / upside-down images
phiw13 wrote #332831:
I still find it strange that this never came up earlier.
Ditto. This is what concerns me: that we’ll put something in place to check/fix the rotation and then find it’s only specific to one device or brand, and it screws up the experience for other people. Something has to have changed somewhere.
The smd plugin menagerie — for when you need one more gribble of power from Textpattern. Bleeding-edge code available on GitHub.
Txp Builders – finely-crafted code, design and Txp
Offline
Re: Thumbnail creation can result in rotated / upside-down images
A test with my iPhoneSE(1st gen) + iOS 15latest and Textpattern 4.8.8 with PHP 8.1.1 & GD 2.3.3
- Take a landscape image from laptop keyboard in front of me – close enough to only have the keyboard + trackpad.
- in Photos.app the image shows in portrait mode.
- The image uploaded to Textpattern is displayed as portrait mode – but the generated thumbnail is displayed as a landscape image (“rotated”).
test 2:
- same as test 1, but keep some of the surroundings (screen, part of table, a glass of water…).
- In Camera.app (and then in Photos.app) the image is immediately rotated
- uploading to Textpattern shows the expected landscape image in all cases (no unexpected rotations)
If I manually rotate the image taken in test 1 in Photos.app, then the image displays as landscape in all cases.
–^–
Can someone with an Android based phone or a standalone digital camera test this as well ?
Where is that emoji for a solar powered submarine when you need it ?
Sand space – admin theme for Textpattern
Offline
Re: Thumbnail creation can result in rotated / upside-down images
That’s a great test and an intriguing result. I’m away from the laptop at the mo but I’ll do these tests later on Android.
The smd plugin menagerie — for when you need one more gribble of power from Textpattern. Bleeding-edge code available on GitHub.
Txp Builders – finely-crafted code, design and Txp
Offline
Re: Thumbnail creation can result in rotated / upside-down images
This was reported to me again, so I took another look at this problem.
I repeated Philippe’s test with an iPhone 11 and txp 4.8.8 and saw similar results, except that in my case some thumbnails were upside-down. As Philippe observed, the iPhone seems to recognize contextual cues and corrects the orientation of the image accordingly even though the camera is held in exactly the same orientation.
I posted an issue on GitHub along with details of the test and screenshots of what Textpattern 4.8.8. produces as thumbnails.
I also did some more research and with the help of a Stackoverflow thread and some experimentation I came up with a potential solution, also detailed in the above issue. I tested with some images of my own and also test images found on the internet for (mirrored) orientations that I couldn’t work out how to produce myself. Perhaps some other people could test this more extensively, especially with images from other cameras?
TXP Builders – finely-crafted code, design and txp
Offline
Re: Thumbnail creation can result in rotated / upside-down images
jakob wrote #333732:
This was reported to me again, so I took another look at this problem.
Out of curiosity, what type of (real-world) images are producing those unexpected results? I once asked “iphone” girl who used to used to upload many (travel / food) images taken with said iPhone. She did not remember having run into that issue.
That said, that StackOverflow thread is interesting – as in: over 10years old, and both Android and iOS cameras seem affected. The issue is apparently not new at all.
Where is that emoji for a solar powered submarine when you need it ?
Sand space – admin theme for Textpattern
Offline
Re: Thumbnail creation can result in rotated / upside-down images
phiw13 wrote #333734:
Out of curiosity, what type of (real-world) images are producing those unexpected results? I once asked “iphone” girl who used to used to upload many (travel / food) images taken with said iPhone. She did not remember having run into that issue.
Yes, I don’t know why we’re seeing it more often now (newer cameras? newer PHP? newer browsers?) but you can try the images I posted in the second comment of the GitHub issue.
Here’s a screenshot of the test images I took with my phone in different orientations plus corresponding txp-generated thumbnails. Images 1-4 are before the patch is replied, 5-8 after the patch is applied.
Screenshot (linked as Textile images are still not working here on the forum)
Also try the prepared test images from github.com/recurser/exif-orientation-examples in all EXIF orientations.
EDIT: And here are two screenshots of the results of that before patch and after patch.
TXP Builders – finely-crafted code, design and txp
Offline