On Tuesday, 12 December 2017 at 07:12:07 UTC, Dmitry wrote:
On Tuesday, 12 December 2017 at 06:27:30 UTC, Ivan Trombley wrote:
This isn't a scaling problem (which is totally solved by
Scaling is not a prerequisite for this problem.

pre-multiplying the alpha with the colors BTW). This is a gamma
How did you this? Using editor or using shader? If shder, show the code.
Can you share both images? I want to check.

correction problem which is solved only by converting the color values to linear color space before compositing and then converting the final pixel back to sRGB.

Are you sure in that? Because what I see is typical alpha blending problem.

Here's the code that produces the correct results (exactly the same as GIMP):


    auto bk =IMG_Load(toStringz(folder ~ "/background.png"));
    auto fg =IMG_Load(toStringz(folder ~ "/image.png"));
    enum c = (1.0f / 255.0f);
    enum g = 2.2f;
    enum ig = (1.0f / 2.2f);
    immutable int x = (bk.w - fg.w) / 2;
    immutable int y = (bk.h - fg.h) / 2;
    auto dst = cast(ubyte*) bk.pixels + y * bk.pitch + x * 3;
    immutable size_t add = bk.pitch - fg.w * 3;
    auto src = cast(ubyte*) fg.pixels;
    const auto max = src + fg.h * fg.pitch;
    while (src < max)
    {
      const auto line = dst + fg.w * 3;
      while (dst < line)
      {
        immutable float a = c * src[3];
dst[0] = cast(ubyte)(((1 - a) * (dst[0] * c) ^^ g + a * (src[0] * c) ^^ g) ^^ ig * 255); dst[1] = cast(ubyte)(((1 - a) * (dst[1] * c) ^^ g + a * (src[1] * c) ^^ g) ^^ ig * 255); dst[2] = cast(ubyte)(((1 - a) * (dst[2] * c) ^^ g + a * (src[2] * c) ^^ g) ^^ ig * 255);
        src += 4;
        dst += 3;
      }
      dst += add;
    }

Reply via email to