Problem z funkcją zwracającą TBitmap

0

No to, jak mam taką funkcję...

function SpinBitmap(Obraz: TBitmap): TBitmap;
var X, Y : Integer;
begin
  for X := 0 to Obraz.Width - 1 do
    for Y := 0 to Obraz.Height - 1 do
      Result.Canvas.Pixels[Obraz.Width - 1 - X, Y] := Obraz.Canvas.Pixels[X, Y];
end;

...to mi wywala Acces Violation.

Jak dodam

Result := TBitmap.Create;
[...]
Result.Free

To też kończy się błędem.

Za to jak dodam samo

Result := Tbitmap.Create;

To nie wywala za to zwraca pusty obrazek.
Przynajmniej tak mi się wydaje, bo przy wywołaniu...

Image1.Picture.Bitmap := SpinBitmap(Image1.Picture.Bitmap);

...obrazek znika. Czemu?

PS; Ta funkcja ma odbić obrazek w poziomie.

0
TomRiddle napisał(a)

No to, jak mam taką funkcję...

function SpinBitmap(Obraz: TBitmap): TBitmap;
var X, Y : Integer;
begin
  for X := 0 to Obraz.Width - 1 do
    for Y := 0 to Obraz.Height - 1 do
      Result.Canvas.Pixels[Obraz.Width - 1 - X, Y] := Obraz.Canvas.Pixels[X, Y];
end;

...to mi wywala Acces Violation.

Jak dodam

Result := TBitmap.Create;
[...]
Result.Free

To też kończy się błędem.

To po co zwalniasz bitmapę ona powinna być zwolniona jak nie będzie już potrzebna poza funkcją.

TomRiddle napisał(a)

Za to jak dodam samo

Result := Tbitmap.Create;

To nie wywala za to zwraca pusty obrazek.
Przynajmniej tak mi się wydaje, bo przy wywołaniu...

Image1.Picture.Bitmap := SpinBitmap(Image1.Picture.Bitmap);

...obrazek znika. Czemu?

PS; Ta funkcja ma odbić obrazek w poziomie.

No widzisz bo bitmapa ma wymiary Twoja ma zerowy rozmiar trzeba w funkcji:

Result:= TBitmap.Create;
Result.Width:= Obraz.Width;
Result.Height:= Obraz.Height;

i dopiero można działać.

Poza tym zerknij http://4programmers.net/Delphi/Gotowce/ScanLine_-_kontrast,_nasycenie,_negatyw,_przyciemnienie,_rozja%C5%9Bnienie,_rozmycie,_sepia,_skala_szaro%C5%9Bci,_wykucie,wyp%C5%82owienie,_zamiana_RGB_i_inne..
tam te funkcje są lepiej wykonane (używają ScanLine)

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