2012-06-11 14 views
5

मैं .jpg को एक बीएमपी में परिवर्तित करके और फिर इसे imagelist1 में सहेजकर एक कल्पनावादी में jpg लोड करने का प्रयास कर रहा हूं।छवियों को TImageList में लोड करना और उन्हें पढ़ना?

कोड स्निप के ऊपर से नीचे तक। Selectdir काम करता है और fileexists भागों काम करते हैं। इसका उपयोग किसी फ़ोल्डर में सभी छवियों में लोड करने के लिए किया जाता है। सभी छवियों को नाम दिया गया है 0.jpg/1.jpg ect ..

तब मैं एक tpicture के लिए jpg लोड करता हूं। बीएमपी चौड़ाई/ऊंचाई सेट करें और जेपीजी के समान छवि के साथ बीएमपी लोड करें, फिर मैं कल्पनाशील को बीएमपी जोड़ता हूं। और जब यह किया जाता है तो इसे पहली छवि 0.jpg

दो समस्याएं, पहले अगर मैंने ऐसा किया तो यह केवल बीएमपी का एक छोटा सा क्षेत्र (शीर्ष बाएं) दिखाएगा लेकिन यह सही छवि थी। मुझे लगता है कि यह विकल्प फसल के कारण है। जो मुझे लगता है कि रनटाइम के दौरान इसे केंद्र का चयन कैसे करना है?

दूसरा, अगर मैं डाल

Imagelist1.width := currentimage.width; 
Imagelist1.height := currentimage.height; 

तो यह अंतिम छवि को दर्शाता है। Imagelist1.GetBitmap() की तरह काम नहीं किया? तो मुझे लगता है कि किसी के लिए एक फिक्स अच्छा होगा! चियर्स squills

procedure TForm1.Load1Click(Sender: TObject); 
var 
openDialog : TOpenDialog; 
dir :string; 
MyPicture :TPicture; 
currentimage :Tbitmap; 
image : integer; 
clTrans : TColor; 
begin 
    Image := 0 ; 
    //lets user select a dir 
SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt],SELDIRHELP); 
    myPicture :=Tpicture.Create; 
    currentimage := TBitmap.Create; 
//keeps adding images as long as the file path exsist. 
//thus comic pages should be renumbed to 0-XX 
    while FileExists(Dir+'\'+inttostr(image)+'.jpg') do 
    begin 
    try 
    MyPicture.LoadFromFile(Dir+'\'+inttostr(image)+'.jpg'); //load image to jpg holder 
    currentimage.Width := mypicture.Width;  //set width same as jpg 
    currentimage.Height:= mypicture.Height;  //set height same as jpg 
    currentimage.Canvas.Draw(0, 0, myPicture.Graphic);  //draw jpg on bmp 
    clTrans:=currentimage.TransparentColor;   //unknown if needed? 
    //Imagelist1.Width := currentimage.Width; 
    //imagelist1.Height := currentimage.Height; 
    Imagelist1.Addmasked(Currentimage,clTrans);  //add to imagelist 
    finally 
    image := image +1;       //add one so it adds next page 
    end; 
end; 
ImageList1.GetBitmap(0,zImage1.Bitmap); 
mypicture.Free; 
currentimage.Free; 
end; 

उत्तर

2

आप TImage हर बार उपयोग करके अनावश्यक भूमि के ऊपर का एक बहुत जोड़ रहे हैं। इस तरह

कोशिश कुछ (अपरीक्षित, क्योंकि मैं एक फ़ोल्डर इस तरह से नामित छवियों से भरा नहीं है - यह, संकलित हालांकि < जी >)। आपको अपने कार्यान्वयन uses खंड में Jpeg जोड़ने की आवश्यकता होगी यदि यह पहले से मौजूद नहीं है।

procedure TForm2.Button1Click(Sender: TObject); 
var 
    DirName: string; 
begin 
    DirName := 'D:\Images'; 
    if SelectDirectory('Select Image Path', 
        'D:\TempFiles', 
        DirName, 
        [sdNewUI], 
        Self) then 
    LoadImages(DirName); 
end; 

procedure TForm2.LoadImages(const Dir: string); 
var 
    i: Integer; 
    CurFileName: string; 
    JpgIn: TJPEGImage; 
    BmpOut: TBitmap; 
begin 
    i := 1; 
    while True do 
    begin 
    CurFileName := Format('%s%d.jpg', 
          [IncludeTrailingPathDelimiter(Dir), i]); 
    if not FileExists(CurFileName) then 
     Break; 
    JpgIn := TJPEGImage.Create; 
    try 
     JpgIn.LoadFromFile(CurFileName); 

     // If you haven't initialized your ImageList width and height, it 
     // defaults to 16 x 16; we can set it here, if all the images are 
     // the same dimensions. 
     if (ImageList1.Count = 0) then 
     ImageList1.SetSize(JpgIn.Width, JpgIn.Height); 

     BmpOut := TBitmap.Create; 
     try 
     BmpOut.Assign(JpgIn); 
     ImageList1.Add(BmpOut, nil); 
     finally 
     BmpOut.Free; 
     end; 
    finally 
     JpgIn.Free; 
    end; 
    Inc(i); 
    end; 
    if ImageList1.Count > 0 then 
    begin 
    BmpOut := TBitmap.Create; 
    try 
     ImageList1.GetBitmap(0, BmpOut); 
     Image1.Picture.Assign(BmpOut); 
    finally 
     BmpOut.Free; 
    end; 
    end; 
end; 
+0

यह एक बिंदु पर काम करता है, एक बार यह लोड होने के बाद यह कोई छवि नहीं दिखाता है। मुझे छवि 1 को ZImage1.bitmap.assign (bmpout) में बदलना पड़ा; जैसा कि ZImage1 TGraphicControl से एक वर्ग है। यह सुनिश्चित नहीं है कि यह मायने रखता है .. –

+0

ऐसा लगता है कि यह कभी भी लूप में नहीं मिलता है। हमेशा –

+0

को तोड़ता है कोई तरीका नहीं है (अपवाद को छोड़कर आप अनदेखा कर रहे हैं) कि फ़ंक्शन कहलाता है तो यह 'while' लूप में नहीं जा सकता है; 'जबकि सत्य' हमेशा 'सत्य' होता है। कोड का निष्पादन करने का एकमात्र तरीका यह है कि यदि 'चयन डायरेक्टरी' झूठी रिटर्न देता है और फ़ंक्शन को परिणाम के रूप में नहीं कहा जाता है। यदि आप उस रेखा पर ब्रेकपॉइंट सेट करते हैं तो डीबगर आपको क्या दिखाता है? –

संबंधित मुद्दे