bitmapy i stream read error

0

Witam

Robie sobie takie male przetwarzanie wsadowe ale mam pewien problem

petla wczytujaca i obrabiajaca kolejne bitmapy wykonuje sie dokladnie i za kazdym razem tylko 49 razy po czym komunikat grzmi: Stream read error

tak samo jest na tbitmap jak i timage czy timage32 z gr32

czy cos trzeba dopisac przy wielokrotnym wczytywaniu obrazkow?

oto kod petli:

bm:tbitmap;

for i:=0 to checklistbox1.items.Count-1 do
        begin
        if checklistbox1.Checked[i] then
                begin
                try
                bm:=tbitmap.Create;
                bm.LoadFromFile(checklistbox1.Items[i]);
               
                ramka(ggrubosc.Position,gkrycie.Position,'');

                form1.Canvas.Draw(0,0,bm);

                plik:='n'+extractfilename(checklistbox1.Items[i]);
                plik:=ChangeFileExt(plik, '.bmp');
                plik:=extractfiledir(checklistbox1.Items[i])+'\'+plik;
                
                bm.SaveToFile(plik);
                finally
                bm.free;
                end;
                
                application.ProcessMessages;
                end;
        end;

0

application.ProcessMessages; - co to i po co to?

0

To jest po to, że gdy sie nacisnie to, to sie zatrzyma to
bo inaczej to wykonywaloby sie dluzej niz tamto

ale poważnie

czyżby nikt na tak zacnym forum nie potrafil mi cos poradzic w tej dramatycznej sytuacji [!!!]
mam nadzieje ze to przejsciowe zdarzenie spowodowane upalami

ps. pozdrowienia dla Kolegi Pana Gienka [browar]

0

Może problem nie tkwi w kodzie a w bitmapie? [???]

0

W której linijce pojawia się ów błąd?

0

bitmapy sa dobre - typowe 24 bitowe zapisywane w paint'cie czy irfanview

jesli chodzi o linijke to w tym miejscu: bm.loadfromfile

dzieki

0

aha
jeszcze jedno

gdy uruchomilem program gdzies z 4 razy
(za kazdym razem dochodzil do 49 obrazka)
to za 5 razem w ogole nic juz nie moglem wczytac

0

a po co niszczysz bm skoro dalej z niej korzystasz?? Stwórz ją raz na początku, potem w pętli ładuj, wyświetlaj i zapisuj bmp a na końcu jak już wszystkie bmp przelecisz to niszcz bm.
Ew. zamiast TBitmap użyj TBitmap32 z gr32.

PS. jak duże są te bitmapy?

0

jesli chodzi o niszczenie bm
na poczatku bylo tak jak napisales ale zmienilem bo myslalem ze to powoduje ten blad
jednak to nie ma na niego wplywu

kod byl taki

try
bm:=tbitmap.Create;
for i:=0 to checklistbox1.items.Count-1 do
        begin
        if checklistbox1.Checked[i] then
                begin
                bm.LoadFromFile(checklistbox1.Items[i]);
                
                ramka(ggrubosc.Position,gkrycie.Position,'');

                form1.Canvas.Draw(0,0,bm);
                plik:='n'+extractfilename(checklistbox1.Items[i]);
                plik:=ChangeFileExt(plik, '.bmp');
                plik:=extractfiledir(checklistbox1.Items[i])+'\'+plik;
                
                bm.SaveToFile(plik);

                application.ProcessMessages;
                end;
        end;
finally
bm.free;
end;

jest jeszcze cos takiego jak bm.freeimage i releaseHandle
tutaj cos pisza na ten temat
ale tez nie umiem sobie z tym poradzic

tak w ogole to na poczatku robilem na tbitmap32 potem na timage az w koncu na tbitmap
we wszystkich przypadkach to samo 49 zdjec i koniec
wspomne nawet ze na poczatku byly to jpg

najwieksze bitmapy jakie byly wczytywane to 922x691 czyli ok. 1,8 mega

jeszcze jedno
w procedurze ramka nastepuje odczyt i zapis do aktualnej bitmapy typu
k:=bm.Canvas.Pixels[x,y];//odczyt do tcolor
i
bm.Canvas.Pixels[x,y]:=rgb(r,g,b);//zapis

moze system nie nadąża odczytywac i zapisywac tych bitmap i trzeba cos dopisac
(stosowalem bez skutku sleep)

a oto ciekawy wynik dzialania programu

user image

0

to ja jestem za tym, że problem leży albo w nazwie bmp albo ta 49 jest uszkodzona.

spróbuj jeszcze zrobić tylko tak

bm:=tbitmap.Create;
try
  for i:=0 to checklistbox1.items.Count-1 do
  begin
    if checklistbox1.Checked[i] then
    begin
      if FileExist(checklistbox1.Items[i]) then
      begin
        bm.LoadFromFile(checklistbox1.Items[i]);
        form1.Canvas.Draw(0,0,bm);
        plik := 'c:\bmp\' + IntToStr(i) + '.bmp';
        bm.SaveToFile(plik);
      end;
    end;
  end;
finally
bm.free;
end;

bez operowania na bmp i ze sprawdzaniem, czy na 100% bitmapa istnieje

0

dzieki bardzo

rzeczywiscie 50-ta bitmapa byla wadliwa
co dziwne otwierala sie poprawnie we wszystkich przegladarkach a nawet Paint'cie dlatego zignorowalem wczesniej ten trop

po zapisaniu jej jeszcze raz wszystko jest ok

pozdrowienia dla Miśkad i całego forum

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