Scalanie obrazków w jeden

Scalanie obrazków w jeden
0

Witam,
mam pytanie jak można w prosty sposób (ale wydajny)
scalić kilka plików JPG (wyższa jakość - pliki po 1 mb i więcej) w jeden plik.
czyli z 3 plikow otrzymamy 1 plik o tej samej szerokosci, ale o wysokosci 3 razy wiekszej.

Pozdrawiam

edytowany 1x, ostatnio: flowCRANE
0

tzn. o co ci chodzi? Masz 3 obrazki i chcesz je narysować na jednym płótnie jeden pod drugim? (np. funkcją Draw podając pozycję coraz niższe?) czy co? Napisz co próbowałeś zrobić, łatwiej ci ludzie pomogą.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 13 godzin
2
Kopiuj
var Jpg:TJPEGImage;
var BmpA,BmpB,BmpC,Bmp:TBitmap;

Jpg:=TJPEGImage.Create;
Jpg.LoadFromFile('1.jpg');
BmpA:=TBitmap.Create;
BmpA.Assign(Jpg);
Jpg.LoadFromFile('2.jpg');
BmpB.Assign(Jpg);
Jpg.LoadFromFile('3.jpg');
BmpC.Assign(Jpg);
Bmp:=TBitmap.Create;
Bmp.Height:=BmpA.Height+BmpB.Height+BmpC.Height;
Bmp.Width:=BmpA.Width;
Bmp.Canvas.Draw(0,0,BmpA);
Bmp.Canvas.Draw(0,BmpA.Height,BmpB);
Bmp.Canvas.Draw(0,BmpA.Height+BmpB.Height,BmpC);
BmpA.Free;
BmpB.Free;
BmpC.Free;
Jpg.Assign(Bmp);
Bmp.Free;
Jpg.SaveToFile('123.jpg');
Jpg.Free;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
Opi
A jak byś miał 100 obrazków, to byś utworzył 101 zmiennych TBitmap? Pomysłowe rozwiązanie, jeśli profesor zada to zrobić bez pętli.
_13th_Dragon
Dla 100 obrazków trzeba by było użyć jakiegoś TStrings dla pobierania nazw zmiennych, sadząc po pytaniu autor tematu nie zrozumiał by co to za TStrings i skąd ma go wziąć.
babubabu
  • Rejestracja:około 13 lat
  • Ostatnio:3 miesiące
  • Lokalizacja:Łódź
  • Postów:648
1
Kopiuj
Bmp.Free;
Jpg.Assign(Bmp)

access violation?

edytowany 1x, ostatnio: babubabu
0

Dziękuję bardzo mi to pomaga. Rozwiązanie OK.
Sprawdziłem dla 3 plików jpg ok. 300kb i działa, muszę jeszcze sprawdzić jutro czy np scalenie 3 plików po 5 mb nie będzie problemem...

Zobacz pozostałe 4 komentarze
flowCRANE
Chodzi o JPEG i sądzę, że na dobrym sprzęcie było by to możliwe ;)
flowCRANE
Oglądałem kiedyś program o firmie, która zajmuje się produkcją satelit; W tych satelitach instalują aparat z matrycą o rozdzielczości 8 milionów megapikseli - ciekawe jaką ma rozdzielczość i jaki jest rozmiar zdjęcia :>
_13th_Dragon
Przy 4x3 - 3424636 x 2568477; Przy 16x9 -3954432 x 2224368;
flowCRANE
Gdyby liczyć jako jeden plik to tak, ale jedno zdjęcie na pewno jest dzielone na mniejsze sekcje chyba, że korzystają z innych formatów niż JPEG ;)
_13th_Dragon
Może dzielą a może nie, w każdym razie efekt można obejrzeć na Google Earth.
0

Wiem co to jest TStrings :D

Mam pytanie a jak zrobić, gdy na wejściu są 3 obrazy, ale o orientacji poziomej, zeby scaliło je tak, że wszystkie będą pionowo scalone(obrocone jakby)?

babubabu
Normalnie. Bierzesz i scalasz :) Gotowca jednego już dostałeś na kolejnego nie licz.
0

Zastanawia mnie czy jedyne wyjście to BMPA BMPB i BMPC obrócic o 90 stopni przed scaleniem?

Piszę ze szkoły, nie mam pod ręką delphi zeby sprawdzic swoje przypuszczenia, stąd pytam, żeby wieczorem już wiedziec co i jak.

pelsta
W szkole lepiej skup się na lekcji.
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:33 minuty
  • Lokalizacja:Tuchów
  • Postów:12171
0

A po co komplikować sobie życie i marnować czas procesora na obracanie? Przecież za rozmiary obrazu docelowego odpowiadają te dwie linijki:

Kopiuj
Bmp.Height := BmpA.Height + BmpB.Height + BmpC.Height;
Bmp.Width  := BmpA.Width;

więc zamiast rozciągania w dół - rozciąg w prawo:

Kopiuj
Bmp.Height := BmpA.Height;
Bmp.Width  := BmpA.Width + BmpB.Width + BmpC.Width;

i narysuj po kolei wszystkie trzy wykorzystując offset poziomy zamiast pionowego;


Jednak ten algorytm będzie poprawny jedynie dla plików o tych samych rozmiarach, czyli przy:

  • scalaniu pionowym gdy wszystkie obrazy mają tą samą szerokość,
  • scalaniu poziomym gdy wszystkie obrazy mają tą samą wysokość,
    w innym przypadku obrazy albo zostaną przycięte, albo pojawią się puste przestrzenie (prawdopodobnie białego koloru).

Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
0

Niestety lub stety rozciąganie musi być pionowe.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:33 minuty
  • Lokalizacja:Tuchów
  • Postów:12171
0

Mam pytanie a jak zrobić, gdy na wejściu są 3 obrazy, ale o orientacji poziomej, zeby scaliło je tak, że wszystkie będą pionowo scalone(obrocone jakby)?

A to nie można scalić poziomo i wtedy raz obrócić wynikowy obraz?


What is the fastest way to rotate a jpg image file?


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
0

teoretycznie mozna, wlasnie o to mi chodzilo :)

flowCRANE
A wystarczyło przeszukać Google;

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.