Obrazki - interpolacja dwuliniowa

0

Witm!

Mam pewien problem.
chcĘ zrobić program zmieniający rozdzielczość zdjęcia w zależności od jego wymiarów czyli np.
Mam dwa komponenty typu TEdit (Edit1 - szerokośćzdjęcia oraz Edit2 - wyoskość zdjęcia) i gdy wpiszę odpowiednie wartości do Eitów np. 90 x 120 pikseli, załaduje obrazek przy użyciu komponentów TOpenPictureDialog1 do ListBox1 i wcisnę button1 to wygeneruje mi się strona (kod) html z tym obrazkiem (już ze zmniejszoną rozdzielczością) w RichEdit1 (interpolacja dwuliniowa).
Proszę o pomoc.
Będe wdzieczny.

0

jezeli dobrze cie zrozumialem, to twoj problem jest banalny, zwykla operacja na stringach:

botton1.onclick()
begin
RichEdit1.Clear();
OpenDialog1->Execute();
RichEdit1.Lines.Add( "<IMG SRC='"+OpenDialog1.FileName+"' WIDTH="+Edit1.Text+" HEIGHT="+Edit2.Text+>");

end;

po zapisaniu tego kodu do pliku i "odpaleniu" w przegladarce internetowej twoim oczom ukaze sie obrazek, ktory wybrales o rozmiarze(rozdzielczosci) przez ciebie okreslonym, rowniez mozesz posluzyc sie procentami do okreslenia rozmiaru... odsylam do lektury jezyka html

0

wiesz co ... :[

  1. nie ort! dwóch języków C++ i Delphi ...

botton1.onclick()
begin
RichEdit1.Clear();
OpenDialog1->Execute();
RichEdit1.Lines.Add( "<IMG SRC='"+OpenDialog1.FileName+"' WIDTH="+Edit1.Text+" HEIGHT="+Edit2.Text+>");

  1. To co tu pokazałeś to tylko zmniejszyłeś rozmiar tego samego zdjęcie i jak się ten dokument otworzy w np. FrontPage- u i powiększysz tą "Miniaturkę" to zobaczysz, że ona ma taką samą rodzielczość co na początku, a miała być interpolacja dwuliniowa czyli zmiana rozdzielczości wraz ze ort! wielkości.

  2. A poza tym nie muszę się odowływać do żadnych ort!, bo to są podstawy.

Czekam dalej :( niech ktoś mi ort!

0

Czy naprawde nikt nie wie jak to zrobić ???

Dam przykład...
interpolacja dwuliniowa występuje w np. programie FrontPage jak sięrobi - autominiaturka.

Proszę o pomoc

0

Kod wyciety z programu, po niewielkich modyfikacjach powinien dzialac ;)

{-----------------------------------------------------------------------}
{ Skalowanie metodą interpolacji dwuliniowej
{-----------------------------------------------------------------------}
  procedure TForm1.ScalBilinearInterpolation(var sorc : TImage; var des : TImage);
  var i, j, c      : Integer;
      cx, cy, z, s : Integer;
      p, q, rx, ry : Single;
      ln           : PByteArray;
  begin
    { wyliczenie współczynników }
    p := des.Width/sorc.Width;
    q := des.Height/sorc.Height;
    { skalowanie }
    for j:=0 to des.Height-1 do begin
      Division(j/q, cy, ry);
      ln := des.Picture.Bitmap.ScanLine[j];
      c := 0;
      for i:=0 to des.Width-1 do begin
        Division(i/p, cx, rx);
        z := cx*3;
        if cx<sorc.Width-1 then s := z + 3 else s := z;
        ln[c+2] := BiLinearInterpolate(li[cy][z+2], li[cy][s+2], li[cy+1][z+2], li[cy+1][s+2], rx, ry); //red
        ln[c+1] := BiLinearInterpolate(li[cy][z+1], li[cy][s+1], li[cy+1][z+1], li[cy+1][s+1], rx, ry); //green
        ln[c]   := BiLinearInterpolate(li[cy][z]  , li[cy][s]  , li[cy+1][z]  , li[cy+1][s]  , rx, ry); //blue
        c := c + 3;
      end;
    end;
  end;

  function TForm1.BiLinearInterpolate(c1, c2, c3, c4 : Byte; dx, dy : Single):Byte;
  var a, b, c        : Single;
  begin
    { interpolacja wzdluz osi x }
    a := c1 + (c2-c1)*dx;
    b := c3 + (c4-c3)*dx;
    { interpolacja wzdluz osi y }
    c := a + (b-a)*dy;
    Result := Round(c);
  end;

  { rozbija liczbe rzeczywista num na calkowita full i czesc ułamkowa fraction }
  procedure TForm1.Division(num : Single; var full : Integer; var fraction : Single);
  begin
    full     := Trunc(num);
    fraction := num - full;
  end;
0

OK, czym jest li w pierwszej procedurze?

1 użytkowników online, w tym zalogowanych: 0, gości: 1