Von libSDL_image zu "normalen" Image

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Bei strukturierten variablen oder pointern entfällt das * innerhalb der struktur.

Code: Alles auswählen

Debug *image\format\RGBAshift
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Beitrag 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
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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? /:->
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Beitrag 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
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Beitrag 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
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Tompazi
Beiträge: 211
Registriert: 22.09.2007 15:38

Beitrag 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
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten