24bit BMP -> 16bit RAW
-
Hallo,
wie kann ich denn eine BMP-Datei (oder andere Datei, lassen sich ja schließlich umwandeln) in eine RAW-Datei mit 16 bit Farbtiefe konvertieren. GIMP und IrfanView konvertieren ausschließlich in 24bit Farbtiefe ins RAW-Format. Kennt ihr zufällig ein Programm, das das kann, oder gibts ne andere Vorgehensweise?
Geünschtes Zielformat:
Bit15{ [1bit Alpha(=0)] [5bit Rot] [5bit Grün] [5bit Blau] }Bit0
Danke für Tipps, zur Not muss ich mir wohl selbst ein Konvertierungsprogramm schreiben
-
Programm weiß ich jetzt keins, aber von 24BPP Raw zum 1555 sind ja wohl mal fix als C Programm gemacht.
-
joah, du hast ja eigentlich recht, aber faul ist der Mensch

naja dann werd ich mich mal dran setzen, sollte dennoch jmd von euch noch ein anderes Programm wissen, könnt ihrs ruhig noch reinschreiben
-
PaintShop Pro konnte zumindest mal auf 16 Bit dithern. Ob er 16 Bit speichern konnte weiss ich nicht, aber wenn dann ziemlich sicher nicht ohne BMP Header.
-
Habs jetzt selber geschrieben, scheint zu funktionieren.
Vielleicht interessierts ja den ein oder anderen

#include <stdio.h> #include <stdlib.h> #define R 0 // Red #define G 1 // Green #define B 2 // Blue typedef unsigned char UINT8; typedef unsigned short int UINT16; int main(int argc, char **argv) { FILE *input, *output; UINT8 rgb24[3]; int byte; UINT16 rgb16; if(argc != 3) { printf("\nWrong number of parameters! Two parameters needed!"); exit(0); } if((input = fopen(argv[1], "rb")) == NULL) { printf("\nInput file '%s' cannot be opened!\n", argv[1]); exit(EXIT_FAILURE); } if((output = fopen(argv[2], "w+b")) == NULL) { printf("\nError with output file '%s'!\n", argv[2]); exit(EXIT_FAILURE); } printf("\nConverts input raw graphics file from 24bit color depth"); printf("\nto output file with 16bit color depth."); while((byte = fgetc(input)) != EOF) { rgb24[R] = (UINT8) byte; if((byte = fgetc(input)) == EOF) { printf("\nWrong number of bytes in input file!"); exit(EXIT_FAILURE); } rgb24[G] = (UINT8) byte; if((byte = fgetc(input)) == EOF) { printf("\nWrong number of bytes in input file!"); exit(EXIT_FAILURE); } rgb24[B] = (UINT8) byte; rgb24[R] = (rgb24[R] & 0xF8) >> 3; rgb24[G] = (rgb24[G] & 0xF8) >> 3; rgb24[B] = (rgb24[B] & 0xF8) >> 3; rgb16 = ((UINT16) rgb24[R] << 10) | ((UINT16) rgb24[G] << 5) | ((UINT16) rgb24[B]); fputc(((rgb16 & 0xFF00) >> 8), output); fputc((rgb16 & 0x00FF), output); } printf("\n\nFinished successful!"); fclose(input); fclose(output); return 0; }
-
einige anmerkungen:
der vorherige inhalt der unteren drei bit ist von geringer relevanz nachdem du sie weggeshiftet hast.
das alpha-bit kann per default als gesetzt angenommen werden.
falls du kein alpha hast, waere ggf das 565-format vorzuziehen.
du moechtest dir eventuell auch gedanken um dithering machen.
-
stimmt, das bitlöschen ist unnötig
aber der rest passt für meine spezielle anwendung, keine sorge
