Skip to content

Commit fa69f60

Browse files
committed
gdal raster blend: fix alpha computation
1 parent 3b5aa84 commit fa69f60

File tree

2 files changed

+20
-16
lines changed

2 files changed

+20
-16
lines changed

apps/gdalalg_raster_blend.cpp

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -816,14 +816,6 @@ CPLErr BlendBand::IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff,
816816
for (int i = 0; i < nBufXSize;
817817
++i, ++nSrcIdx, nDstOffset += nPixelSpace)
818818
{
819-
const int nOverlay =
820-
(pabyOverlayR && pabyOverlayG && pabyOverlayB)
821-
? RGBToGrayScale(pabyOverlayR[nSrcIdx],
822-
pabyOverlayG[nSrcIdx],
823-
pabyOverlayB[nSrcIdx])
824-
: pabyOverlay ? pabyOverlay[nSrcIdx]
825-
: 255;
826-
827819
// Corrected to take into account m_opacity255Scale
828820
const int nOverlayA =
829821
pabyOverlayA ? ((pabyOverlayA[nSrcIdx] *
@@ -832,22 +824,34 @@ CPLErr BlendBand::IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff,
832824
256)
833825
: m_oBlendDataset.m_opacity255Scale;
834826

835-
const int nSrc = paby ? paby[nSrcIdx] : 255;
836827
const int nSrcA = pabyA ? pabyA[nSrcIdx] : 255;
837828

838829
const int nSrcAMul255MinusOverlayA =
839830
(nSrcA * (255 - nOverlayA) + 255) / 256;
840-
int nDst = (nOverlay * nOverlayA +
841-
nSrc * nSrcAMul255MinusOverlayA + 255) /
842-
256;
831+
const int nDstA = nOverlayA + nSrcAMul255MinusOverlayA;
843832
if (nBand != 4)
844833
{
845-
const int nDstA = nOverlayA + nSrcAMul255MinusOverlayA;
834+
const int nOverlay =
835+
(pabyOverlayR && pabyOverlayG && pabyOverlayB)
836+
? RGBToGrayScale(pabyOverlayR[nSrcIdx],
837+
pabyOverlayG[nSrcIdx],
838+
pabyOverlayB[nSrcIdx])
839+
: pabyOverlay ? pabyOverlay[nSrcIdx]
840+
: 255;
841+
842+
const int nSrc = paby ? paby[nSrcIdx] : 255;
843+
int nDst = (nOverlay * nOverlayA +
844+
nSrc * nSrcAMul255MinusOverlayA + 255) /
845+
256;
846846
if (nDstA != 0 && nDstA != 255)
847847
nDst = (nDst * 255 + (nDstA / 2)) / nDstA;
848+
pabyDst[nDstOffset] =
849+
static_cast<GByte>(std::min(nDst, 255));
850+
}
851+
else
852+
{
853+
pabyDst[nDstOffset] = static_cast<GByte>(nDstA);
848854
}
849-
pabyDst[nDstOffset] =
850-
static_cast<GByte>(std::min(nDst, 255));
851855
}
852856
}
853857
}

autotest/utilities/test_gdalalg_raster_blend.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ def test_gdalalg_raster_blend_src_over():
510510
) as alg:
511511
out_ds = alg.Output()
512512
assert out_ds.RasterCount == 4
513-
assert struct.unpack("B" * 4, out_ds.ReadRaster()) == (177, 201, 229, 249)
513+
assert struct.unpack("B" * 4, out_ds.ReadRaster()) == (177, 201, 229, 254)
514514

515515
with gdal.Run(
516516
"raster",

0 commit comments

Comments
 (0)