Buchstabe zu Bitmap



  • //Variablen dekleration
    	CBitmap cBitmap;
    	CDC cDC;
    	CDC* pDC = this->GetDC();
    
    	cDC.CreateCompatibleDC(pDC);
    	cBitmap.CreateCompatibleBitmap(pDC,64,8);
    	cDC.SelectObject(cBitmap);
    	cDC.TextOutA(0,0,m_value,m_value.GetLength());
    
    	m_abcd = cBitmap.GetBitmapBits(1,pDC);
    
    cDC.DeleteDC();
    

    Ich steck irgendwo fest. Und ich hab keine ahnung warum.



  • So habs nun doch hinbekommen:

    UpdateData(true);
    
    	CBitmap cBitmap;
    	CDC cDC;
    	CDC* pDC = this->GetDC();
    
    	cDC.CreateCompatibleDC(pDC);
    	cBitmap.CreateCompatibleBitmap(pDC,64,8);
    	cDC.SelectObject(&cBitmap);
    
    	cDC.TextOutA(0,0,m_value,m_value.GetLength());
    
    //	pDC->BitBlt(10, 10, 64, 8, &cDC, 0, 0, SRCCOPY);
    
    	cDC.DeleteDC();
    
    	UpdateData(false);
    

    Nur hab ich ein Problem mit dem .GetBitmapBits(). Ich hab diverse quellen durchgesehen und da stand was, dass man das nicht mehr nutzen soll und lieber
    GetDIBit() nehmen soll. Hab aber nicht rausbekommen warum.

    Ich würde halt gerne die einzelnen Bits zur weiterverarbeitung auslesen.
    Hoffe ich liege wenigstens mit GetBitmapBits() richtig...?



  • Uruk-h4j schrieb:

    <einmischung in Selbstgespräch per Telepatie>
    Irgendwie muss man ja anfangen und wenns keine Beispiel gibt, wo man schauen kann wies in etwas aufgebaut ist wird man irre </einmischung in Selbstgespräch per Telepatie>

    Kauf Dir ein C++ Buch, lern die Grundlagen und beginn dann (ebenfalls begleitet von einem Buch oder einem _guten_ Tutorial) mit einer objektorientierten (modernen, MFC ist NICHT modernes C++ -Ganz im Gegenteil) API.


  • Mod

    Uruk-h4j schrieb:

    So habs nun doch hinbekommen:

    UpdateData(true);
    
    	CBitmap cBitmap;
    	CDC cDC;
    	CDC* pDC = this->GetDC();
    	
    	cDC.CreateCompatibleDC(pDC);
    	cBitmap.CreateCompatibleBitmap(pDC,64,8);
    	cDC.SelectObject(&cBitmap);
    	
    	cDC.TextOutA(0,0,m_value,m_value.GetLength());
    
    //	pDC->BitBlt(10, 10, 64, 8, &cDC, 0, 0, SRCCOPY);
    
    	cDC.DeleteDC();
    
    	UpdateData(false);
    

    1. alte Bitmap merken, bei SelectObject.
    2. alte Bitmap vor DC zerstören wieder einselektieren.

    Du hast also eine CBitmap, was wilst Du nun eigentlich damit. Du wolltest doch eine, das war doch Deine primäre Frage!



  • Ich muss/will die einzelnen Bits bzw. Zeilen als Bits auslesen. Die brauch ich für ne LED-Matrix zum senden der Daten.

    Wie gesagt hab nen Beispiel in Delphi gefunden, aber das ist halt ein wenig anders als C. Da wird das halt so gemacht ,dass die Daten in ein BMP gepackt werden und dann die Zeilen als Bits gelesen werden. Von der Theorie simpel, aber das umsetzen ist recht schwer, wenn man keinen wirklichen anhaltspunkt hat.

    Aber mit dem hier werd ich das schon hin bekommen (hoffe ich).
    Nur noch die Frage, was ich nehmen soll an functione. GetBirmapBits() oder GetDIBits()....


  • Mod

    Monochrome Bitmap erzeugen. Und dann einfach mit GetPixel drüber laufen.
    Ist zwar lahm, aber für 8x8 oder 64x64 oder solche kleine Werte vollkommen zu vernachlässigen.



  • Jo hab ich mir auch gerade gedacht.
    Ich werds probieren und mal das Ergebnis hier kund tun.

    Danke für deine Hilfe!



  • Sooo...
    ich hab den code fertig und stelle gerade fest, das er die daten nicht so einließt, wie das Bild wirklich dargestellt wird.

    Spricht sehe (ein "F"):

    XXXXXOOO
    XXXXXOOO
    XOOOXOOO
    XOXXXOOO
    XOOOXOOO
    XOXXXOOO
    XOXXXOOO
    XOXXXOOO

    aber daten sehen so aus:

    XXXXXXXX
    XXOOOOOO
    XXOXOXXX
    XXOXOXXX
    XXXXXXXX
    OOOOOOOO
    OOOOOOOO
    OOOOOOOO

    Also sprich der ganze kram ist gedreht und zwar um 90° und spiegelverkehrt.

    CBitmap cBitmap;
    	CDC cDC;
    	CDC* pDC = this->GetDC();
    	UCHAR bits[512] = {};
    	UCHAR bytes[64] = {};
    	int loop = 0;
    	int wBit = 0;
    	CFont cFont;
    
    	cFont.CreateFont(10, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial");
    
    	cDC.CreateCompatibleDC(pDC);
    	cBitmap.CreateCompatibleBitmap(pDC,64,8);
    	cDC.SelectObject(&cBitmap);
    	cDC.SelectObject(&cFont);
    	cDC.TextOutA(0,0,m_value,m_value.GetLength());
    
    	//Output on dialog
    	pDC->BitBlt(0, 0, 64, 8, &cDC, 0, 0, SRCCOPY);
    
    	//Get Pixel from cBitmap into cTemp[]
    	for(int i = 0; i < 8; i++)
    	{
    		for(int j = 0; j < 64; j++)
    		{
    			loop++; 
    			bits[loop-1] = GetPixel(cDC,i,j);
    		}
    	}
    
    cDC.DeleteDC(); 
    
    	for(int x = 0; x < 64; x++)
    	{
    		//Create a Byte from 8 bit
    		for(int y = 0; y < 8; y++) //trans[0] |= data[128+l]<<1;
    		{
    			wBit++;
    			bytes[x] = bytes[x]<<1;
    			if( bits[(wBit-1)+y] == NULL ) //!= NULL für original daten
    				bytes[x] |= 1;
    		}
    	}
    

    Mach ich irgendwas falsch mit der Grafik?
    Bitte um hilfe


  • Mod

    Was soll denn das mit den beiden Arrays? Warum verwendest Du GetPixel nicht direkt und speicherst es nicht sofort?

    Deine Schleife geht ja auch von Oben nach unten? Das heißt erst Splate 0 Pixel speichern, dann Spalte 1. Dadurch hast Du die 90% Drehung.

    Und dadurch dass Du einschiftest von rechts nach links bekommst Du eine Spiegelung.
    Wundert mich nicht....

    Was willst Du eigentlich haben? Ich dachte Du wolltest einen Array [8][8]? Warum benutzt Du keinen?



  • ahh ok..dass mit den spalten erklärt vieles. Ist aber ehrlich ein blöder fehler von mir. jetzt wi ichs getauscht hab les ich auch mehr daten ^^ Aber wieso von rechts nach links? der erste pixel ist doch o/o oben links in der ecke. oder seh ich dasc falsch?

    Aber wie meinst du das mit dem direkten speichern? DA steig ich noch nicht durch.
    Das mit den beiden arrays hab ich so gewählt, da ich das als einfachsten weg gesehen hab. braucht ja zum schluss schließlich 64 Bytes.


Anmelden zum Antworten