TMemoryStream i ładowanie obrazka SaveToStream / LoadFromStream

0

Witam,

Mam problem, otrzymuję pusty plik i nie wiem gdzie tkwi błąd.

Wersja 1: działa dobrze i ładnie zapisuje do pliku:

 
TJPEGImage * jpg;
jpg = new TJPEGImage();
Graphics::TBitmap * bmp = new Graphics::TBitmap();

bmp->Assign(Image->Bitmap);
jpg->Assign(bmp);
jpg->SaveToFile(filename);

delete jpg;
delete bmp;

I dalej mam ładowanie do obrazka:
Image->Bitmap->LoadFromFile(picture_id);

  1. Chce wyeliminować zapis na dysk i użyć TMemoryStream ale nie działa poniższy kod (testowo zapisuje do pliku):
TJPEGImage * jpg;
jpg = new TJPEGImage();
Graphics::TBitmap * bmp = new Graphics::TBitmap();

TMemoryStream *memStream = new TMemoryStream();

//Image->Bitmap->SaveToStream(memStream); probowalem ale nie dziala

bmp->Assign(Image->Bitmap);
bmp->SaveToStream(memStream);

jpg->LoadFromStream(memStream);
jpg->SaveToFile(filename);

delete jpg;
delete bmp;

zapisuje pusty plik... ktoś poradzi jak to zrobić bo chciałbym posyłać do funkcji streama, ładować obraz do niego i później bezpośrednio do Imaga ładować obrazek ze streama.

Pozdrawiam

0

po bmp->SaveToStream(memStream); ustawić memStream->Position = 0 ?

0

ok, przed linijką jpg->LoadFromStream(memStream); ustawiłem Position = 0; i teraz jpg->LoadFromStream(memStream) generuje błąd: JPEG error #52 ...

0

Oto pierwsza wersja z wyeliminowaniem zapisu:

TJPEGImage *jpg=new TJPEGImage();
Graphics::TBitmap *bmp=new Graphics::TBitmap();
bmp->Assign(Image->Bitmap);
jpg->Assign(bmp);
delete bmp;
// Tu masz ten JPG zrobiony z obrazka w Image
delete jpg;

Natomiast nie rozumiem co chcesz osiągnąć w tej drugiej wersji?
Zapisać jako BMP zaś odczytać jako JPG?
Czy nie rozumiesz że przemianowanie pliku CPP na EXE nic nie da?

0

Ok, po wyeliminowaniu jpg działa

void SaveFrameIntoStream(long stream)
{
  TMemoryStream *memStream = (TMemoryStream *)stream;
  Image->Bitmap->SaveToStream(memStream);
}

//... i dalej
memStream->Position = 0;
SaveFrameIntoStream((long)memStream);
memStream->Position = 0;
Image->Bitmap->LoadFromStream(memStream);

To chciałem osiągnąć, nie chce zapisywać tych obrazków nigdzie na dysku, dostaje je z innego procesu i tylko potrzebuje je załadować do imaga tak w skrócie.

0

Pytanie jak pobrać rozmiar tak załadowanego obrazka?

0

To jest moduł ActiveX ocx odpalany z przeglądarki, łączy się z odległym serwerem do którego wysyła zapytania i otrzymuje np obrazki które muszę załadować do imagów (dlatego wybrany jest taki format). Oczywiście Position mogę dać do funkcji, to jest kosmetyka.

Problem w tym że serwer czasem źle wysyła i obrazki poniżej 60000 są generalnie zrypane więc zapisując na dysk można było łatwo sprawdzić rozmiar pliku i jak był mniejszy to wysłać ponownego requesta. A tu jak to obejść? rozmiar strumienia jest taki sam dla dobrego i zrypanego obrazku.

0

memStream->Size - to dokładnie to samo co zobaczyłbyś jako rozmiar pliku. Możesz próbować wczytać je do TBitmap *bmp i jak się nie uda to stwierdzić że nie jest dobry.

0

A jak odczytać header z JPG czy BMP? jak wygląda struktura headera?

0

Na razie się wstrzymam z analizą nagłówków, raczej sprawdzę kod po stronie serwera czemu czasem wysyła śmieci. Wielkie dzięki za wszystkie porady. Pozdrawiam kolegów ;)

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