Załadowanie grafiki z TBitmap do TImage

0

Witam

Na wstepie zaznacze ze jestem wielki nooob i mam taki o to problem. Mam sobie funkcje ktora zwraza obrazek zaladowany z dysku typu TPicture(<= Nie wiem moze trzeba dac inny typ)

function Obrazek(Sciezka: String): TPicture;
begin
   Result.LoadFromFile(Sciezka);
end;

Teraz polozylem na formie komponent typu TImage i chcce do niego zaladowac obrazek z Powyzszej funcji "Obrazek"

   Image1.Picture := Obrazek('c:\obrazki\xxx.png');

No zle to nie dziala. Probowalem jeszcze z TBitMap i tez nie idzie?

2
function Obrazek(Sciezka: String): TPicture;
begin
   //Result:=TPicture.Create; // to by uratowało sprawę ale kto będzie to zwalniać?
   Result.LoadFromFile(Sciezka); // nie możesz tego zrobić bo Result jest jakimś śmieciowym wskaźnikiem
end;

Może coś w ten deseń:

procedure Obrazek(pic:TPicture;Sciezka: String);
begin
   pic.LoadFromFile(Sciezka);
end;

Obrazek(Image1.Picture,'c:\obrazki\xxx.png');
0

No w sumie moze byc procedura zamiast funkcji. Ale jak ja bym chcial funkcje ktora by zwracala TBitMap(< bo rozumiem ze zmienna tego typu trzyma obrazek bez zadnych komponentow) to jak to zaladowac do TImage?

1

W końcu bitmap czy PNG bo obrazki PNG są obsługiwane dopiero w nowszych wersjach Delphi do starszych trzeba zewnętrze komponenty np TPNGImage.
Samo załadownie z TBitmap do TImage robi się za pomocą Assign np:

var
  bmp: TBitmap;
begin
  bmp:= TBitmap.Create;
  try
  bmp.LoadFromFile('d:\test.bmp');
  Image1.Picture.Bitmap.Assign(bmp);
  finally
  bmp.Free;
  end;
end;

Tylko przecież jest metoda LoadFromFile która pozwala załadować obrazek bezpośrednio coś w stylu:

Image1.Picture.Bitmap.LoadFromFile('sciezka');

Wszystko zależy od tego jakiego typu to jest grafika (bitmapa, jpg, gif czy tam png) i od wersji Delphi.

0

Assign tez nie dziala? Moze dlatego ze TBitmap trzyma tylko bmp, a ja mam pliki graficzne png? To jak to inaczej zaladowac? Zapomnialem dodac, ze mam jakiegos starego Lazarusa a nie Delphi i bezposrednio TImage przy uzyciu procedury LoadFromFile wczytuje sie normalnie ale ja musze miec ta grafike w zmiennej w rekordzie i nie bede co chwile pisal LoadFromFile.

0

Jeszcze raz napisze o co mi chodzi ze wszystkimi szczegolami. Pisze sobie BOOTA do gry w pokera bo kalkulatory mnie znudzily i zatrzymalem sie na "wylosowaniu karty" gdzie w rekordzie beda trzy zmienne, czyli - 10 czy as, jej kolor i grafike z karta gdzie posciagalem cala talie

type
  TKarta = record 
    Karta: String; // 12, as, krol
    Kolor: String; // kolor trefl, caro...itd
    Obrazek: TBitMap; // czyli mam tutaj trzymac odpowiedni plik graficzny z wylosowana karta
end

Teraz funkcja LosowaKarta:

function LosowaKarta : TKarta;
var
  Sciezka : String;
begin
  //Losowanie napisze potem tylko chodzi mi aby cos zwracalo
  Result.Karta :='As'
  Result.Kolor := 'Trefl';
  Sciezka := ExtractFileDir(Application.Exename) + '\Karty\' + Result.kolor + '\' + Result.Numer + '.png';
  Result.Obrazek.LoadFromFile(Sciezka); // Czyli laduje mi plik graficzny z odpowiednia karta
end; 

i losuje ta karta:

 
  form1.caption := LosowaKarta.Karta +LosowaKarta.Kolor;
  Image1.Picture.Bitmap.Assign(LosowaKarta.Obrazek);
  // i nie zwraca kompilator zadnych bledow tylko sie wiesza a chce zeby mi to w wylosowana karte pokazac na formie?
0

No probowalem. Przeciez mam

0

Jest fajny komponent z gotowymi kartami, powinien być nadal na torry.net - poszukaj. Ewentualnie poczekaj do jutrzejszego wieczora. Kiedy będę w domu, upewnie się jaką to miało nazwę i czy jest to nadal dostępne, ewentualnie wrzucę.

0

Ja jak bawiłem się z kartami to miałem:

const TaleSize=13*4;
type TCard =0..TaleSize-1

function RandomCard:TCard;
begin
   Result:=Random(TaleSize);
end;

function CardNumber(C:TCard):String;
const Numbers:array[0..12]of String=('2','3','4','5','6','7','8','9','10','J','Q','K','A');
begin
   Result:=Numbers[(C)shr(2)]; // Można (C)div(4)
end;

function CardSuit(C:TCard):String;
const Suits:array[0..3]of String=('♥','♦','♣','♠');
begin
   Result:=Suits[(C)and(3)]; // Można (C)mod(4)
end;

procedure CardDraw(C:TCard;Canvas:TCanvas;Y,X:Position);
var Bmp:TBitmap; // przeważnie w klasie formatki
begin
  Bmp:=TBitmap.Create; // Przeważnie w konstruktorze formatki
  try
    Bmp.LoadFromFile('Tale.bmp'); // Przeważnie w konstruktorze formatki, Obrazek ma wszystkie karty w pionie 4 kolory w kolejności jak w CardSuit w poziomie karty jak w CardNumber
    Canvas.CopyRect
    (
      Bounds(X,Y,CardWidth,CardHeight),  // CardWidth,CardHeight - rozmiary bitmapy na obrazku Tale.bmp
      Bmp.Canvas,
      Bounds(((C)shr(2))*CardWidth,((C)and(3))*CardHeight,CardWidth,CardHeight)
    );
  finally
    Bmp.Free; // przeważnie w destruktorze formatki
  end;
end;

//Ewentualnie wrzucenie do TImage
Image1.Picture.Bitmap.Width:=CardWidth;
Image1.Picture.Bitmap.Height:=CardHeight;
CardDraw(RandomCard,Image1.Picture.Bitmap.Canvas,0,0);
0
ktosik777 napisał(a):

bezposrednio TImage przy uzyciu procedury LoadFromFile wczytuje sie normalnie ale ja musze miec ta grafike w zmiennej w rekordzie i nie bede co chwile pisal LoadFromFile.

A dlaczego by nie? Przecież system tylko za pierwszym razem załaduje grafikę z dysku a potem będzie korzystał z cache.

Do obiektu TBitmap nie da się wprost załadować grafiki z pliku png.
Może dla Ciebie będzie najprościej przechowywać te grafiki w niewidocznych TImage na formie zamiast w TBitmap, z którymi sobie nie radzisz.

0
pelsta napisał(a)

Może dla Ciebie będzie najprościej przechowywać te grafiki w niewidocznych TImage na formie zamiast w TBitmap, z którymi sobie nie radzisz.

Nie no bez przesady - to nie jest rozwiązanie problemu...

ktosik777 napisał(a)

Moze dlatego ze TBitmap trzyma tylko bmp, a ja mam pliki graficzne png?

Powiedz jak chcesz trzymać obraz PNG w bitmapie? Przecież to nie ma sensu; Albo przygotuj grafikę w innym formacie (np. bmp) albo pobierz odpowiedni komponent, który załaduje PNG; Komponent TPNGImage byłby do teco celu dobry - nie musisz kłaść go na formularzu żeby móc z niego korzystać;

Tak poza tym - skoro korzystasz z OOP to napisz sobie klasę obsługującą talię kart; Załaduj w niej grafikę i napisz kilka metod, które są Ci potrzebne; Korzystaj z klas, a nie z mnóstwa rozproszonych procedur i funkcji; To chyba nie będzie dla Ciebie trudne?

0

Jakby co, to komponent, o którym wspominałem można pobrać z: http://www.torry.net/vcl/misc/games/tchipv1.zip

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