Lepiej sam sobie napisz, wczytaj JPG do TJPEGImage i przepisz go do TBitmap’y (dekompresja), wtedy u mnie obsługa OnProgress jest wywoływana.
Co mi po dekompresji czy kompresji.
Czytaj uważnie. Gdy wczytuję do TImage plik w formacie JPEG to zdarzenie OnProgress jest wywoływane i wyświetlany jest pasek postępu. Gdy ten sam plik wczytuję do TJPEGImage to zdarzenie OnProgress nie jest wywoływane i pasek postępu nie jest wyświetlany.
Gdy kopiujesz plik z TJPEGImage do TImage a zdarzenie OnProgress masz podłączone pod TImage to zdarzenie OnProgress obiektu TImage jest wywoływane pośrednio ze względu na kompresję, ale bezpośrednio ze względu na proces kopiowania, co oczywiście wiąże się bezpośrednio z dekompresją.
Jednak od samego początku nie o to chodzi, lecz o to, żeby podłączyć zdarzenie OnProgress i wizualizować w ProgressBar proces wczytywania pliku do TJPEGImage bez konieczności używania TImage, ale jeżeli zdarzenie OnProgress jest podłączone pod TJPEGImage to tej wizualizacji nie ma, gdyż TJPEGImage nie wywołuje tego zdarzenia.
Podsumowując. Jeżeli pod TImage podłącze zdarzenie OnProgress i przekopiuję do TImage obiekt typu TJPEGImage to proces kopiowania, nie wczytywania pliku jest wizualizowany, tak więc zdarzenie OnProgress tyczy się tylko kompresji i dekompresji grafiki przed wyświetleniem w TImage, a nie wczytywania i zapisywania, na co najlepszym dowodem jest to, że obiekt klasy TJPEGImage nie dekompresuje grafiki podczas wczytywania, lecz wczytuje ją taka jaka jest i dlatego zdarzenie OnProgress nie jest wywoływane.
Tak jak ty piszesz, to ja już za pierwszym razem zrobiłem przez pomyłkę podłączając zdarzenie OnProgress nie pod TJPEGImage lecz pod TImage, a pomyliłem się dlatego, że obydwa obiekty nazwałem podobnie, czyli TJPEGImage *Image i TImage *Image1. Zanim się zorientowałem, uznałem, że to TJPEGImage steruje ProgressBar, ale po poprawce i podpięciu zdarzenie pod TJPEGImage niestety przestało działać.
Jeżeli zrobię to tak:
- Kod: Zaznacz cały
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Image = new TJPEGImage();
Image->ProgressiveDisplay = true;
Image1->OnProgress = ImageProgress;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ImageProgress(TObject *Sender, TProgressStage Stage,
BYTE PercentDone, bool RedrawNow, const TRect &R, const AnsiString Msg)
{
switch(Stage)
{
case psStarting: ProgressBar1->Position = 0; break;
case psRunning: ProgressBar1->Position = PercentDone; break;
case psEnding: ProgressBar1->Position = 100; break;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(OpenPictureDialog1->Execute())
{
Image->LoadFromFile(OpenPictureDialog1->FileName);
Image1->Picture->Assign(Image);
}
}
//---------------------------------------------------------------------------
Zauważ jednak, że zdarzenie OnProgress zostało podłączone pod Image1 (TImage), a proces wizualizacji jest realizowany nie tutaj:
- Kod: Zaznacz cały
Image->LoadFromFile(OpenPictureDialog1->FileName);
lecz tutaj:
- Kod: Zaznacz cały
Image1->Picture->Assign(Image);
więc nie podczas wczytywania, lecz podczas kopiowania obiektu.
Jeżeli dokonam drobnej modyfikacji i podłącze zdarzenie OnProgress pod Image (TJPEGImage):
- Kod: Zaznacz cały
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Image = new TJPEGImage();
Image->ProgressiveDisplay = true;
Image->OnProgress = ImageProgress;
}
//---------------------------------------------------------------------------
To teraz zdarzenie OnProgress dla TJPEGImage nie zostanie wywołane, gdyż w Image (TJPEGImage) nie zachodzi proces dekompresji, zachodzi jednak w Image1 (TImage) podczas kopiowania.
A przecież pytanie
mervinjmicky brzmiało:
Chciałbym do mojej funkcji dodać postęp wczytywania pliku JPG. Nie używam TImage tylko
Zwracam uwagę na fragment:
Nie używam TImage, a skoro nie używa TImage, a jedynie TJPEGImage to nie ma dekompresji, gdyż TJPEGImage może przechowywać pliki JPEG skompresowane.
Tutaj przyznaję, że nie od razu zrozumiałem przyczynę tego, że TImage obsługuje OnProgress a TJPEGImage już nie mimo iż wczytywane są do obydwu pliki JPEG. Początkowo sądziłem, że OnProgress odnosi się do wczytywania plików a nie do dekompresji, ale to Ty zasugerowałeś to swoją pierwszą odpowiedzią w tym wątku, więc nie wiem, czy też zdawałeś sobie sprawę, że tyczy się to kompresji, a nie wczytywania.
Nie do końca wiem jak to jest z tą kompresją, gdyż przy próbie poddanie pliku JPEG kompresji i przepisania go do Image wyskakuje błąd:
Podejrzewam, że jest to spowodowane tym, że próbuje poddać kompresji plik już skompresowany, a przed kompresją należałoby go najpierw zdekompresować, ale już mi się nie chce dzisiaj tego testować.