Delphi jpeg megnyitása során EFOpenerror
2020-06-28T10:58:51+02:00
2020-06-30T15:44:33+02:00
2022-08-11T20:45:29+02:00
saxonb76
Sziasztok,

Van egy kis gondom: "sűrű sötét programozási erdőbe tévedtem és az igaz utat nem lelém" (valszeg abból adódóan hogy láma vagyok)
Jpeg képeket szeretnék megnyitni egy image-ben.
Átböngésztem és arra jutottam, hogy mielőtt betölteném át kell konvertálnom:
Itt találtam ezt az eljárást:

procedure JPGtoBMP(const JPG, BMP: String); var j: TJpegImage; b: TBitmap; begin j := TJpegImage.Create; try j.LoadFromFile(JPG); /// itt kiakad -- lentebb kifejtem b := TBItmap.Create; try b.PixelFormat:= pf24bit; b.Width := j.WIdth; b.Height := j.Height; b.Canvas.Draw(0,0, j); b.SaveToFile(bmp); finally b.Free; end; finally j.Free; end; end;
Itt próbálom meg használni:

procedure TFrmModificQuestionAnswer.FilenameEdit2Change(Sender: TObject); var ut0,ut1: string; begin ut0 := ''; ut1:=''; if FilenameEdit2.Text <> 'Choose an image file!' then begin ut0 := extractfilename(FilenameEdit2.Text); //a kiválasztott jpeg // nevének kinyerése ut1:=ut0; //ugye a nev ne változzon JPGtoBMP(ut0,ut1); // itt kiakad -- lentebb kifejtem a hibát image2.Visible := true; image2.Proportional := true; image2.Stretch := true; image2.Picture.bitmap.LoadFromFile(ut1); end; end;
Nos a hiba már a beolvasáskor megjelenik, a progi elszáll:
Project Cisco.exe raised exception class EFOpenError with message 'Cannot open file "d:\DELPHI\Projects\UNDER_WORKING\Cisco\KEYTOPICS\CCNA11\Q\CCNA11-F1-1_TCP IP networking model .jpeg"". The filename, directory name or volume label syntax is incorrect'. Process stopped etc.

Szóval az elérési út jó kivéve az idézőjel a kép nevének végén: az az extra aposztróf gyanús de nem vagyok benne biztos hogy ez a baj.
Félek, hogy valamit nagyon félreértettem.

Ui. természetesen a jpeg benne van a usesban
*******************************************************************
Extra info bár lehet hogy nem sokat segít:
Próbálkoztam azzal is hogy
TPicture.RegisterFileFormat('jpe', 'JPE Image File', TJPEGImage);

Ezt az Embarcadero site-ján találtam. Ezzel leegyszerűsödne a jpeg betültése Tbitmapbe de sajnos ez sem segített.
*******************************************************************
Hol rontottam el?
Segítségeteket előre is kösz.
Saxonb
Mutasd a teljes hozzászólást!
Az ExtraFileName helyett használhatod a komponens FileName tulajdonságát, ami jól adja vissza a fájl nevét.
Mutasd a teljes hozzászólást!

  • Debuggerben kellene megnézni az `ut0`-t az extractfilename után: nemcsak a macskaköröm gyanús, hanem a rengeteg szóköz a fájlnévben: normálisan egyetlen szóköz sem kell egy fájlnévbe.
    Mutasd a teljes hozzászólást!
  • Lecsekkoltam:
    Megváltoztattam a jpeg nevét erre: CCNA11_F1_1_TCPIPnetworkingmodel .jpeg
    De sajna a hiba ugyanúgy fennáll és az extra aposztróf is megmaradt.

    De hogy a debugos felvetésedre is válaszoljak egy showmessage szerint: CCNA11_F1_1_TCPIPnetworkingmodel .jpeg"

    De csatoltam egy képet is.

    Szóval egyre gyanúsabb a extra "
    A kérdés hogy miért marad ott. (le is trimmeltem a filename-t és utána is ott maradt.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Sziasztok,

    Megoldottam a problémát de továbbra sem érte hogy került az extra aposztróf a filenev végére.
    Egyszerűen levágtam a végéről és most már müxik.
    A pontokat viszont szívesen odaadnám annak aki rávilágít hogy hogyan maradt ott a végén a " a filenévnek vagy mi lehet az oka, mert az lenne a legtisztább ha az eredeti problémát tudnám kezelni.
    Üdv, Saxonb
    Mutasd a teljes hozzászólást!
  • Szia!

    Lehet butaság, nem vagyok Delphi-s, de a Text2-őn nincs valami format string ami odateszi?
    Mutasd a teljes hozzászólást!
  • Szia,

    Nem nincs . A FilenameEdit2.text eredeti szövege (Choose and image file!) felülíródik az abszolút elérési útvonallal amikor a user kiválasztja az imaget. Ellenőriztem még egyszer denincs benne aposztróf sehol.
    Mutasd a teljes hozzászólást!
  • Mostanaban nem delphiztem, de konvertalasnal miert ugyan az a 2 fajl nev? 
    Jpgtobmp(x1, x2) 

    Gondolom, hogy az egyest konvertalja a kettesre... De az elso letezo, es lehet zarolas miatt dobhatja.(sajat magara konvertalni?) 

    +  az elso reszen a load from file(jpg) honnan veszi az erteket, mert nem latom... Ez adhat okot a kiakadasra...
    Mutasd a teljes hozzászólást!
  • TJvFileNameEdit komponenst próbáltam. Ha azzal választok ki olyan fájlt, aminek az útvonalában, vagy a nevében van szóköz, akkor a Text-ben automatikusan megjelenik az idézőjel.
    A Delphi ExtractFileName függvénye a string "jobb oldalát" adja vissza, vagyis nem foglalkozik a szöveg végi plusz idézőjellel:

    The resulting string is the rightmost characters of FileName, starting with the first character after the colon or backslash that separates the path information from the name and extension. The resulting string is equal to FileName if FileName contains no drive and directory parts.

    Forrás
    Mutasd a teljes hozzászólást!
  • Az ExtraFileName helyett használhatod a komponens FileName tulajdonságát, ami jól adja vissza a fájl nevét.
    Mutasd a teljes hozzászólást!
  • Szóval egyre gyanúsabb a extra "

    Nekem is van gyanúm, csak más: mivel ez egy szép hosszú útvonal meg fájlnév, ezért gondolom nem begépeled a szövegmezőbe, hanem bemásolod, vagy akár rádobod. A szóközt (akár csak egy darabot) tartalmazó fájlneveket, útvonalakat Windowson idézőjelek közé szokás tenni, és ez egy csomó esetben automatikusan történik. Szóval szerintem van az elején is idézőjel, csak azt az ExtractFileName levágja, a végéről meg nem. Ugye a módosítások után is hagytál egy szóközt a kiterjesztés előtt. Ami egyébként elég szokatlan, és szerintem zavaró is, hiszen manapság a kiterjesztést vagy egyáltalán nem látja a felhasználó, vagy külön oszlopba rendezve jelenik meg, mondjuk fájlkezelőkben. Így viszont a fájl látható neve szóközre végződik.
    Egyéb: nem ismerem a Delphit, de ha kicsit is olyan jó, amilyennek mondják, akkor biztosan van fájlbekérő vezérlője is, ami majd nem fekszik meg idézőjeleken.
    Mutasd a teljes hozzászólást!
  • Sziasztok,
    Kezdenek az őrület jelei jelentkezni nálam.

    Hol is kezdjem.... lassan már azt sem tudom mi működik és mi nem.
    Tgyopela1:
    1) manuálisan beolvasok egy .jpeg képet egy filenameedit-et keresztül.
    2) ezt kellene ugye átkonvertálni BMP-be mert másképp az image nem jeleníti meg
    3) jpegtobmp(ut0, ut1): az ut0 és ut1 egy-egy konstans paraméter: az ut0 = filename.jpeg az ut1 = filename.bmp (a javaslatod alapján átírtam bár egyáltalán nem müxik mégse szóval lehet hogy még mindig nem értem a lényegét).

    utvonal:=filenameedit2.FileName; //ez visszaadja az absolut filepath+filename-t fajlname := extractfilename(FilenameEdit2.FileName); //ez visszadja a filename.jpeg ut0 := utvonal; //ez a jpeg neve keresendo := '.jpeg'; p := pos(keresendo, ut0); if p <> 0 then begin bmpnev := copy(ut0, 0, p - 1); ut1 := bmpnev+'.bmp'; ///ez a bmp neve end; JPGtoBMP(ut0,ut1);
           
    Ez most elszáll Jpeg error  #53 -al....
    Rákerestem mi is ez és vagy memória probléma vagy korrupt az image meg még van vagy 2 lehetőség.

    Kiírtottam a szóközöket az állomány nevéből de úgysem műxik.

    4) A következő lépés: kiremmeltem a jpegtoBMP sort és helyette ezt használtam:
    TPicture.RegisterFileFormat('jpe', 'JPE Image File', TJPEGImage);
    Azt olvastam egy másik fórumon hogy ezzel el lehet kerülni a konvertálást.
    Illetve amint azt észleltem a x.jpeg file-t átkonvertálva bedobta x.bmp néven ugyanabba a könyvtárba ahol a jpeg is van (de nem minden esetben teszi ezt, szóval ez is furcsa).

    5) következő próba során z.jpeg-eget és t.bmp is gond nélkül megjelenítette. Na mondom műxik ez hallelúja... de nem a következő futtatásnál egy másik b.jpeg nél 'Bitmap image is not valid' error-al elszállt.

    Itt lőttem főbe magam először.

    Szóval összefoglalva:
    1) jpegtobmp nem műxik elszáll #53 errorral
    2) kiírtottam a .jpeg fileok neveiből az összes nem odavaló karaktert: pl.: CCNA11-F1-14_osimodelcomparedtoTCPIPmodel.jpeg
    3) elkezdtem használni ezt: TPicture.RegisterFileFormat('jpe', 'JPE Image File', TJPEGImage);
    de ez sem működik csak néha (vagy nem jól használom? a formcreate-be tettem).

    Már ott tartok, hogy batch-ben át kellene konvertálni az összes jpeg-et bmp-re oszt csá.
    Mutasd a teljes hozzászólást!
  • Köszi,
    filename-el már nincs gond az aposztrófókkal...
    most éppen más miatt őrülök meg... alább olvashatod meddig juttottam
    Mutasd a teljes hozzászólást!
  • Szia,
    Neked írom a választ de mindenkinek szól aki próbált segíteni eddig:
    Szóval, van némi haladás.
    1) kiírtottam a szóközöket a filenevekből - köszi tevemadár és NevemTeve
    2) filename -et haszálok a text helyett: ez kellett az aposztróf gond ellen - köszi AlterEgo_2
    3) mégiscsak kell a jpegtobmp konvertálás és kiiktattam az említett TPicture.RegisterFileFormat('jpe', 'JPE Image File', TJPEGImage);
    Jelen pillanatban tesztelek és működni látszik a dolog.
    Volt egy sajátos hibám is: amikor a konvertálás megtörtént, tehát lefutott a progi akkor a következőnél a .bmp file már ott volt a directoryban és - én balga - nem figyeltem csak a filenevre és sokszor a .bmp kiválasztása után a konvertálásos procedura nem tudott mit kezdeni hisz ő .jpeg-et várt.
    Mutasd a teljes hozzászólást!
  • Szia, milyen Delphit használsz? Megpróbálok keríteni egyet
    Mutasd a teljes hozzászólást!
  • Szia, Delphi 7

    Egyébként már úgy tűnt megy.
    Koverntál, betölti a képet, lehet másikra cserélni minden faxa és aztán kitörlöm a konvertált .bmp-ket a .jpeg-ek mellől és újra akarom futtatni mire megint elszáll a konvertálós eljárásnál...
    Én ezt nem értem


    Most meg a jpegtoBMP eljáráson belül itt száll el:
    Jpg.LoadFromFile(JpgFileName);
    méghozzá a megszokott Jpeg error #53-al
    Mutasd a teljes hozzászólást!
  • Érdemes lenne így megpróbálni:

    var JPG: TJPEGImage; Image: TImage; begin ... JPG := TJPEGImage.Create; JPG.LoadFromFile('teszt.jpg'); Image.Picture.Assign(JPG); ... FreeAndNil(JPG); end;
    TPicture.RegisterFileFormat('jpe', 'JPE Image File', TJPEGImage);
    nem kell, ezt a JPEG unit elintézi.
    Mutasd a teljes hozzászólást!
  • Ok. Köszi megnézem.

    A többieknek:
    Újabb fejlemény:
    Ezek a jpegek vannak a könyvtárban:
    CCNA11-F1-10_basicroutingexample.jpeg
    CCNA11-F1-11_LarryusingEthernettoForwardanIPPackettoR1.jpeg
    CCNA11-F1-12_5stepsofdataencapsulation.jpeg
    CCNA11-F1-13_perspectivesonencapsulationanddata.jpeg
    CCNA11-F1-14_osimodelcomparedtoTCPIPmodel.jpeg
    CCNA11-F1-15_OSIencapsulationandprotocoldataunits.jpeg
    CCNA11-F1-5_Basicapplicationlogictogetawebpage.jpeg
    CCNA11-F1-6_HTTPGetrequest-HTTPReplyandData-onlymessage.jpeg
    CCNA11-F1-7_TCPErrorRecoveryServicesasprovidedtoHTTP.jpeg
    CCNA11-F1-9_simpleTCPIPnetwork3routerswithIPAddressesgrouped.jpeg
    CCNA11-T1-2_TCPIParchitecturalModelandexampleprotocols.jpeg
    CCNA11_F1_1_TCPIPnetworkingmodel.jpeg

    Na elkezdtem tesztelni és a két vastagon kiemelten kívül az összes többivel jól megy a progi csak ettől a kettőtől akad ki. #53 Jpeg errorral. Szóval lehet hogy a jpegben van a hiba. Most megpróbálok utána járni, hogy hogyan lehet kideríteni mi a gond velük.
    Azt hiszem itt olvastam, hogy ACDsee vel meg lehet talán nézni ha hibás egy jpeg.
    Mutasd a teljes hozzászólást!
  • Valószínűleg ezeket már szerencsésen átalakítottad őket .bmp-vé (de megmaradt a .jpeg fájlnév).
    Mutasd a teljes hozzászólást!
  • Szia,

    Ja ez is működik de most hogy ezt is kipróbáltam már biztos hogy a 2 jpeg állomány valahogy hibás lett. A többivel működik.
    Mutasd a teljes hozzászólást!
  • nem hiszem, mert másik könyvtárban található további jpeg-el is működik pedig azokhoz eddig még nem nyúltam... (egyszer sem)
    Mutasd a teljes hozzászólást!
  • Épp azokkal működik, amiket nem alakítottál át jpeg nevű de bmp tartalmú fájllá a korábbi ut1:=ut0 módszerrel.
    Mutasd a teljes hozzászólást!
  • bocsi de nem írtam meg, hogy azt már rég átírtam

    Közben újra elmentettem a két hibás jpeg-et és közben átírtam a kódot chiefa javaslata szerint:
        utvonal := filenameedit1.FileName; //ez visszaadja az absolut filepath+filename-t
        fajlname := extractfilename(FilenameEdit1.FileName); //ez visszadja a filename.jpeg

    ut0 := utvonal; //ez a jpeg neve JPG := TJPEGImage.Create; JPG.LoadFromFile(ut0); image1.Picture.Assign(JPG); image1.Proportional := true; image1.Stretch := true; image1.Visible := true; label21.caption := '..\Cisco\KeyTopics' + trim(label3.Caption) + '' + extractfilename(ut1); label21.Visible := true; FreeAndNil(JPG);
    Igazándiból ez most működik de nem merem el kiabálni. Most még javában tesztelek.
    Mutasd a teljes hozzászólást!
  • Szia.
    Nem olvastam végig a hozzászólásokat, de kezdem az elején.
    Milyen Delphit használsz?
    Miért kell átkonvertálni Jpeget hogy image-ba tölthesd?
    Én úgy tudom simán be lehet konvertálás nélkül tölteni.
    TImage

    procedure TForm1.btn1Click(Sender: TObject); var s: string; begin OpenPictureDialog1.Execute(); s:= OpenPictureDialog1.FileName; if not(s ='') then begin img1.Picture.LoadFromFile(s) ; end; end;
    Interfész részéhez esetleg tedd be a Jpeg-et
    Tehát 

    uses Windows, Messages, SysUtils, ... jpeg, ExtDlgs;
    Ahogy olvasom a fájl neveid, esetleg a hosszú fájlnevek okozhatnak még zavart, de ebben nem vagyok biztos.
    Mutasd a teljes hozzászólást!
  • Az USES részt látom már írtad témanyitásnál, csak elkerülte a figyelmem!

    Konvertáláshoz kis segítség... Bitmap-ból csinál Jpeget (fordítva majd te megcsinálod, szerintem rá jössz úgy is magadtól...)

    procedure TForm1.btn2Click(Sender: TObject); var J:TJPEGImage; begin j:= TJPEGImage.Create; try with j do begin Assign(img2.Picture.Bitmap); SaveToFile('factory.jpg'); img3.Stretch := True; img3.Picture.LoadFromFile('factory.jpg'); end; finally j.Free; end; end;
    img2 egy TImage komponens, ide betöltöd azt a képet ami ".bmp" formátumu, ezt fogja Jpeg-nek konvertálni.
    img3 szintén egy Timage komponens, ez azért kell, hogy ide visszatöltjük a lementett ".Jpeg" formátumot hogy valóban sikerült-e a konvertálás, és lementés.
    Úgy gondolom ez talán kiindulási pontnak elég.
    Ha hülyeséget írtam volna valahol, a többiek javítsanak ki !
    Ahonnan néztem a kódot: TJPEGImage.Create

    Mutasd a teljes hozzászólást!
  • Szia,

    Köszi a segítséget. Delphi 7 de már nem konvertálom át. Azt már kiiktattam és azóta sok egyéb is változott. Úgy néz ki most működik. De azért nagyra értékelem a segítségedet és el is mentettem a kódrészletet amit adtál hátha majd egyszer jól jön.
    Mutasd a teljes hozzászólást!
  • No most bajban vagyok.
    Többen is nagyon értékes segítséget adtatok.
    Jó lenne megosztani a pontokat szóval ha a rendszergazdi látja ezt vagy tudjátok értesíteni akkor NevemTeve, AlterEgo_2 és tgyopela0 (de chiefa is sokat segített) között kellene elosztani a pontokat. 
    Én most ezt elfogadom megoldásként mert az eredeti problémát a kompi filename tulajdonsága megoldotta.
    Mindenesetre mindenkinek nagy köszi a sok segítségét amit adtatok.
    Hálám gyilkolássza le körülöttetek a koronavírusokat.
    Még annyit szeretnék mondani, hogy ez a probléma felvetés, agyalás sokban segíti az embert, hogy hellyel-közel képbe kerüljön olyan dolgokkal amikről lófingja sem sincs (magam csak koca vagyok a programozók között): pl.  erről a képkezelésről stb. 
    Szóval mindenkinek külön NAGY köszönet.

    Üdv SaxonB
    Mutasd a teljes hozzászólást!
abcd