Bilddatei verarbeiten mit C
-
Nachdem ich mich schon eine Weile mit C rumschlage, bin ich auf eine ganze Reihe von Sachen sehr neugierig:
Ich wollte mit meinem nächsten Programm mal eine "Nicht-Text"-Datei einlesen. Ein Bild fände ich sehr interessant (Format soll erstmal unkomprimiert sein, also bmp - falls der Aufwand zu gängigeren Formaten nicht zu groß wird, wäre ich aber auch da interessiert), allerdings bin ich da ziemlich ratlos. Soweit ich weiß, hat die Bilddatei einen Header (den werde ich wohl nur einlesen, aber nicht weiter verarbeiten müssen) und natürlich das Bild. Theoretisch müsste ja unter Beachtung einer gewissen Reihenfolge für jeden Pixel eine Ziffer vorhanden sein, die die genaue Farbe angibt (ein 32-Bit unsigned long klingt da ganz passend). Allerdings werden die Bildfarben ja in verschiedenen Kanälen gespeichert (soweit ich bisher weiß), was meine Vorstellung ein wenig erschüttert. Dazu kommen noch gewisse Unterschiede zwischen Graustufen- und Farb-Bildern...
Ich wäre nun für Anregungen ganz dankbar, wie ich denn das Bild in einem Array abspeichern kann. Als einfaches Ziel hätte ich mir erstmal die Farbumkehr gedacht, vielleicht auch die Manipulation eines Bildes - ein Muster einzeichnen oder sonstwas.Falls jemand bereit ist, mir da ein paar Grundlagen zu erklären oder mir zu sagen, wo ich an Informationen komme, wäre ich sehr dankbar.
-
Du wirst dich wundern ... so einfach ist das mit den Bitmaps auch wieder nicht.
Zumindest wenn du den Bereich der Indexbasierten Bitmaps verlässt. (Alles mit mehr als 8 bpp)Lang lang ist's her, da habe ich eine Klasse zum Bearbeiten von Half-Life 1 Sprites geschrieben. Selbige konnte auch Sprites ins Bitmap-Format portieren. War eine verdammte Arbeit. Hat aber hingehaun. Bis ich irgendwann keine Lust mehr hatte.
Die Klasse kannst du dir hier Runterladen:
http://rapidshare.com/files/218688702/Half-Life_Sprite.7zLeider ist diese Version nicht so weit Entwickelt, wie ich sie in Erinnerung hatte.
Und hier die Spezifikationen für das Sprite Format:
http://www.thewall.de/content/allgemeines_gamedesign:artikel:half-life_sprite_spezifikationAlso solltest du etwas mehr oder weniger leichtes vorhaben, kannste ja meine Klasse weiterentwickeln, oder dir ne neue schreiben ...
-
Jetzt muss ich erstmal was finden, um die 7zip-Datei zu entpacken und dann schaue ich mir das noch ein wenig an. Schonmal vielen Dank, ich hoffe, ich steige durch den Quelltext durch ;).
-
Winrar reicht dafür
Der Code sollte einfach gehalten worden sein, und die Headerdatei sollte auch einige Kommentare besitzen.
-
Ich habe hier noch eine neuere Version der Klasse gefunden. Mit implementertem Kon- und Destruktor.
http://rapidshare.com/files/218693297/HL_Sprite.7z
-
Pyro Phoenix schrieb:
Winrar reicht dafür
Ich war leider unter Linux, Winrar stand mir gerade nicht zur Verfügung.
Pyro Phoenix schrieb:
Der Code sollte einfach gehalten worden sein, und die Headerdatei sollte auch einige Kommentare besitzen.
Ich lese mich gerade in den Quelltext ein, leider sind meine C++-Kenntnisse noch um einiges geringer, als meine C-Kenntnisse ;). Da muss ich jetzt so einiges nachschlagen.
Gehe ich richtig in der Annahme, dass "CHL_Sprite::loadSprite" das Objekt der Klasse CHL_Sprite ist, das sich mit dem Laden des Bildes beschäftigt?
Ansonsten tauchen öfter mal ominöse Datentypen auf, die ich gar nicht kenne - "wchar_t" wäre z.B. so einer, aber ich hoffe mal, dass ich mich mit Hilfe von Google und Co. da durcharbeiten kann :).
-
Um in "richtigen Programmen" Bilder zu verarbeiten, verwendet man am besten Bibliotheken, die sich darum kümmern. Z.B. libpng oder libjpeg für bestimmte Dateiformate, oder Bibliotheken wie GD, die gleich alles können.
Das sind alles reine C Bibliotheken.
Wenn du es selber machen willst, könntest du mal das PNM Format (bzw. PPM/PGM/PBM) anschauen, das ist absichtlich sehr einfach aufgebaut, viel einfacher als z.B. BMP.
-
Ja, ich will die Sachen schon selbst erledigen - und sei es nur, um mich etwas mehr mit der Materie vertraut zu machen. Danke für den Tip mit dem Format, ich schlage gleich mal nach.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
hi!
Stiefel2000 schrieb:
Ich wäre nun für Anregungen ganz dankbar, wie ich denn das Bild in einem Array abspeichern kann. Als einfaches Ziel hätte ich mir erstmal die Farbumkehr gedacht, vielleicht auch die Manipulation eines Bildes - ein Muster einzeichnen oder sonstwas.
Falls jemand bereit ist, mir da ein paar Grundlagen zu erklären oder mir zu sagen, wo ich an Informationen komme, wäre ich sehr dankbar.
eine bitmap einzulesen gar nicht so schwer. da ja das bmp format von microsoft kommt, lohnt es sich die strukturtypen BITMAPFILEHEADER und BITMAPINFOHEADER genauer anzuschauen und ggf. nach codeschippseln in dieser richtung zu suchen.
diese beiden strukturen kannst du dir leicht selber schreiben, bestehen aus standard datentypen; hab ich gemacht, weil ich diese bezeichnungen in grosschrift einfach potthässlich findeich habe eine kleine bibliothek für ein paar einfache bitmapmanipulationen geschrieben und mal sehen ob ich morgen dazu komme, poste ich mal ein oder zwei codeschnippsel.
falls du den BITMAPFILEHEADER und BITMAPINFOHEADER selber schreibst und nicht aus den windowsheadern inkludierst, denk daran die strukturen mit der #pragma pack anweisung auf 2 byte grenzen auszurichten, sonst schägt einlesen/speichern fehl.
hab grade mal die sufu gecheckt, hier findest du ein altes codeschnippsel von mir:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-208992-and-highlight-is-bitmapfileheader.html
die funktion 'quick_hack' könnte eine gute starthilfe sein, auch mal nach bitmapformat googeln und so.