я бы написал для всей строки сразу: drawtext(s, maxw-getStringWidth(s),ypos);
где s - строка текста, maxw-граница правого края, ypos - у координата
и для посимвольного вывода:
var
cw : array[0..255] of integer;
i,p,c : integer;
begin
for i:=0 to 255 do cw[i]:=getStringWidth(chr(i));
// затем подставляем сюда ширину русского шрифт желательно в cp1251 (win) или cp866 (dos)
...
p:=maxw;
for i:=length(s)-1 downto 0 do
begin
c:=ord(getChar(s,i));
p:=p-cw[c];
... делаем преобразование русских символов в utf8 и выводим
drawtext(chr(c),p,ypos);
end;
___
p.s. png нужно оптимизировать, 500 кб слишком много. Лучше сразу делать графику под разрешение 176x208 (176x220) т.к. они наиболее распространены, или 128x128 чтоб работало практически везде.