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 😉


Anmelden zum Antworten