JPG in C++ einlesen
-
Hallo Leute,
ich bin ein totaler Anfänger was Programmierung angeht. Kann lediglich die Grundlagen von C. Ich muss aber eine Klasse in C++ (Microsoft Visual Studio 2012) programmieren. Funktionsweise: "Einleser" bekommt Befehl vom "Workflow" (Workflow regelt den Zugriff auf jede Klasse), Einleser liest eine JPG-Datei ein und wird dann in der GUI (MFC) in einem Fenster dargestellt. Habe absolut keine Ahnung, wie ich es angehen soll :(. Wäre für jede Hilfe sehr dankbar.
-
also an deiner stelle würde ich mich mal mit der klasse CImage beschäftigen und wie du das dann anzeigst, dazu hast du zu wenig bekannt gegeben, also ob du das selbst zeichnen musst oder ob du nen zeiger auf die bitmapdaten übergeben musst oder wie das gelösst ist. Also falls da noch fragen bestehen solltest du vielleicht die schnittstelle noch etwas besser beschreiben
-
Erst mal danke für die schnelle Antwort CTecS. Deinem Hinweis werde ich nachgehen. Ich versuche es mal genauer zu beschreiben. Wenn Button "Einlesen" gedrückt wird, soll das Befehl zum Workflowmanager gehen. Der WFM sorgt dafür, dass ein Auswahlfenster erscheint, wo man aus einem beliebigem Ordner eine Bilddatei des Formats .JPG auswählen kann und das Pfad wird der Klasse "Einleser" übergeben. Danach soll der "Einleser" das Bild der in der GUI in einem Fenster (Picture Control) einfach nur anzeigen.
-
Weiß einer, wie ich ihn so verändern kann, dass ich anstatt .bmp, .JPG anzeigen kann?
void CEinleserDlg::OnButton1()
{
// Benötigte Variablen erstellen
CEinleser m_File(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Bilder (.bmp)|.bmp;||");
CString str_filename;
char Zeichen;// File Dialog öffnen und Ergebnis auffangen
if(m_File.DoModal()==IDOK)
{
// Gewählten Dateinamen ermitteln
str_filename=m_File.GetPathName();// Länge des Dateinamens ermitteln
int laenge=str_filename.GetLength();// Alle \ mit \\ ersetzen
for(int i = 0; i < laenge; i++)
{
Zeichen = str_filename.GetAt(i);
if(Zeichen=='\')
{
str_filename.Insert(i, "\");
i+=1;
}
}// Bild anzeigen
m_ctlBild.SetBitmap((HBITMAP)LoadImage(NULL, str_filename, IMAGE_BITMAP, 100 , 100, LR_LOADFROMFILE | LR_CREATEDIBSECTION ));
}
}
-
cico81 schrieb:
Weiß einer, wie ich ihn so verändern kann, dass ich anstatt .bmp, .JPG anzeigen kann?
// Benötigte Variablen erstellen CEinleser m_File(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Bilder (*.bmp)|*.bmp;||"); CString str_filename; char Zeichen; // File Dialog öffnen und Ergebnis auffangen if(m_File.DoModal()==IDOK) { // Gewählten Dateinamen ermitteln str_filename=m_File.GetPathName(); ...
Wenn es mit Austauschen von bmp gegen jpg getan wäre würdest Du wohl nicht fragen, oder ?
Vielleicht könntest Du uns mal die Klassen CEinleser und die Klasse zu der m_ctlBild gehört erläutern ?
Wir können nur mutmaßen was der "CEinleser" macht; es sieht aber verdächtig
nach einem Wrapper für GetOpenFileName() aus.http://msdn.microsoft.com/en-us/library/windows/desktop/ms646927.aspx
PS: Und es wäre nett wenn Du passende Code-Tags verwendest.
-
Hallo merano,
an de Stelle wo du markiert hast, kann man lediglich die Auswahl von .bmp auf .JPG verändern, aber das Bild wird nicht angezeigt. m_ctlBild gehört zu CStatic CEinleserDlg. Bei der Picture Box lässt sich Bitmap und andere Sachen einstellen, aber kein JPG. Bin leider ein Anfänger, das Ganze übersteigt meine Kenntnisse.
-
cico81 schrieb:
Hallo merano,
an de Stelle wo du markiert hast, kann man lediglich die Auswahl von .bmp auf .JPG verändern, aber das
Bild wird nicht angezeigt wird. m_ctlBild gehört zu CStatic CEinleserDlg. Bei der Picture Box lässt sich
Bitmap und andere Sachen einstellen, aber kein JPG. Bin leider ein Anfänger, das Ganze übersteigt meine Kenntnisse.Wenn Du etwas exakter beschreiben würdest was Du genau versucht hast (Quelltext) und zudem genauer
beschreiben würdest was nicht funktioniert wären wir schon weiter ...Der erste Teil funktioniert also, wenn man bmp in jpg ändert. Was da genau passiert ist geheim ... OK.
Für die eigentliche Anzeige kann man die Datei mit ReadFile() lesen und das auspacken und Anzeigen z.B.
OleLoadPicture() und Render() überlassen.Wie kann ich andere Bitmap-Formate als .bmp anzeigen?
http://www.mpdvc.de/html.htm#Q78---
Alternative1: CImage Class
http://msdn.microsoft.com/en-us/library/bwea7by5.aspxCImage provides enhanced bitmap support, including the ability to load and
save images in JPEG, GIF, BMP, and Portable Network Graphics (PNG) formats.----
Alternative2: GDI+ Bitmap::Bitmap
http://msdn.microsoft.com/en-us/library/windows/desktop/ms536316.aspxThe graphics file formats supported by GDI+ are BMP, GIF, JPEG, PNG, TIFF, Exif, WMF, and EMF.
----
Wenn noch weitere Fagen dazu sind, bitte die entsprechende Quelltextstelle
beilegen und Fehlerauswirkung und Fehlerstelle beschreiben.
-
Danke merano, werde mir diese Klassen genauer anschauen. Es ist nichts geheimes. Ich habe ein Projekt gefunden, was mich bei meinem Problem sehr weit bringt. Ist auf der Seite: http://www.coding-help.de/bild.html, da kann man den Source-Code runterladen. Ich versuche nun diesen Code meinem Projekt anzupassen, mit den oben genannten Anforderungen. Kern dieses Projektes ist eine .JPG-Datei einzulesen und über GUI (MFC) anzuzeigen. In dem Projekt sind mehrere Klassen und diese werden von einem "WFM" geregelt, unter anderem auch CEinleser.
-
Ich kann mich noch hier dran erinnern:
http://www.c-plusplus.net/forum/39074
(siehe auch die weiterführenden Links...)
-
Hii isabeau, werde die Codes ausprobieren, thnxs. Mein Hauptproblem ist das Anzeigen des JPG-Bildes. Vielleicht habe ich die Parameter bei der Picture Box nicht richtig eingestellt, oder muss das JPG-Bild als .bmp Casten und als Bitmap darstellen?? Oder habe ich eine andere Möglichkeit?
-
http://www.fotos-hochladen.net/view/unbenannta2rg9yhnlx.jpg
Hat vielleicht jemand eine Idee?
-
...
-
cico81 schrieb:
Mein Hauptproblem ist das Anzeigen des JPG-Bildes. Vielleicht habe ich die Parameter bei der Picture Box nicht richtig eingestellt, oder muss das JPG-Bild als .bmp Casten und als Bitmap darstellen?? Oder habe ich eine andere Möglichkeit?
Das Du ein BMP als JPG casten willst beweist, das Du von Dateiformaten (und/oder casten) wirklich keine Ahnung hast.
Die vermutlich "billigste" Lösung für dein Bild wäre vermutlich:
// Gespeichertes Bild aus Variable löschen m_Bitmap.DeleteObject(); // Variable neues Bild zuweisen // m_Bitmap.LoadBitmap(IDB_BITMAP2); CImage image; image.Load(_T("C:\\image.jpg")); m_Bitmap.Attach(image.Detach());
Wobei der Pfad hier fest eincodiert ist; weiss ja nicht was Deine CEinleser so
macht ...
-
Ich habe mehrfach erwähnt, dass ich ein Anfänger bin merano. Das, was CEinleser machen muss, habe ich auch schon beschrieben. Ich brauche mindestens eine primitive CEinleser-Klasse, wo man über die GUI auf ein Button clickt, .JPG-Datei auswählen kann und diese anschließend angezeigt wird. Also genau das Projekt, was sich auf der Seite befinden, wo ich den Link in einem vorherigem Beitrag eingefügt habe, nur mit .JPG anstatt .bmp. Die Klasse CImage ist das passende, muss es nur irgendwie integrieren. Ich weiß nur nicht, wie ich die Variablen deklarieren muss.
-
cico81 schrieb:
...Also genau das Projekt, was sich auf der Seite befinden, wo ich den Link in einem vorherigem Beitrag eingefügt habe, nur mit .JPG anstatt .bmp. Die Klasse CImage ist das passende, muss es nur irgendwie integrieren. Ich weiß nur nicht, wie ich die Variablen deklarieren muss.
Welche Variablen ? Copy & Paste sollte funktionieren.
(Habe es mit dem verlinkten Sourcecode bereits ausprobiert.)Wir erwarten allerdings auch von einem Anfänger eine gewisse Selbstbeteiligung.
Wir helfen gerne, aber wir machen keine Auftragsarbeit. Erst wenn Du es wirklich ausprobiert hast
und trotz eigener Bemühungen noch Probleme auftauchen kannst Du die betreffenden Stellen mit
passender Beschreibung und Frage posten.Und der CEinleser war definitiv kein Bestandteil des verlinkten Sourcecodes.
Wie und wo Du ihn eingebaut hast und welches Problem dabei einstanden sein könnte ist unklar.
-
Ich sitze seit mehreren Stunden/Tagen dran. Ich würde dich daher bitten, ohne Wissen, nicht einfach zu kritisieren. Das Originalprojekt aus der Seite läuft auch bei mir. Aber mit Copy&Paste funktioniert es leider nicht. Erwarte auch nicht, dass mir einer alles fertig macht. Brauche nur konstruktive Hinweise, in Bezug auf die Problemstellung. Freundlicherweise wurden einige Tipps gegeben, konnte ich aber nicht erfolgreich umsetzen. Es würde mir schon sehr helfen, wenn ich die Fehler beseitigen könnte, die hier aufgeführt sind: http://www.pic-upload.de/view-19149889/Unbenannt.jpg.html
void CEinleserDlg::OnBnClickedEinlesen()
{ //Benötigte Variablen erstellen
164 CFileDialog m_File(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Bilder (.bmp)|.bmp;||");CString str_filename;
char Zeichen;// File Dialog öffnen und Ergebnis auffangen
if(m_File.DoModal()==IDOK)
{
// Gewählten Dateinamen ermitteln
str_filename=m_File.GetPathName();// Länge des Dateinamens ermitteln
int laenge=str_filename.GetLength();// Alle \ mit \\ ersetzen
for(int i = 0; i < laenge; i++)
{
Zeichen=str_filename.GetAt(i);
if(Zeichen=='\')
{
184 str_filename.Insert(i, "\");
i+=1;
}
}// Bild anzeigen
m_ctlBild.SetBitmap((HBITMAP)LoadImage( NULL , str_filename ,IMAGE_BITMAP , 100 , 100 , LR_LOADFROMFILE | LR_CREATEDIBSECTION ));
}
}Den Fehler in der Zeile 164 hatte ich in einen vorherigen Beitrag als das hochgeladene Bilddatei reingestellt.
-
cico81 schrieb:
Ich sitze seit mehreren Stunden/Tagen dran. Ich würde dich daher bitten, ohne Wissen, nicht
einfach zu kritisieren. Das Originalprojekt aus der Seite läuft auch bei mir. Aber mit Copy&Paste funktioniert es leider nicht.Da ist wieder so eine Stelle, die und immer wieder nervt!!
Funktioniert nicht, ist keine sinnvolle Beschreibung. Was läuft nicht und wie sieht die Fehlermeldung aus.
cico81 schrieb:
Erwarte auch nicht, dass mir einer alles fertig macht. Brauche nur konstruktive Hinweise, in Bezug auf die Problemstellung. Freundlicherweise wurden einige Tipps gegeben, konnte ich aber nicht erfolgreich umsetzen.
Schon wieder: Was hast du genau probiert und was funktionierte dabei nicht ?
cico81 schrieb:
Es würde mir schon sehr helfen, wenn ich die Fehler beseitigen könnte, die hier aufgeführt sind: http://www.pic-upload.de/view-19149889/Unbenannt.jpg.html. ...
Den Fehler in der Zeile 164 hatte ich in einen vorherigen Beitrag als das hochgeladene Bilddatei reingestellt.Mit anderen Worten: Bitte macht es endlich fertig ...
Das ganze ist mit den bereits gegebenen Hilfen so trivial einfach, das es schon fast weh tut.
Hier nochmal zum mitschreiben
1. Vorlage WechselBild von http://www.coding-help.de/bild.html mit VS2010
geöffnet.2. stdafx.h: Warnung beseitigen durch zusätzliche defines
#define WINVER 0x501 #define _WIN32_WINNT 0x501 #include <atlimage.h> // Unterstützung von CImage
3. Methode ::OnButton1() auf (externes) jpg-Bild umgestellt
void CWechselBildDlg::OnButton1() { CString pathName = "C:\\image2.jpg"; // Mein Default Bild if(n_Merker==0) { // Gespeichertes Bild aus Variable löschen // Gespeichertes Bild aus Variable löschen m_Bitmap.DeleteObject(); // Variable neues Bild zuweisen CImage image; HRESULT hr = image.Load( pathName ); if(SUCCEEDED(hr)) { // not FAILED(hr) m_Bitmap.Attach(image.Detach()); } else { // Variable internes default-Bild zuweisen m_Bitmap.LoadBitmap(IDB_BITMAP2); } // Dem Bild-Element das geladene Bild zuweisen m_ctlBild.SetBitmap(m_Bitmap); // Merker setzen n_Merker=1; } ... }
Der geänderte Code versucht ein externes Bild aus pathName zu laden.
Damit das ganze nicht abstürzt, wenn das Bild nicht geladen werden kann,
war es sinnvoll eine Fehlerbehandlung zu implementieren.Wenn das Bild geladen werden konnte, wird es angezeigt, sonst wird das interne Default-Bild verwendet.
4. CFileDialog einbauen
MSDN Example for CFileDialog::DoModal hinzugefügt
http://msdn.microsoft.com/en-us/library/3xb6dhth.aspxsiehe auch: MSDN CFileDialog::CFileDialog
http://msdn.microsoft.com/en-us/library/wh5hz49d.aspx// NEUUUU CString pathName = "C:\\image2.jpg"; // szFilters is a text string that includes two file name filters: // "*.jpg" for "JPGType Files" and "*.*' for "All Files." TCHAR szFilters[]= "MyJPG Files (*.jpg)|*.jpg|All Files (*.*)|*.*||"; // Create an Open dialog; the default file name extension is ".jpg". CFileDialog fileDlg (TRUE, _T("jpg"), pathName, OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this); // Display the file dialog. When user clicks OK, fileDlg.DoModal() returns IDOK. if( fileDlg.DoModal() == IDOK ) { pathName = fileDlg.GetPathName(); } // END NEUU // Variable neues Bild zuweisen CImage image; ...
5. Das ganze kompiliert und ausprobiert - FERTIG!!
Mein Gott; ich mach den Karton an dieser Stelle zu und werde diese Stellen nicht weiter kommentieren.
-
1. Man braucht keinen kompletten Source-Code für mich erstellen, da ich bereits durch intensive Suche auf nützliche Projekte gestoßen bin, vor allem auf der genannten Seite.
2. Wenn ich das Projekt herunterlade und öffne, funktioniert es, jedoch wenn ich die Funktionen in meinem Projekt einfüge, klappt es nicht.
3. Die Aufgabenstellung und bzw. Mindestanforderung habe ich bereits niedergeschrieben. Die Fehler wurden schriftlich und mit Bildern beschrieben. Es wurde danach gefragt, ob einer weiß, woran es liegen kann. Allein eine Datei zu öffnen klappt nicht. CFileDialog m_File(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Bilder (.bmp)|.bmp;||"); Bei der Instanz TRUE zeigt es ein Problem, dass es nicht definiert wäre, obwohl es definiert ist. Benutze Visual Studio 2012.
4. Es freut mich, wenn du es eventuell gut drauf hast. Das gibt dir trotzdem kein Recht herabsetzend zu reden. Du solltest von deinem hohen Ross runterkommen. Entweder gebe nur Tipps und Hilfestellungen, ohne abwertende Kommentare, oder schreibe gar nichts. Ich weiß nicht, ob ich dir danken soll, oder dir auf die Fresse hauen soll. Trotzdem danke.
-
...
-
Ich habe keine Lust mich ebenfalls ständig zu wiederholen. Ich sage nicht nur es klappt nicht, sondern schildere auch die Sachlage anhand Beschreibung und Bilder. Die, von merano erwähnte, Seite (http://msdn.microsoft.com/en-us/library/wh5hz49d.aspx), hatte ich bereits gefunden. Nach diesem Code kann ich auch ein Dialogfenster öffnen und eine Datei auswählen, aber ohne Begrenzung. Sobald ich außer TRUE andere Instanzen einsetze, erscheint der Fehler, was ich geschildert und gezeigt habe. Habe anstatt TRUE auch 1 eingesetzt, ging auch nicht. (" http://www.fotos-hochladen.net/view/unbenannta2rg9yhnlx.jpg "). Danke für eure Hilfe, auch wenn einige Kommentare nicht zum guten Anstand gehörten. Ich werde mich alleine durchkämpfen. Außerdem Swordfish, meinen Kenntnisstand habe ich bereits Preisgegeben. Alles Gute.
-
Und? Der Online Parser versteht Deinen Code nicht...
Was sagt der Compiler?