Προς το περιεχόμενο

C++ Builder 6


Paytor

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλημέρα!

Ξέρει μήπως κανένας πως γίνεται να φορτώσω gif εικόνα σε ένα Image, Picture Box ή DBImage!Η εικόνα αυτη μέτα θα περάσει στην βάση σαν Blob(Binary Large Object).Για bitmap και Jpeg το έχω καταφέρει.Εχω ψάξει και στο internet αλλα δεν βρήκα τίποτα, μόνο πάνω σε delphi αλλα και αυτο δεν δούλευε.Οποιαδήποτε ιδέα είναι καλοδεχούμενη!!!

Δημοσ.

Δυστυχώς κάτι τέτοιο δεν είναι κατευθείαν εφικτό καθώς το GIF format δεν υποστηρίζεται άμεσα από την VCL συνεπώς θα πρέπει να αναζητήσεις components ή βιβλιοθήκες τρίτων κατασκευαστών ή να σχεδιάσεις μόνος σου τον απαιτούμενο κώδικα.

 

:(

 

Υ.Γ.

Εγώ είχα χρησιμοποιήσει για υποστήριξη PNG προ καιρού την βιβλιοθήκη FreeImage, δεν χάνεις τίποτε να την ψάξεις (http://freeimage.sourceforge.net/)

Δημοσ.

Ευχαριστώ για την πληροφορια.Και εγώ το σκέφτηκα αυτό αλλά είπα μήπως υπάρχει και κάτι αλλο που μπορεί να γίνει.Θα δοκιμάσω την βιβλιοθήκη που χρησιμοποίησες.

Δυο αλλες απορίες που έχω ειναι 1) γιατί μου βγάζει το σφάλμα "cannot compare null to string" όταν θέλω να γυρίσω π.χ μια εικόνα που έχω αποθηκεύσει στην βάση σε ενα image, picture box η DBImage στην C.2) πως μπορώ να φορτώσω βιβλιοθήκη η οποία ειναι σαν dll και οχι σαν lib.Πρέπει να τρέξω το implib αλλα δεν ξέρω ακριβώς πως και πού.

Δημοσ.

Για το πρώτο ερώτημα δεν μπορώ να προτείνω κάτι καθώς δεν έχω ασχοληθεί επισταμένος με τα Database components του C/C++ Builder, δεν θα ήταν άσχημο όμως να δημοσιεύσεις το επίμαχο κομμάτι κώδικα ώστε να καταλάβω εγώ ή κάποιος άλλος τι ακριβώς εννοείς.

 

Όσον αφορά το δεύτερο ερώτημα, πράγματι χρειάζεται να χρησιμοποιήσεις το implib το οποίο βρίσκεται στον υποκατάλογο Bin της εγκατάστασης του C++ Builder.

 

Η σύνταξη της εντολής είναι:

 

Implib (options) lib_name dll_name

 

Έτσι εάν θέλεις να δημιουργήσεις ένα LIB για το υποθετικό MYDLL.DLL γράφεις:

 

Implib mydll.lib mydll.dll

 

Σημείωση: Εάν το DLL περιέχει exports μορφής cdecl συμπεριέλαβε και το option -a ώστε τα exports του DLL να εισαχθούν με underscore πριν την ονομασία τους στο LIB (πχ. Implib –a mydll.lib mydll.dll).

 

Υ.Γ.

Για να δεις τι εισήχθη στο LIB δώσε TDUMP mydll.lib στο DOS prompt.

Δημοσ.

Ευχαριστώ Directx!Θα δοκιμάσω το implib ετσι ακριβώς οπως είπες!Τωρα δεν μπορώ ομως γιατι είμαι στην δουλειά και δεν εχω την C++ Builder μπροστά μου.Οταν Μπορέσω σήμερα κάποια στιγμή θα βάλω και τον κώδικα στο forum(Database Components) να δούμε αν μπορούμε να βρούμε καμία λύση πανω στο σφάλμα "cannot compare null to string".

Δημοσ.

Δεν ξέρω εάν σε βοηθήσει ο παρακάτω κώδικας γιατί είναι σε Delphi.

 

Load Image from blog field:

>
 ImageData:= TMemoryStream.Create;
 try
   {create image data}
   BlogData:= PackageRead.CreateBlobStream(PackageRead.FieldByName('Image'), bmRead);
   try
     if BlogData.Size>0 then begin
      BlogData.Position:= 0;
       ImageData.Position:= 0;
       ImageData.CopyFrom(BlogData, BlogData.Size);

       ImageData.Position:= 0;
       Image.Picture.Bitmap.LoadFromStream(ImageData);
     end else
     Image:= '';
   finally
     BlogData.Free;
   end;
 finally
   ImageData.Free;
 end;

 

Save Image to blog field:

>
var
 DatabaseBitmap: TStream;
 BitmapFileStream: TFileStream;
begin
DBImage.DataField := '';
if OpenPicture.Execute then begin
 GamesTable.Edit;
 DatabaseBitmap := GamesTable.CreateBlobStream(GamesTable.FieldByName('Image'),bmWrite);
 BitmapFileStream := TFileStream.Create(OpenPicture.FileName, fmOpenRead);
 try
   BitmapFileStream.Position := 0;
   DatabaseBitmap.Position := 0;

   DatabaseBitmap.CopyFrom(BitmapFileStream, BitmapFileStream.Size);
 finally
   DatabaseBitmap.Free;
   BitmapFileStream.Free;
 end;
end;
DBImage.DataField := 'Image';

 

Σημείωση: το PackageRead είναι τύπου TADODataSet

Δημοσ.

Αυτο που επίσης προσπαθώ να κάνω είναι να υπολογίσω συντελεστές Fourier της εικόνας που ανοίγω και στέλνω στην βάση.Αρχικά υπολογίζω τα values (RGB) με τον εξής τρόπο.Εστω πίνακας int values [Ν][Μ] ακεραίων τιμών και int i, j δύο ακέραιες μεταβλητές τοτε τα RGB Values θα είναι values [j] = Image1->Canvas->Pixels[j] και αυτο με μια for πριν, ετσι ώστε να πέρνει ολα τα pixel της εικόνας.

 

Το επόμενο βήμα ειναι ο υπολογισμός των συντελεστών fourier αλλα όχι ολόκληρης της εικόνας μόνο κάποιων.Αυτο πρέπει να γίνει κυκλικά, ξεκινώντας απο το κέντρο της εικόνας και μετα δεξιόστροφα ή αριστερόστροφα.Αυτο είναι και το μεγαλυτερο πρόβλημα.Καμία ιδέα???

 

Απ'ότι θα καταλάβατε αυτα τα πράγματα δεν τα κάνω για να περάσει η ώρα αλλα ειναι η διπλωματική που έχω να κάνω(Image Comparer).

Δημοσ.

Συμληρωματικά για να υπολογίσω τους συντελεστές αυτούς θα χρησιμοποιήσω την βιβλιοθήκη FFTW(Fast Fourier Transform) καλώντας μια συνάρτηση απο εκεί.Το μόνο δύσκολο είναι αυτό που αναφέρω παραπάνω->Κυκλικά

δεξιόστροφα η αριστερόστροφα αρχιζοντας απο το κέντρο της εικόνας(κεντρικό pixel).

Δημοσ.

Για αρχή μπορείς να δεις την ρουτίνα CenterPoint η οποία επιστρέφει το κέντρο ενός ορθογώνιου (TRect) σε μορφή Y,X (TPoint), οπότε σε πρώτη φάση βρίσκεις το κέντρο του pixel-map που σε ενδιαφέρει.

Δημοσ.

Ωραία σκέψη η ρουτίνα.Θα το χρησιμοποιήσω.Εγω ειχα σκεφτεί να διαιρέσω /2 τα Height και Width της εικόνας που ανοίγω.

 

Καμία ιδέα για το πως θα παίρνω τιμές κυκλικά???Ειχα σκεφτεί με χρονόμετρο(timer) να υπολογίζω συγκεκριμένα pixel.Για να γίνει αυτο ομως θα χρειαστούν πολλές γραμμές κώδικα οι οποίες θα ισχύουν γαι την συγκεκριμένη εικόνα.Για μεγαλύτερη (εικόνα) οι τιμές που θα παίρνω θα είναι λίγες.

 

Είναι δύσκολο σημείο το ξέρω.Οποιαδήποτε σκέψη είναι καλοδεχούμενη!

Δημοσ.

Μία λιγο άσχετη ερώτηση.Κανένα καλό site με προγραμματισμό ξέρουμε?Εχω μπει μέχρι τώρα στα codeproject και planetsourcecode αλλα δεν ενθουσιάστηκα!Γενικά πάνω σε C++Builder δεν υπάρχει πολύ υλικό στο internet.

  • 2 χρόνια αργότερα...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...