Seite 2 von 3

Verfasst: 02.06.2009 15:41
von ts-soft
Bei strukturierten variablen oder pointern entfällt das * innerhalb der struktur.

Code: Alles auswählen

Debug *image\format\RGBAshift

Verfasst: 02.06.2009 15:45
von Tompazi
Danke,
das steht aber nicht im Reference Manual oder?

so, wo finde ich da jetzt die Pixelinformation? Höhe und breite habe ich schon...

MfG Tompazi

Verfasst: 02.06.2009 15:58
von Kaeru Gaman
> so, wo finde ich da jetzt die Pixelinformation? Höhe und breite habe ich schon...

ermn...
orginal:

Code: Alles auswählen

typedef struct SDL_Surface {
    Uint32 flags;                           /* Read-only */
    SDL_PixelFormat *format;                /* Read-only */
    int w, h;                               /* Read-only */
    Uint16 pitch;                           /* Read-only */
    void *pixels;                           /* Read-write */
    SDL_Rect clip_rect;                     /* Read-only */
    int refcount;                           /* Read-mostly */

  /* This structure also contains private fields not shown here */
} SDL_Surface;
deins:

Code: Alles auswählen

      Structure My_SDL_Surface
        flags.i
        *format.My_SDL_PixelFormat
        h.i
        w.i
        pitch.w
      EndStructure 
wo ist dein pointer *pixel?

ohne dem wirst du ja kaum die bitmap finden...

mehr noch....
wenn du ne struct zurückgeben läßt, auf nen strukturierten pointer mit ner kürzeren struktur, ruinierst du dir doch den Heap...

also... warum nich gleich die Routine "crash" in der system32.dll callen? /:->

Verfasst: 02.06.2009 18:34
von Tompazi
wenn du ne struct zurückgeben läßt, auf nen strukturierten pointer mit ner kürzeren struktur, ruinierst du dir doch den Heap...
Ich weiß zwar nicht was ein Heap ist aber es scheint zu funktionieren und außerdem:
/* This structure also contains private fields not shown here */
soll ich etwa noch 10 Dummys hinzufügen? <)

.

Ok was mach ich jetzt mit dem *pixels pointer?

Code: Alles auswählen

      Image$ = "sample.gif"
             
      Structure My_SDL_Surface
        flags.i
        *format.SDL_PixelFormat
        h.i
        w.i
        pitch.w
        *pixels ;; <-- !!
      EndStructure
      
      If OpenLibrary(0,"/usr/lib/libSDL_image-1.2.so.0.1.5") And ExamineLibraryFunctions(0)
         Define *image.My_SDL_Surface
         *image=CallFunction(0,"IMG_LoadTyped_RW",SDL_RWFromFile_(Image$, "rb"), 1, "GIF")
         Debug *image\h
         Debug *image\w
         SDL_LockSurface_(*image)
         Debug *image\pixels ;; <-- ??
      EndIf
MfG Tompazi

Verfasst: 02.06.2009 18:55
von ts-soft
Das mit dem Heap kannste auch getrost wieder vergessen, ist blödsinn.

Der Speicher wird ja von SDL reserviert, wenn Deine Strukture kleiner ist,
haste eben keinen strukturierten zugriff auf den Rest, was aber unwichtig ist,
wenn Du es nicht brauchst.

Verfasst: 02.06.2009 19:05
von Kaeru Gaman
ach rüschtüsch.... das is ja nur der pointer, der speicher is woanders...
also vergisses wieder, ts hat recht.

> Ok was mach ich jetzt mit dem *pixels pointer?

der zeigt auf den speicherbereich wo deine Bilddaten drinstehen.

Verfasst: 02.06.2009 19:59
von Tompazi
> Ok was mach ich jetzt mit dem *pixels pointer?

der zeigt auf den speicherbereich wo deine Bilddaten drinstehen.
Das hab ich schon verstanden aber so:

Code: Alles auswählen

CatchImage(0,@*image\pixels)
gehts nicht.

MfG Tompazi

Verfasst: 02.06.2009 20:48
von Kaeru Gaman
@*image\pixels

wär sowieso falsch, du willst ja nicht die adresse vom pointer haben,
sondern die auf die er zeigt, also nur *image\pixels.

... und per CatchImage gehts natürlich auch nicht.
Catch ist dafür da, um komplett includierte fertig codierte Files "aus dem speicher zu laden".
also, so wie von Platte, nur eben aus dem Speicher.

eine Bitmap hingegen (kein BMP-file) ist wirklich nur ein Array von Farbwerten.
als File wär das ne .RAW (glaubich)
in welchem Format die da drinstehen, dafür sind ja die infos in SDL_PixelFormat da.

wenn zum beispiel in BytesPerPixel ne 4 drinsteht, dann steht in deiner Bitmap alle vier bytes das nächste pixel.

der Farbwert eines Pixels(x,y) müßte theoretisch mit
PeekL( *image\pixels + BytesPerPixel * x + pitch * y )
erreichbar sein.

PS
... und wenn du jetzt den ganzen Aufwand treibst, um den dort integrierten GIF Decoder zu benutzen,
dann schreibst du besser den GIF-Decoder in PureBasic nach als so nen Umstand zu machen... ;)

PPS
zumal GIF ein 256farb-format ist, das wird dann wahrscheinlich auch als indizierte 8bit-Bitmap gespeichert,
da müßtest du wohl sowieso auch noch mit der Palette rumdaddeln.

Verfasst: 02.06.2009 20:58
von Tompazi
Danke für die klare Antwort.
Wenns mir nur um GIF ging aber es geht auch um:
TGA
TrueVision Targa (MUST have .tga)
BMP
Windows Bitmap(.bmp)
PNM
Portable Anymap (.pnm)
.pbm = Portable BitMap (mono)
.pgm = Portable GreyMap (256 greys)
.ppm = Portable PixMap (full color)
XPM
X11 Pixmap (.xpm) can be #included directly in code
This is NOT the same as XBM(X11 Bitmap) format, which is for monocolor images.
XCF
GIMP native (.xcf) (XCF = eXperimental Computing Facility?)
This format is always changing, and since there's no library supplied by the GIMP project to load XCF, the loader may frequently fail to load much of any image from an XCF file. It's better to load this in GIMP and convert to a better supported image format.
PCX
ZSoft IBM PC Paintbrush (.pcx)
GIF
CompuServe Graphics Interchange Format (.gif)
JPG
Joint Photographic Experts Group JFIF format (.jpg or .jpeg)
TIF
Tagged Image File Format (.tif or .tiff)
LBM
Interleaved Bitmap (.lbm or .iff) FORM : ILBM or PBM(packed bitmap)
HAM6, HAM8, and 24bit types are not supported.
PNG
Portable Network Graphics (.png)
Kurz gesagt ich will so viel wie mögliche Bildformate mit meinem FotoEditor öffnen können.

MfG Tompazi

Verfasst: 02.06.2009 21:00
von Kaeru Gaman
ok..
also ich rate dir, dich ausührlich auch mit dem PB-Image format zu beschäftigen.
das müßte recht ähnlich aussehen, also auch nen Header, FormatDesriptor, ggf. Palette und natürlich die Haupt-Bitmap.

das wird dir helfen, routinen zu schreiben die direkt übertragen können.

oder

du arbeitest gleich komplett mit Routinen die SDL-Images benutzen.