Avatar billede alex_sleiborg Nybegynder
16. september 2008 - 08:17 Der er 13 kommentarer

Billede som data type

Hej...

Jeg er igang med at lave en spillekort klasse. Jeg har nogle jpeg filer, som er billeder af forskellige kort. Men jeg skal et array af billeder. Hvordan finder jeg den data type. I C# sharp ville man kunne gemme dem som images? Håber i kan forstå, hvad jeg mener
Avatar billede arne_v Ekspert
16. september 2008 - 08:58 #1
Du kan altid gemme dem som chars (du har en char* som peger paa et noedvendigt antal
allokerede chars).

Derudover kan du sikkert ogsaa gemme dem som en type fra det GUI framework du bruger.
Avatar billede alex_sleiborg Nybegynder
16. september 2008 - 09:02 #2
Jeg bruger MFC, det må da indeholde nogle billed typer. Men vil gerne holde denne klasse uafhængig af MFC, så den kunne bruges i andre projekter, hvor jeg ikke bruger det. Forstår ikke helt, hvordan at man kan gemme dem som chars. Har du et link til et eller andet, eller kan du lave et hurtigt eksempel?
Avatar billede arne_v Ekspert
16. september 2008 - 09:38 #3
Du kan vel altid laese filen ind i et byte array (char er byte i C++).
Avatar billede bertelbrander Novice
16. september 2008 - 19:24 #4
Sidste jeg kikkede på MFC (det er heldigvis lang tid siden) kunne den ikke læse eller vise .jpg billeder.

Du kunne prøve at kikke på jdraw: http://damb.dk/graphics.php
Det er (bl.a.) en semi portabel måde at læse og vise .jpg billeder.
Avatar billede simtex Nybegynder
26. september 2008 - 23:53 #5
Ellers er openCV også en hurtig løsning. Indlæs billede:

IplImage *img = cvLoadImage("c:\mitbilled.jpg");
Avatar billede alex_sleiborg Nybegynder
08. oktober 2008 - 12:41 #6
Har haft lidt travlt, så har ikke haft tid til at kigge på det igen, før nu altså. Sorry.
Jeg har haft kigget på dit JDraw, hvor du benytter "Independent JPEG Group's free JPEG software". For at vise billeder i min dialog, så skal jeg vel bruge deres bibliotek? Og selv skrive en klasse, som kan indeholde billederne?
Avatar billede bertelbrander Novice
08. oktober 2008 - 12:48 #7
.zip filen indeholder alt det du skal bruge, inklusive "Independent JPEG Group's free JPEG software", der bliver til en dll.

I filen image.h er der en class der hedder ImageClass, denne indeholder et billede og funktioner til at læse og skrive billedet, samt simple manipulationer som f.eks. at ændre størrelse.

Du kan så lave et class til at indholde en række billeder eller du kan bruge en std::vector eller std::list
Avatar billede alex_sleiborg Nybegynder
08. oktober 2008 - 13:02 #8
Jeg prøver mig lidt frem, ellers må jeg jo skrive igen. Men den laver ingen .dll, men derimod en .lib, men det er vel det samme ikke?
Avatar billede alex_sleiborg Nybegynder
08. oktober 2008 - 13:25 #9
Får en lang liste af fejl, når jeg tilføjer image.h, image.cpp, drawstd.h. Jeg bruger VC++

Warning    1    warning C4627: '#include "drawstd.h"': skipped when looking for precompiled header use    c:\Documents and Settings\Alex Sleiborg\Skrivebord\jdraw2\image.cpp    1    Algoritmer
Warning    2    warning C4627: '#include <utility>': skipped when looking for precompiled header use    c:\Documents and Settings\Alex Sleiborg\Skrivebord\jdraw2\image.cpp    2    Algoritmer
Warning    3    warning C4627: '#include <algorithm>': skipped when looking for precompiled header use    c:\Documents and Settings\Alex Sleiborg\Skrivebord\jdraw2\image.cpp    3    Algoritmer
Warning    4    warning C4627: '#include "image.h"': skipped when looking for precompiled header use    c:\Documents and Settings\Alex Sleiborg\Skrivebord\jdraw2\image.cpp    4    Algoritmer

Hvad gør jeg galt der?
Avatar billede bertelbrander Novice
08. oktober 2008 - 17:07 #10
Det er mig der husker forkert, det er et lib den laver. Et lib er ikke det samme som en dll.

Fejlen tyder på at du bruge precompiled headers. Så du skal nok tilføje:
#include <stdafx.h>
Som det første i .cpp filerne.
Jeg kan ikke huske om det er stdafx.h, men det er den samme fil som dine andre .cpp filer inkluderer som det første.
Avatar billede alex_sleiborg Nybegynder
08. oktober 2008 - 22:02 #11
Ja, det hjalp lidt på det. Men der er stadig nogle fejl.

Warning    1    warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    c:\Documents and Settings\Alex Sleiborg\Skrivebord\jdraw2\image.cpp    20    Algoritmer
Warning    2    warning C4244: '=' : conversion from 'uint16_t' to 'uint8_t', possible loss of data    c:\Documents and Settings\Alex Sleiborg\Skrivebord\jdraw2\image.cpp    93    Algoritmer
Warning    3    warning C4244: '=' : conversion from 'uint16_t' to 'uint8_t', possible loss of data    c:\Documents and Settings\Alex Sleiborg\Skrivebord\jdraw2\image.cpp    123    Algoritmer
Warning    4    warning C4996: '_splitpath': This function or variable may be unsafe. Consider using _splitpath_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    c:\Documents and Settings\Alex Sleiborg\Skrivebord\jdraw2\image.cpp    248    Algoritmer
Warning    5    warning C4996: 'stricmp': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _stricmp. See online help for details.    c:\Documents and Settings\Alex Sleiborg\Skrivebord\jdraw2\image.cpp    249    Algoritmer
Warning    6    warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    c:\Documents and Settings\Alex Sleiborg\Skrivebord\jdraw2\image.cpp    436    Algoritmer
Error    7    error LNK2001: unresolved external symbol "int __cdecl ReadJpegFile(char const *,unsigned int * * &,int &,int &,bool &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?ReadJpegFile@@YAHPBDAAPAPAIAAH2AA_NAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)    image.obj    Algoritmer
Error    8    error LNK2001: unresolved external symbol "void __cdecl WriteJpegFile(char const *,unsigned int * * &,int &,int &,int)" (?WriteJpegFile@@YAXPBDAAPAPAIAAH2H@Z)    image.obj    Algoritmer
Error    9    fatal error LNK1120: 2 unresolved externals    C:\Documents and Settings\Alex Sleiborg\Dokumenter\universitet\Algorithms and Data Structures\Algoritmer\Release\Algoritmer.exe    1    Algoritmer

Kan du også hjælpe med dem?
Avatar billede bertelbrander Novice
08. oktober 2008 - 22:42 #12
De første mange er sære warnings som du trygt kan ignorerer eller få compileren til at ignorere.

De to "unresolved external symbol" burde du kunne fixe ved at linke til biblioteket, dvs .\jpeg-6b\jpeglibvc.lib
Avatar billede alex_sleiborg Nybegynder
05. januar 2009 - 22:27 #13
Sorry for den langsome respons, men har haft travlt med alt muligt andet. Jeg er gået over til at bruge qt i stedet for MFC. Og bliver i stedet laver jeg en app til linux, egentlig bare for at lære lidt c++ og bruge QT framework. Jeg er igang med at lave en spillekort klasse, den er langt fra færdig og der mangler en masse, men prøv at se bort fra det. Jeg prøver at lave klassen sådan at jeg kan oprette et kort objekt fra min widget af, og kalde en display(posX,posY,sizeWidth,sizeHeight) funktion, som tager position og størrelsen som billedet skal være. Men synes jeg har lidt svært ved at komme igang, jeg har copy pastet noget kode som jeg har fundet og sat ind. Men det er ikke gjort rigtigt. Kan du lave den show funktion? Og er det den rigtige måde at lave det på?

Header

#include <stdio.h>
#include <assert.h>
#include <qapplication.h>
#include <qwidget.h>
#include <qpixmap.h>
#include <qpoint.h>
#include <X11/Xutil.h>

class RawQPixmap : public QPixmap {
public:
    RawQPixmap() : QPixmap() {}
    RawQPixmap(int w, int h, int depth=-1)
        : QPixmap(w, h, depth, BestOptim) {}
    char* get_ximage_data() {
        return ((XImage*)(data->ximage))->data;
    }
    void update_ximage_data() {
        XPutImage(x11Display(), hd, qt_xget_readonly_gc(x11Screen(), FALSE),
            (XImage*)(data->ximage), 0, 0, 0, 0, width(), height());
    }
};

class Cards : public QWidget {
    enum card_t { HEARTS, DIAMONDS, CLUBS, SPADES };
    enum cardValue_t {ACE, TWO, THREE, FOUR, FIFE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING};
   
    public:
            Cards();
        Cards(cardValue_t);
        Cards(cardValue_t, card_t);
        ~Cards();
    protected:
        virtual void paintEvent(QPaintEvent*);
    private:
        card_t *thisCardType;
        cardValue_t *thisCardValue;
        char* SetImage();
        void LoadImage();
        RawQPixmap m_pixmap;
};

Source

#include "Cards.h"

Cards::Cards() {

}
Cards::Cards(cardValue_t cardValue) {
    thisCardValue = new cardValue_t;
    *thisCardValue = cardValue;
}
Cards::Cards(cardValue_t cardValue, card_t cardType) {
    thisCardValue = new cardValue_t;
    *thisCardValue = cardValue;
    thisCardType = new card_t;
    *thisCardType = cardType;
    SetImage();
}

Cards::~Cards() {
    delete thisCardType;
    delete thisCardValue;
}
char* Cards::SetImage() {
    char* file;
    switch (*thisCardType) {
        case HEARTS :
            switch (*thisCardValue) {
                case ACE :
                    file = "images/Playing Cards/Ah.jpg";
                    break;
                case TWO :
                    file = "images/Playing Cards/2h.jpg";
                    break;
                case THREE :
                    file = "images/Playing Cards/3h.jpg";
                    break;
                case FOUR :
                    file = "images/Playing Cards/4h.jpg";
                    break;
                case FIFE :
                    file = "images/Playing Cards/5h.jpg";
                    break;
                case SIX :
                    file = "images/Playing Cards/6h.jpg";
                    break;
                case SEVEN :
                    file = "images/Playing Cards/7h.jpg";
                    break;
                case EIGHT :
                    file = "images/Playing Cards/8h.jpg";
                    break;
                case NINE :
                    file = "images/Playing Cards/9h.jpg";
                    break;
                case TEN :
                    file = "images/Playing Cards/Th.jpg";
                    break;
                case JACK :
                    file = "images/Playing Cards/Jh.jpg";
                    break;
                case QUEEN :
                    file = "images/Playing Cards/Qh.jpg";
                    break;
                case KING :
                    file = "images/Playing Cards/Kh.jpg";
                    break;
            }
            break;
        case DIAMONDS :
            switch (*thisCardValue) {
                case ACE :
                    file = "images/Playing Cards/Ad.jpg";
                    break;
                case TWO :
                    file = "images/Playing Cards/2d.jpg";
                    break;
                case THREE :
                    file = "images/Playing Cards/3d.jpg";
                    break;
                case FOUR :
                    file = "images/Playing Cards/4d.jpg";
                    break;
                case FIFE :
                    file = "images/Playing Cards/5d.jpg";
                    break;
                case SIX :
                    file = "images/Playing Cards/6d.jpg";
                    break;
                case SEVEN :
                    file = "images/Playing Cards/7d.jpg";
                    break;
                case EIGHT :
                    file = "images/Playing Cards/8d.jpg";
                    break;
                case NINE :
                    file = "images/Playing Cards/9d.jpg";
                    break;
                case TEN :
                    file = "images/Playing Cards/Td.jpg";
                    break;
                case JACK :
                    file = "images/Playing Cards/Jd.jpg";
                    break;
                case QUEEN :
                    file = "images/Playing Cards/Qd.jpg";
                    break;
                case KING :
                    file = "images/Playing Cards/Kd.jpg";
                    break;
            }
            break;
        case CLUBS :
            switch (*thisCardValue) {
                case ACE :
                    file = "images/Playing Cards/Ac.jpg";
                    break;
                case TWO :
                    file = "images/Playing Cards/2c.jpg";
                    break;
                case THREE :
                    file = "images/Playing Cards/3c.jpg";
                    break;
                case FOUR :
                    file = "images/Playing Cards/4c.jpg";
                    break;
                case FIFE :
                    file = "images/Playing Cards/5c.jpg";
                    break;
                case SIX :
                    file = "images/Playing Cards/6c.jpg";
                    break;
                case SEVEN :
                    file = "images/Playing Cards/7c.jpg";
                    break;
                case EIGHT :
                    file = "images/Playing Cards/8c.jpg";
                    break;
                case NINE :
                    file = "images/Playing Cards/9c.jpg";
                    break;
                case TEN :
                    file = "images/Playing Cards/Tc.jpg";
                    break;
                case JACK :
                    file = "images/Playing Cards/Jc.jpg";
                    break;
                case QUEEN :
                    file = "images/Playing Cards/Qc.jpg";
                    break;
                case KING :
                    file = "images/Playing Cards/Kc.jpg";
                    break;
            }
            break;
        case SPADES :
            switch (*thisCardValue) {
                case ACE :
                    file = "images/Playing Cards/As.jpg";
                    break;
                case TWO :
                    file = "images/Playing Cards/2s.jpg";
                    break;
                case THREE :
                    file = "images/Playing Cards/3s.jpg";
                    break;
                case FOUR :
                    file = "images/Playing Cards/4s.jpg";
                    break;
                case FIFE :
                    file = "images/Playing Cards/5s.jpg";
                    break;
                case SIX :
                    file = "images/Playing Cards/6s.jpg";
                    break;
                case SEVEN :
                    file = "images/Playing Cards/7s.jpg";
                    break;
                case EIGHT :
                    file = "images/Playing Cards/8s.jpg";
                    break;
                case NINE :
                    file = "images/Playing Cards/9s.jpg";
                    break;
                case TEN :
                    file = "images/Playing Cards/Ts.jpg";
                    break;
                case JACK :
                    file = "images/Playing Cards/Js.jpg";
                    break;
                case QUEEN :
                    file = "images/Playing Cards/Qs.jpg";
                    break;
                case KING :
                    file = "images/Playing Cards/Ks.jpg";
                    break;
            }
            break;
    }
    return file;
}
void Cards::LoadImage() {

    int w, h, d;

    setCaption(SetImage());
   
    m_pixmap.setOptimization(QPixmap::BestOptim);
    m_pixmap.load(SetImage());

    w = m_pixmap.width(),
    h = m_pixmap.height();
    d = m_pixmap.depth();
    resize(w, h);

    printf("width=%d, height=%d, depth=%d\n", w, h, d);
    assert(m_pixmap.depth() == 24);

    char* p = m_pixmap.get_ximage_data();
    int* pi = (int*) p;

    assert((w&1) == 0 && (h&1) == 0);
   
    for (int i=0; i<w*h/4; ++i)
        *pi++ = 0x000000ff;    /* BLUE */
    for (int i=0; i<w*h/4; ++i)
        *pi++ = 0x0000ff00;    /* GREEN */
    for (int i=0; i<w*h/4; ++i)
        *pi++ = 0x00ff0000;    /* RED */
    for (int i=0; i<w*h/4; ++i)
        *pi++ = 0x00ffffff;    /* WHITE */

    m_pixmap.update_ximage_data();

}
void Cards::paintEvent(QPaintEvent*)
{
    bitBlt(this, QPoint(0, 0), &m_pixmap, m_pixmap.rect(), CopyROP);
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester