LINUX.ORG.RU

помогите сконвертить из паскаля в Си


0

0

я В паскале - ноль :) нужно срочно перевести в Си эту процедуру

исходник:

procedure Gamma(Bitmap: TBitmap; L: Double);
{0.0 < L < 7.0}
  function Power(Base, Exponent: Extended): Extended;
  begin
    Result := Exp(Exponent * Ln(Base));
  end;
type
  TRGB = record
    B, G, R: Byte;
  end;
  pRGB = ^TRGB;
var
  Dest: pRGB;
  X, Y: Word;
  GT: array[0..255] of Byte;
begin
  Bitmap.PixelFormat := pf24Bit;
  GT[0] := 0;
  if L = 0 then
    L := 0.01;
  for X := 1 to 255 do
    GT[X] := Round(255 * Power(X / 255, 1 / L));
  for Y := 0 to Bitmap.Height - 1 do
  begin
    Dest := Bitmap.ScanLine[y];
    for X := 0 to Bitmap.Width - 1 do
    begin
      with Dest^ do
      begin
        R := GT[R];
        G := GT[G];
        B := GT[B];
      end;
      Inc(Dest);
    end;
  end;
end;

Спасибо.
anonymous

Как я понимаю тут алгоритм какого-то простенького преобразования цветов. Судя по названию корекции гаммы ( в терминах не секу, надеюсь интитивно понятно о чем я ).

Логика работы примерно следующая: На вход поступает картинка, представляющая набор пикселей закодированных в виде RGB составляющих, и некоторый коэфициент характеризующий сепень L корекции гаммы (L > 1 - ярче, L < 1 - темнее).

Сначала расчитывается таблица задающая соответствия между текущими и скоректированными значениями составляющих RGB . Вот этот кусок:

GT[0] := 0;

if L = 0 then

L := 0.01;

for X := 1 to 255 do

GT[X] := Round(255 * Power(X / 255, 1 / L));

Нотация обозначений должна быть понятна. Функция Round - арфиметическое округление числа, Power(x,y) - возведение x в степень y.

Затем полученное соответсвие применяется к исходной картинке.

with Dest^ do

begin

R := GT[R];

G := GT[G];

B := GT[B];

end;

В этом месте цветовые составляющие текущего пикселя (на которые указывает указатель Dest), меняются на скоректированные в соответсвии с таблицей соответствия.

Inc(Dest);

Перемещение указателя на следующий элемент.

Переводить не буду ибо неохота. Но суть я думаю ясно.

ukez
()

struct TRGB { unsigned char R,G,B; }
void Gamma(TBitmap Bitmap, double L)
{
  struct TRGB* Dest;
  unsigned int X,Y;
  unsigned char GT[255];

  Bitmap.PixelFormat = pf24Bit;
  GT[0] = 0;
  if (L == 0) L = 0.01;
  for (X = 0; X < 255; ++X)
    GT[X] = round(255 * pow(X / 255, 1 / L));

  for (Y = 0; Y < Bitmap.Height; ++Y) {
    Dest = Bitmap.ScanLine[y];
    for (X = 0; X < Bitmap.Width; ++X) {
      Dest->R = GT[R];
      Dest->G = GT[G];
      Dest->B = GT[B];
      ++Dest;
    }
  }
}
Возможны ошибки, причем логические :) набираю в мозилле :)

phoenix ★★★★
()

ага! всё работает! Всем спасибо, в т.ч. и за ссылку.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.