Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Трансляция кода

4.8K
02 декабря 2008 года
Neighbour
43 / / 15.03.2005
Пишу программу обработки изображений (фильтры и т.д.) в рамках лабораторной в институте. Одно из заданий - преобразовать изображение в HSL представление сделать S максимальным для каждого пикселя, затем преобразовать обратно в RGB и вывести результат.
Нашел пример перевода в HSL и обратно в RGB на easyrgb.com. Вот исходник:
Код:
var_R = ( R / 255 )                     //RGB from 0 to 255
var_G = ( G / 255 )
var_B = ( B / 255 )

var_Min = min( var_R, var_G, var_B )    //Min. value of RGB
var_Max = max( var_R, var_G, var_B )    //Max. value of RGB
del_Max = var_Max - var_Min             //Delta RGB value

L = ( var_Max + var_Min ) / 2

if ( del_Max == 0 )                     //This is a gray, no chroma...
{
   H = 0                                //HSL results from 0 to 1
   S = 0
}
else                                    //Chromatic data...
{
   if ( L < 0.5 ) S = del_Max / ( var_Max + var_Min )
   else           S = del_Max / ( 2 - var_Max - var_Min )

   del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max
   del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max
   del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max

   if      ( var_R == var_Max ) H = del_B - del_G
   else if ( var_G == var_Max ) H = ( 1 / 3 ) + del_R - del_B
   else if ( var_B == var_Max ) H = ( 2 / 3 ) + del_G - del_R

   if ( H < 0 ) ; H += 1
   if ( H > 1 ) ; H -= 1
}

Перевожу его на Delphi:

procedure TForm1.mnuMaxSaturationClick(Sender: TObject);
 type
   TRGBTripleArray = array[0..10000] of TRGBTriple;
   PRGBTripleArray = ^TRGBTripleArray;
 var
   SL: PRGBTripleArray;
   line,p: Integer;
   R, G, B, ColorMin, ColorMax, DeltaMax: Single;
   H, S, L: Single;
   DeltaR, DeltaG, DeltaB: Single;
 begin
   with Image1.Canvas do
   begin
     Brush.Style:= bsClear;
     Pixels[1, 1]:= Pixels[1, 1];
     for line:= 0 to Image1.Picture.Bitmap.Height - 1 do
     begin
       SL:= Image1.Picture.Bitmap.ScanLine[line];
       for p:= 0 to Image1.Picture.Bitmap.Width - 1 do
       begin
         R:= SL.rgbtRed/255;
         G:= SL.rgbtGreen/255;
         B:= SL.rgbtBlue/255;
         ColorMin:= Min(Min(R,G),B);
         ColorMax:= Max(Max(R,G),B);
         DeltaMax:= ColorMax-ColorMin;
         L:= (ColorMin+ColorMax)/2;
           if DeltaMax=0 then
             begin
             H:=0;
             S:=0;
             end
           else begin
             if L<0.5 then S:=DeltaMax/(ColorMin+ColorMax)
             else S:=(DeltaMax/(2-ColorMax-ColorMin));

             DeltaR:=(((ColorMax-R)/6)+(ColorMax/2))/DeltaMax;
             DeltaG:=(((ColorMax-G)/6)+(ColorMax/2))/DeltaMax;
             DeltaB:=(((ColorMax-B)/6)+(ColorMax/2))/DeltaMax;

             if R=ColorMax then
               H:=DeltaB-DeltaG
             else
               if G=ColorMax then
               H:=(1/3)+DeltaR-DeltaB
             else
               if B=ColorMax then
               H:=(2/3)+DeltaG-DeltaR;

             if H<0 then
               H:=H+1
             else
               if H>1 then
               H:=H-1
           end;
       end;
      end;
   end;
 end;


Почему-то переменная S вообще не изменяется (всегда равна 0). И компилятор выдает предупреждение, что переменная S never used, а переменная H может быть не определена. Помогите понять в чем причина.
Дополнительно прилагаю весь исходник
Заранее благодарен за помощь.
14
03 декабря 2008 года
Phodopus
3.3K / / 19.06.2008
Это действительно так. Переменная S нигде не используется, лишь вычисляется, а переменная H при определенных условиях может не получить начального значения. Сделай в конце ShowMessage(IntToStr(H)+' '+IntToStr(S)) и будет тебе пол-счастья.
6
03 декабря 2008 года
George
4.1K / / 05.01.2007
не, переменная S не используется и компилятор намекает, что нафига её тогда вычислять? Либо убать код с вычислением либо применить как надо, а не ShowMessage(:D). А насчет переменной H в начале процедуры лучше вставить
 
Код:
H := <DefaultValue>; // Значение по умолчанию. Если не знамо чого ставить, тогда нолег :)
14
03 декабря 2008 года
Phodopus
3.3K / / 19.06.2008
Ну дык ShowMessage() это и есть применение. Чтоб в дебаггере посмотреть что получается по ходу выполнения. А вот потом уже - применить как надо.
6
03 декабря 2008 года
George
4.1K / / 05.01.2007
ну если только так... :)
4.8K
03 декабря 2008 года
Neighbour
43 / / 15.03.2005
Спасибо, вроде разобрался, но все равно в этом месте:

 
Код:
if DeltaMax=0 then
             begin
             H:=0;
             S:=0;
             end


выдает [Hint] MainModule.pas(134): Value assigned to 'S' never used

Почему?

Большое спасибо откликнувшимся.
6
04 декабря 2008 года
George
4.1K / / 05.01.2007
гы. ты же переменной S значение присваиваешь? присваиваешь. а где ты ее потом используешь? зачем вообще ее объявил?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог