Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Bild spiegeln

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.08.2004, 18:25 Uhr
A-l-e-x



Hi,

wie kann ich ein Bild spiegeln? (Es kann durch GDI oder DirectDraw gehen, alles recht) Wenn wir schon dabei sind, wie kann ich es auch umdrechen (auf den Kopf stellen)?

Gruß A-l-e-x
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.08.2004, 09:22 Uhr
NotUsed



ms paint
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.08.2004, 10:41 Uhr
Airdamn



Ich hab das zwar noch nicht gemacht, aber Du könntest wohl die Pixel vertauschen und dann neu zeichnen lassen.
Beim Horizontalspiegeln müsstest Du also bis zur Mitte der Bildbreite alle Pixel von der linken Seite auf die rechte Seite verschieben und umgekehrt.

Geschickt wäre es wohl, wenn Du hierbei den Pixel, den Du auf der rechten Seite "überschreibst", Dir vorher merkst und dann auf der linken Seite platzierst.

Analog dazu sollte es auch vertikal gehen.

Dieser Post wurde am 26.08.2004 um 10:43 Uhr von Airdamn editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.08.2004, 16:49 Uhr
A-l-e-x



Hi,

zu NotUsed: Ok, m$ paint kann das, aber das will ich auch können!
zu Airdamn: So hab ich es mir vorgestellt. Doch weis ich nicht wie es geht.
(Konkret würde mir ein Codeausschnitt oder ein link mit Tutorial helfen.)

mfg A-l-e-x
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.08.2004, 17:53 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


naja hängt insbesondere davon ab was du unter umdrehen verstehst, also um 180 Grad drehen oder einfach nur die zeilen vertauschen

angeommen du hast dein bitmap in einem array

also mybmp[xdim][ydim]


dann machst du dir einfach ein array gleicher grösse und kopierst da den scheiss rein...


C++:
for(int i=0;i<ydim;++i)
   for(int j=0;j<xdim;++j)
     tempbmp[j][i]=mybmp[j][ydim-1-i];    //vertical



horizontal dann halt
tempbmp[j][i]=mybmp[xdim-1-j][i];
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 26.08.2004 um 17:54 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.08.2004, 18:33 Uhr
A-l-e-x



Ok. und wie leg ich ein Bitmap in einem array an und vorallem wie krieg ich es wieder in ein bitmap Format (ich glaube HBITMAP oder ?)

mfg A-l-e-x
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
26.08.2004, 18:41 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


weiss ich nicht aus dem hut wie das geht... ich habs bisher nur lowlevel gemacht, also mich direkt mit dem bmp-format selber auseinandergesetzt und nicht irgendwelche winapi-funktionen zur hilfe genommen... (vielleicht gibts da sowas wie setPixel und getPixel)
ansonsten vermute ich mal FloSoft weiss wie es geht
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 26.08.2004 um 18:42 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
26.08.2004, 19:12 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


da du im MFC Forum postest, denke ich mal das du MFC benutzt.

bei CBitmap gibt es SetPixel und GetPixel, damit kannst du das dann umdrehen wie oben beschrieben.

Beispiel, falls gewünscht, kann ich mal bauen sobald ich zeit habe (momentan fehlt mir diese jedoch)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
29.08.2004, 15:00 Uhr
Spacelord
Hoffnungsloser Fall


Hi,
also über SetPixel,GetPixel geht es bestimmt, aber die Performance??
Bereits bei nem Bitmap von 100*100 reden wir hier über 10000 Funktionsaufrufe,bei denen der Initialisierungscode der Funktion wahrscheinlich grösser ist als der "Sinn"(einen Pixel setzen) der Funktion.
Also für Bilder nehm ich immer IPicture bzw. eine spezielle Klasse die IPicture kapselt.
Mit CPictureHolder gibt es auch eine "Standardversion" die den MFC beiliegt, meine Version brauch ich nur um die Bilddaten auch aus nem binärem Stream einer DB laden zu können und weil die Methoden von CPictureHolder doch recht "dünn" sind.

Wenn ich bei der Klassenmethode Render anstatt der linken oberen Ecke meiner Zeichenfläche z.B die rechte obere Ecke angebe,dafür aber die Breite des Bildes negativ angebe spiegelt Render mir das Bild 1A.Funktioniert auch horizontal.
Ich hab es zwar noch nie probiert aber ich kann mir schon vorstellen dass das bei CDC::BitBlt auch geht.

Ein ganz einfaches Beispiel das IPicture in nem Dialog direkt nutzt:

Im Header der Dialog Klasse:

C++:
#include<afxpriv2.h> //Für CArchiveStream

....
class CBlaBlub:public CDialog
{
.....
public:
    bool LoadPicDataFromFile();
protected:
    IPicture* pIPic;
    bool ShowPicture();
.......
}


Ausserdem hat der Dialog ein Static Feld(IDC_BILD) dem eine Membervariable CStatic m_Bild zugeordnet ist.

In der Implementierungsdatei des Dialogs:
pIPic muss im Konstruktor mit NULL initialisiert werden!!


C++:

//Dialog .cpp

bool CBlaBlub::LoadPicDataFromFile()
{
    CString pfad;
    CString filter = "JPG (*.jpg,*.jpeg,*.jpe)|*.jpg;*.jpeg;*jpe|Bitmaps (*.bmp,*.dib)|*.bmp;*.dib||";
    CFileDialog* getFile = new CFileDialog(TRUE,"*.jpg",NULL,
        OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,filter);
    if((getFile->DoModal())==IDOK)
    {
        pfad = getFile->GetPathName();
        delete getFile;
    }
    else
    {
        delete getFile;
        return false;
    }

    CFile f;
    if(!f.Open(pfad,CFile::modeRead))
        return false;
    else
    {
        CArchive ar(&f,CArchive::load|CArchive::bNoFlushOnDelete);
        CArchiveStream arStream(&ar);
        IStream* pIStr= &arStream;
        if(pIPic)
            pIPic->Release();
        HRESULT hr=OleLoadPicture(pIStr,0,FALSE,IID_IPicture,(void**)&pIPic);
        if(hr<0)
            return false;
    }
    f.Close();

    return true;
}


bool CBlaBlub::ShowPicture()
{
    CDC *theDC = m_Bild.GetDC();
    HDC hDC = theDC->GetSafeHdc();
    long hmWeite;
    long hmHoehe;
    CRect zeichenflaeche(0,0,0,0);

    pIPic->get_Width(&hmWeite);
    pIPic->get_Height(&hmHoehe);

    m_Bild.GetClientRect(&zeichenflaeche);

    //normal Zeichnen
    pIPic->Render(hDC,zeichenflaeche.left,zeichenflaeche.top,zeichenflaeche.Width(),zeichenflaeche.Height(),
        0,hmHoehe,hmWeite,-hmHoehe,NULL);
             /*vertikal spiegeln
             pIPic->Render(hDC,zeichenflaeche.right,zeichenflaeche.top,-zeichenflaeche.Width (),zeichenflaeche.Height(),
        0,hmHoehe,hmWeite,-hmHoehe,NULL); */

             /* horizontal spiegeln
             pIPic->Render(hDC,zeichenflaeche.left,zeichenflaeche.bottom,zeichenflaeche.Width(),-zeichenflaeche.Height(),
        0,hmHoehe,hmWeite,-hmHoehe,NULL); */


    return true;
}




Ist halt mal wieder alles andere als objektorientiert aber das Verkapseln musst du schon selber erledigen.Es lohnt sich auf jeden Fall!!
Ich hab für meine Bedürfnisse eine Klasse von CPictureHolder abgeleitet und entsprechend erweitert(Datenbankzugriff, Bilder im Originalverhältnis anzeigen usw.).Desweiteren hab ich von CStatic ne Klasse abgeleitet die ein Objekt von dieser Klasse enthält und sich ganz wunderbar und simpel wiederverwenden lässt.
IPicture kann übrigens Bilder jeden Formats anzeigen,also auch jpeg,wmf und gif!
Aber vorsicht mit .gif! Das Kompressionsverfahren ist patentiert und Programme die diesen Algorithmus nutzen müssen ne Lizenz haben.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 29.08.2004 um 15:01 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: