in bilder "schreiben"



  • hallo

    ich habe ne frage:

    Ein Freund von mir hat eine Webpage mit zig bildern, die er selbst gemacht hat.
    Bis jetzt war das so, dass er ein Bild in paint geladen hat, und dann seine url reingeschrieben hat.

    Wenn er aber aufeinmal 100 Bilder einfügt, daaaaauuuuert das lange.
    Jetzt hat ich mir überlegt, da es ja zig klassen gibt bilder ( jpeg ) zu laden und anzuzeigen, auch in diese Bilder einen text zu schreiben.

    Man könnte das auch so machen, dass man das Bild in der grösse xyz hat und ein anderes bild ( auch jpeg z.b. ), welches klein ist und nur die url hat ) draufzulegen. wäre gut wenn man es drauflegt ( trazparent, so das nur die schrift zu sehen ist)

    Ich weiss das es die klassen gibt, und die anzeigen ( auch tranzparent ) lassen kann, aber wie funktioniert das mit dem drüberlegen und dann abspeichern? gibt es da fertige fkt?

    z.b. pic1 = load_pic(mein_pfad)
    pic2 = load_pic(mein_pfad) // hat z.b. gleiche grösse, schrift nur unten recht und hintergrund ne defaultfarbe zum tranparent machen
    pic3 = pic1+pic2
    pic3 abspeichern.

    oder pic2 hat normale grösse und ich kann position angeben wo in pic1 draufgelegt werden soll.

    was auch nicht schlecht wäre, dass man einfach den explorer geöffnet hat und dann die bilder markiert und in eine listbox rüberzieht ( die bilder sollen dann alle bearbeitet werden. aber ich glaube in einer listbox kann man nicht "reinziehen". Welche klasse nimmt man dann da?

    merci

    PS: achja gibt es schon ein programm was sowas macht?



  • hmmm, also

    antwortet jetzt keiner, weil er

    - keine ahnung hat
    - die frage ihm zu doof ist
    - es nicht geht
    - mein problem nicht versteht
    - der antwort button an der stelle fehlt?



  • ich weiß zwar nicht, ab es auch einfacher geht, aber mit OpenCV ist das möglich, da lädst du das Bild, schreibst was rein und speicherts es wieder, ganz einfach und nur 3 Zeilen (+ 1 zur Deklaratioin des Bildpointers :))

    MfG



  • Du könntest GDI+ nehmen, es ist Windows native und läuft afaik ab Windows 98. Drag & Drop funktioniert in jedem Fenster, darüber solltest du dir am wenigsten Sorgen machen.

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/GDIPlus/GDIPlus.asp
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/GDIPlus/GDIPlusreference/classes.asp



  • also ich habe jetzt etwas gefunden und es so versucht

    int row = m_listbox_files.GetCurSel();
    	//CBitmap biBildchen;
    	CString str;
    	m_listbox_files.GetText(row,str);
      //biBildchen.LoadBitmap(str);
    
      //m_pic_control.SetBitmap(biBildchen);   // geht nicht, hmmm??
    
      /// neuer versuch, neue klasse
    
      CPicture pic;
      pic.Load(str); 
    
      CDC test;
      test.
       CRect rec;
       rec.SetRect(0,0,50,50;
    
    // jetzt würde ich den text schreiben
    
        pic.Show(test, rec  );  // hier würde ich das bild anzeigen ( mit dem text halt)
    
    // und hier abspeichern 	pic.SaveAsBitmap(m_pfad);
    

    m_pic_control.SetBitmap(biBildchen); leider geht das nicht. habe einfach ein piccontrol auf meinem dialog und ne control variable namens m_pic_control gegeben.
    jetzt müsste es doch angezeigt werden darin oder? da das nicht ging habe ich gedacht, dass es nicht geht, weil das bild zu gross ist. dann hab ich das bild kleiner gemacht, hat aber auch nichts geholfen 😞

    beim neuen versuch habe ich die Picture.h klasse genommen
    CRect gibt ja die kordinaten an. das krieg ich noch irgendwie hin. aber CDC?? damit kann ich auch formatiert ins bild schreiben. aber wie weise ich jetzt mein bild da hinzu??? es gibt ne funkt

    test.GetCurrentBitmap();  // warum nicht   test.GetCurrentBitmap(mein_pic);
    

    hmm wer kann helfen?



  • ok ich habs fast hingekriegt

    was muss ich machen, damit ich reinschreiben kann??
    ich kann bild laden und speichern
    nur das mit TextOut klappt nicht da ich mein
    pDC nicht meinem pic zuweisen kann. woher soll er wissen das ich jetzt pic meine?

    int row = m_listbox_files.GetCurSel();
    	CString str;
    	m_listbox_files.GetText(row,str);
    
      CPicture pic;
      pic.Load(str);   // ok bild ist drinnen
      DCD *pDC
         CRect rec;
    rec.SetRect(0,0,100,100);
    
      //pic.UpdateSizeOnDC(&cdc);  / hier bekommts leider nur die size, aber selbst das klappt nicht
      CString mobile = "www.lollig.de";
    // prob ist, wie sag ich ihm, dass mein pic pDC ist???
    // pDC.DrawText("www.lollig.de",rec,DT_CENTER);  // hier mit rec versucht
      pDC.TextOut(100,100,mobile);   // hier gehts ja anscheinend ohne
    
      //pic.Show(&pDC,rec);
      pic.SaveAsBitmap( "C:\\meinbild.bmp");  // jipi bild kann abgespeichert werden, wenn ich nicht versuche reinzuschreiben
    


  • hmm, fast hab ichs.
    also bis jetzt hab ich

    int row = m_listbox_files.GetCurSel();
    CBitmap Bild;
    CString str;
    m_listbox_files.GetText(row,str);
    Bild.LoadBitmap(str);              // hier mit CBitmap klasse
    
    CPicture pic;                      // hier ein versuch mit der CPicture Klasse
    pic.Load(str); 
    CRect rec;
    rec.SetRect(0,0,100,100);          // ein rec erzeugen
    
    font1.CreateFont( 12,                        // nHeight
            0,                         // nWidth
            0,                         // nEscapement
            0,                         // nOrientation
            FW_NORMAL,                 // nWeight
            FALSE,                     // bItalic
            FALSE,                     // bUnderline
            0,                         // cStrikeOut
            ANSI_CHARSET,              // nCharSet
            OUT_DEFAULT_PRECIS,        // nOutPrecision
            CLIP_DEFAULT_PRECIS,       // nClipPrecision
            DEFAULT_QUALITY,           // nQuality
            DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
            "Arial");                   // lpszFacename
    
    CString mobile = "www.meinesite.de";         // der zu schreibende string
    
    CDC speicherDC;
    
    speicherDC.CreateCompatibleDC(GetDC());
    speicherDC.SelectObject(&pic);                 // mal pic mal Bild stehen, kein fehler, aber es passiert auch nichts :(
    speicherDC.SelectObject(&font1);              //  den font zuweisen
    
    speicherDC.TextOut(500,500,mobile);            // hier versuch ich mit TextOut zu schreiben
    speicherDC.DrawText(mobile,rec,DT_CENTER);        // hier ein versuch mit der drawtext methode
    m_pic_control.SetBitmap(Bild);
    CDC MemDC;                                     // hab ich jetzt genommen, da im forum so einer bitmap abgespeichert hat
    MemDC.CreateCompatibleDC( &speicherDC );  
    MemDC.SelectObject(Bild);        
    
    speicherDC.SelectObject(Bild);               
    speicherDC.BitBlt(0,0,1000,900, &MemDC, 0,0, SRCCOPY); //Inhalt des MemDC in Bitmap blitten 
    
    HBITMAP hBitmap=Bild;
    
    WriteBitmap("c:\\test", hBitmap, speicherDC);       // irgendwie macht der hier gar nichts.
    
    pic.SaveAsBitmap( "C:\\meinbild.bmp");       // der versuch klappt um zu schreiben, aber speichert nicht die schrift mit rein :(
    
    // write fkt, hier im forum gefunden
    //====================================
    
    BOOL CBildprogrammDlg::WriteBitmap( LPTSTR szFile, HBITMAP hbitmap, HDC memdc)
    {
      BITMAP  bmp;
      //Informationen über die übergebene Bitmap sammeln, bmp ist der Zielpuffer der Infos
      if(GetObject(hbitmap, sizeof(BITMAP), &bmp))  
      {    
        BITMAPINFOHEADER BmpInfoHdr;  //Struktur für Bitmap-Infoheader
        BITMAPFILEHEADER BmpFileHdr;  //Struktur für Bitmap-Dateiheader
        //jetzt werden die gesammlten Infos in bmp ausgewertet und in die Strukts umgeschrieben
        BmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER);    
        BmpInfoHdr.biWidth = bmp.bmWidth;    
        BmpInfoHdr.biHeight = bmp.bmHeight;    
        BmpInfoHdr.biPlanes = bmp.bmPlanes;    
        BmpInfoHdr.biBitCount = 24;    
        BmpInfoHdr.biCompression    = BI_RGB;    
        BmpInfoHdr.biSizeImage        = bmp.bmWidth*bmp.bmHeight*3;    
        BmpFileHdr.bfType        = 0x4d42;    
        BmpFileHdr.bfReserved1        = 0;    
        BmpFileHdr.bfReserved2        = 0;    
        BmpFileHdr.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);    
        BmpFileHdr.bfSize = BmpFileHdr.bfOffBits+BmpInfoHdr.biSizeImage;  
    
        //Heap-Speicher für die ins DIB-Format zu konvertierende Bitmap organisieren
        bmp.bmBits = (void*)GlobalAlloc(GMEM_FIXED, BmpInfoHdr.biSizeImage);
    
        //Bitmap ins DIB-Format umwandeln, wenn erfolgreich wird die DIB geschrieben
        if(GetDIBits(memdc, hbitmap, 0, BmpInfoHdr.biHeight, bmp.bmBits,
            (BITMAPINFO*)&BmpInfoHdr, DIB_RGB_COLORS) == BmpInfoHdr.biHeight)      
        {    
          //Datei erzeugen über Win-API (ist performanter als fstream-Funktionen)
        HANDLE hFile = CreateFile(szFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL);
          //Datei erzeugen erfolgreich?
          if(hFile != INVALID_HANDLE_VALUE)  {          
            //hier wird die Anzahl der geschriebenen Bytes abgelegt, aber nicht ausgewertet
            DWORD dwTmp;  
            //Bitmap-Dateiheader schreiben
            WriteFile(hFile, &BmpFileHdr, sizeof(BITMAPFILEHEADER), &dwTmp, NULL);          
            //Bitmap-Infoheader schreiben
            WriteFile(hFile, &BmpInfoHdr, sizeof(BITMAPINFOHEADER), &dwTmp, NULL);          
            //Bitmap-Pixeldaten schreiben
            WriteFile(hFile, bmp.bmBits,  BmpInfoHdr.biSizeImage,   &dwTmp, NULL);        
            }  
          //Datei schliessen
          CloseHandle(hFile);      
        }    
        //Heapspeicher freigeben
        GlobalFree(bmp.bmBits);
        return TRUE;
      }
      //Nicht erfolgreich gewesen, leider leider ...
      return FALSE;
    }
    
    m_pic_control.SetBitmap(Bild);   // ein Control Picture element eingefuegt
    // einfach in meinen dialog gezogen, markiert, und ne control variable vergeben, aber mit SetBitmap, passiert da gar nichts :( 
    // wie ist es wenn das bild 1024*768 gross ist, aber mein control nur 200*200?
    // formartiert er richtig ( wohl kaum ) oder hab ich dann nur das obere eck ( anzunehmen)
    


  • also 2 fragen

    benutzt niemand bitmap zum speichern?

    kennt ihr ne klasse, welche

    1.bitmap einfach laden und dann wieder speichern kann anhand von einem pfad?
    2. eine klasse die mit jpeg und so zurechtkommt
    3. eine klasse wo wo ich ein bild bearbeiten kann ( sprich in der art von textout )?

    wenn nicht wieso kann ich textout machen, aber das bild bleibt gleich?
    wie speichert ihr die bitmaps?

    habe bei codeguru nach klassen geschaut

    kann mit dieser klasse
    1. laden
    2. speichern
    kann ich jetzt irgendwie konvertieren zw. jpeg und bmp?

    hat noch niemand bilder bearbeitet?
    wie gesagt, weiter oben ist mein code.


Anmelden zum Antworten