Skip to content

Commit 8de1547

Browse files
authored
fix(jpeg_encode): support numerical matrix and out-of-range values (#11)
1 parent 86caef6 commit 8de1547

File tree

3 files changed

+13
-3
lines changed

3 files changed

+13
-3
lines changed

src/common.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
jpeg_components(::AbstractArray{T}) where T = jpeg_components(T)
22
jpeg_components(::Type{CT}) where CT<:Colorant = length(CT)
3-
jpeg_components(::Type{T}) where T<:Number = 1
43

54
jpeg_color_space(::AbstractArray{T}) where T = jpeg_color_space(T)
65
jpeg_color_space(::Type{CT}) where CT<:Gray = LibJpeg.JCS_GRAYSCALE

src/encode.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@ julia> buf = jpeg_encode(img); length(buf) # directly write to memory
4040
4141
- [1] [libjpeg API Documentation (libjpeg.txt)](https://raw.githubusercontent.com/libjpeg-turbo/libjpeg-turbo/main/libjpeg.txt)
4242
"""
43-
function jpeg_encode(img::AbstractMatrix; transpose=false, kwargs...)
43+
function jpeg_encode(img::AbstractMatrix{T}; transpose=false, kwargs...) where T<:Union{Real, Colorant}
4444
# quantilized into 8bit sequences first
45-
AT = Array{n0f8(eltype(img)), ndims(img)}
45+
CT = T <: Colorant ? n0f8(eltype(img)) : Gray{N0f8}
46+
AT = Array{CT, ndims(img)}
47+
clamp01nan!(img)
4648
# jpegturbo is a C library and assumes row-major memory order, thus `collect` the data into
4749
# contiguous memeory layout already makes a transpose.
4850
img = transpose ? convert(AT, img) : convert(AT, PermutedDimsArray(img, (2, 1)))

test/tst_encode.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,15 @@ img_rgb = testimage("lighthouse")
1414
@test data == decode_encode(img, transpose=false)
1515
@test decode_encode(img, transpose=true) == decode_encode(img', transpose=false)
1616
end
17+
18+
# numerical array is treated as Gray image
19+
img = Gray.(img_rgb)
20+
@test jpeg_encode(Float32.(img)) == jpeg_encode(img)
21+
22+
# out-of-range values are mapped into [0, 1]
23+
img_or = 1.5 .* img
24+
img_or[1] = Gray(NaN)
25+
@test jpeg_encode(img_or) == jpeg_encode(Float64.(img_or)) == jpeg_encode(clamp01nan!(img_or))
1726
end
1827

1928
# keyword checks

0 commit comments

Comments
 (0)