在TGA二进制文件中搜索像素位置

问题描述 投票:-1回答:1
function CImageTGA:GetDepth()
    self.file:setPos(16);
    return self.reader:ReadUInt8(); 
end

-- first block skipping (and skip Description + IdLeight)
function CImageTGA:SkipFirstBlock()
    local IdLeightSize = self:GetIdLeight();
    return 16 + IdLeightSize + 1
end

function CImageTGA:GetPixel(x,y)
    local BitsPerPixel = self:GetDepth()
    local GetImageSize = self:GetImageSize();
    local HeaderSize = self:SkipFirstBlock(); -- header 18 bytes [0..17]
    x,y = bitOr(x, 0), bitOr(y, 0);
    -- COLOR
    do
        local offset = ( y * GetImageSize.x + x ) * 4;
        iprint('x: ', x, 'y: ', y, 'offset: ', offset)

            self.file:setPos(HeaderSize + offset + 0);
        local R = self.reader:ReadUInt8();
            self.file:setPos(HeaderSize + offset + 1);
        local G = self.reader:ReadUInt8();
            self.file:setPos(HeaderSize + offset + 2);
        local B = self.reader:ReadUInt8();

        -- return { 255 - R, 255 - G, 255 - B };
        return { R, G, B };
    end
    return false;
end

我想在读取二进制文件的颜色后获取其位置/以后再更改它。因为我仍然不了解如何正确地在X,Y中找到位置。而且,在将像素颜色转换为RGB时需要帮助,因为如果颜色实际上是255、0、0,则它将显示在 GetPixel (0,0) = 0, 255, 255.上也许这是代码中的错误。

lua
1个回答
0
投票

图像文件具有标题。请参阅文件说明或https://en.wikipedia.org/wiki/Truevision_TGA

它包含有关文件的一些信息。标题后跟实际图像数据。

我将标题字节命名为H。然后您的图像看起来像:

HHHHHHHHHHHHHHHHHHRGBARGBARGBARGBA...

代码显示了如何计算偏移量,因此您将知道所需的信息是哪个字节。

简单示例:10x10 32位图像。

我们想要绿色值

(x,y) = (2, 20)

文件中该位置的偏移量是:

headersize + (10 * 20 + 2) * 4 + 1

因为我们必须跳过标题(18个字节)。我们每个像素有4个字节,因此行内的偏移量是2*4=8,然后我们必须跳过20个包含10个像素的行,每个像素4个字节。这是另一个20 * 10 * 4 = 800字节。

所以在偏移量18 + 800 + 8是我们像素的RGBA像素。

offset 826 -> R
offset 827 -> G
offset 828 -> B
offset 829 -> A

我希望我没有犯任何错误。但是我想您还是会明白这一点的。

© www.soinside.com 2019 - 2024. All rights reserved.