jpg na bmp i obracanie

0

Witam. Chcę zrobić coś takiego: do filelistboxa mam załadowane obrazki o rozszerzeniach png, jpeg i gif, następnie, gdy zostanie wybrana opcja obrotu obrazka chcę aby odczytało mi rozszerzenie pliku i o ile to możliwe przekonwertowało go na bmp, dalej to już było by z górki :) poniżej procedura do obracania i moje próby konwertowania do bmp...

obrót:

Procedure TurnImage(var Src : TImage; CCW : integer);
var
  x, y : integer;
  Dst : TImage;
  BitM : TBitmap;
begin
  Dst := TImage.Create(nil);
  Dst.Width:= Src.Picture.Height;
  Dst.Height:= Src.Picture.Width;

  if Src.Picture.Bitmap = nil then
    BitM := TBitmap.Create;
    BitM.Assign(TBitmap(Src.Picture.Graphic));
    Src.Picture.Bitmap.Assign(BitM);

  if CCW = 0 then // w prawo
    for x:= 0 to Src.Picture.Height do
      for y:= 0 to Src.Picture.Width do
        Dst.Canvas.Pixels[x,y]:= Src.canvas.pixels[y, Src.Picture.Height-x-1];

  if CCW = 1 then // w lewo
    for x:= 0 to Src.Picture.Height do
      for y:= 0 to Src.Picture.Width  do
        Dst.Canvas.Pixels[x,y]:= Src.Canvas.Pixels[Src.Picture.Width-y-1, x];
  Src.Picture.Bitmap := Dst.Picture.Bitmap;
  Dst.Free;
end;

moje wypociny:

procedure TForm1.Obrto90wprawo1Click(Sender: TObject);
var
  jpg:TJPEGimage;
  bmp:TBitmap;
begin
  if filelistbox1.FileName='.jpg' then
    begin
      jpg:=TJPEGimage.Create;
      bmp:=TBitmap.Create;

      jpg.LoadFromFile(filelistbox1.FileName);
      bmp.Assign(jpg);
      image1.Picture.Bitmap:=bmp;
      turnimage(image1,0);
    end;
end;
0
  1. ExtractFileExt()
  2. lowerCase() - przy porownywaniu rozszerzenia. jak plik bedzie sie nazywal "ppp.JPG" a porownasz jego rozszerzenie z ".jpg" to zawsze dostaniesz false, bo roznia sie wielkosciami liter.
  3. zeby zaladowac png potrzebujesz komponentu do jego obslugi - poszukaj.
  4. to obracanie.... oparte na pixels[] bedzie cholernie wolne, do takich rzeczy sie nie uzywa pixels[] tylko scanline. gotowe, szybkie procki do obrotu o dowolny kat tez znajdziesz w necie.
0

Dzięki, pomogło ;)

Znalazłem też procedurę ze scanline. W miarę krótka, lecz działa tylko z obracaniem w prawo i za nic nie mogę dojść do tego, jak ją przekształcić na obracanie w lewo ;(

procedure Rotate(bmp:TBitmap);
type
  TRGB = packed record
                b,g,r:byte;
                end;
  TRGBArray = array[0..32767]of TRGB;
  PRGBArray = ^TRGBArray;
var
  x,y,w,h : integer;
  pSrc : PRGBArray;
  tmp : TBitmap;
  pDstArr : array[0..2000]of PRGBArray; {i tak normalna bitmapa nie
    bedzie wyzsza niz na 20tys pix wiec nie przydzielam dynamicznie tylko na
    sztywno}
begin
  w:= bmp.Width;
  h:= bmp.Height;
  tmp:= TBitmap.Create;
  tmp.Assign(bmp);
  bmp.Width:= h;
  bmp.Height:= w;

  for x:=0 to w-1 do
    pDstArr[x] := bmp.ScanLine[x];

  for y:=0 to h-1 do
    begin
      pSrc:= tmp.ScanLine[y];
      for x:=0 to w-1 do
        pDstArr[x][h-y-1] := pSrc[x];
    end;
  tmp.Free;
end;
0

a ja wpisalem w googlach delphi bitmap rotate scanline
co do przydzielania rozmiaru tablicy.... :| bez komentarza.

0

czego ja nie wpisywałem ;) zależy mi na zrozumieniu, jak przerobić to na obracanie w lewo, a programowaniem zajmuje się dopiero kilka miesięcy i jestem zielony bardzo, dlatego proszę o pomoc

0

kazdy robi jak chce, ale ja mam inne podejscie... jak pisze program i mam gotowa sprawdzona funkcje/procedure to sie nie zaglebiam jak dziala. zaczne sie zaglebiac w kod dopiero jak przestanie mi wystarczac i bedzie trzeba ja przerobic.

co do obracania w lewo:

  for y:=0 to h-1 do
    begin
      pSrc:= tmp.ScanLine[y];
      for x:=0 to w-1 do
        pDstArr[x][y] := pSrc[(w-1)-x];
    end;

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