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.
上也许这是代码中的错误。
图像文件具有标题。请参阅文件说明或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
我希望我没有犯任何错误。但是我想您还是会明白这一点的。