256 colours to 16 colours with dithers

Microsoft Windows
Post Reply
User avatar
MigrationUser
Posts: 336
Joined: 2021-Jul-12, 1:37 pm
Contact:

256 colours to 16 colours with dithers

Post by MigrationUser »

20 Aug 2014 21:48
Honguito98

Hi to all

I have a file with an array of 256 colour palette. These values are used to convert an 8-bit bitmap to spr format created by carlos.
But I can't translate it all them!


These values are in RRGGBB notation.
Where:
B0 = ░
B1 = ▒
B2 = ▓
DB = █

I get the RGB colours from Color Hex

*Updated palette array, again*

Code: Select all

;PaletteIndex RRGGBB BgFgColourInHex CharacterInHex
P[00]=000000 00 FF
P[01]=800000 04 DB
P[02]=008000 02 DB
P[03]=808000 06 DB
P[04]=000080 01 DB
P[05]=800080 03 DB
P[06]=008080 07 DB
P[07]=C0C0C0 87 B2
P[08]=C0DCC0 27 B2
P[09]=A6CAF0 F9 B0
P[0A]=402000 40 B2
P[0B]=602000 40 B1
P[0C]=802000 40 B0
P[0D]=A02000 04 DB
P[0E]=C02000 C4 B2
P[0F]=E02000 C4 B1
P[10]=004000 02 B0
P[11]=204000 02 B1
P[12]=404000 06 B0
P[13]=604000 64 B1
P[14]=804000 64 B2
P[15]=A04000 6C B0
P[16]=C04000 6C B1
P[17]=E04000 6C B2
P[18]=006000 02 B3
P[19]=206000 20 B1
P[1A]=406000 62 B0
P[1B]=606000 06 B2
P[1C]=806000 46 B2
P[1D]=A06000 46 B0
P[1E]=C06000 6C B0
P[1F]=E06000 6C B1
P[20]=008000 02 DB
P[21]=208000 02 DB
P[22]=408000 28 B0
P[23]=608000 26 B0
P[24]=808000 06 DB
P[25]=A08000 64 B0
P[26]=C08000 64 B1
P[27]=E08000 CE B1
P[28]=00A000 A8 B2
P[29]=20A000 A8 B2
P[2A]=40A000 A8 B1
P[2B]=60A000 26 B1
P[2C]=80A000 26 B2
P[2D]=A0A000 46 B2
P[2E]=C0A000 46 B1
P[2F]=E0A000 EC B1
P[30]=00C000 A7 B0
P[31]=20C000 A7 B0
P[32]=40C000 A6 B1
P[33]=60C000 A6 B1
P[34]=80C000 A6 B2
P[35]=A0C000 2E B1
P[36]=C0C000 2E B2
P[37]=E0C000 4E B1
P[38]=00E000 A2 B2
P[39]=20E000 A2 B2
P[3A]=40E000 A2 B1
P[3B]=60E000 A2 B1
P[3C]=80E000 A6 B1
P[3D]=A0E000 A6 B2
P[3E]=C0E000 AE B2
P[3F]=E0E000 CA B1
P[40]=000040 01 B0
P[41]=200040 01 B1
P[42]=400040 05 B0
P[43]=600040 05 B1
P[44]=800040 45 B0
P[45]=A00040 45 B1
P[46]=C00040 C1 B1
P[47]=E00040 C1 B0
P[48]=002040 01 B0
P[49]=202040 01 B0
P[4A]=402040 05 B0
P[4B]=602040 05 B1
P[4C]=802040 45 B0
P[4D]=A02040 45 B1
P[4E]=C02040 C1 B1
P[4F]=E02040 C1 B0
P[50]=004040 03 B0
P[51]=204040 03 B0
P[52]=404040 38 B2
P[53]=604040 48 B2
P[54]=804040 C8 B2
P[55]=A04040 C8 B1
P[56]=C04040 C8 B0
P[57]=E04040 C7 B0
P[58]=006040 23 B0
P[59]=206040 23 B0
P[5A]=406040 23 B2
P[5B]=606040 68 B2
P[5C]=806040 48 B2
P[5D]=A06040 47 B1
P[5E]=C06040 C8 B1
P[5F]=E06040 C8 B0
P[60]=008040 21 B0
P[61]=208040 21 B0
P[62]=408040 28 B0
P[63]=608040 28 B1
P[64]=808040 68 B0
P[65]=A08040 64 B0
P[66]=C08040 64 B1
P[67]=E08040 6C B1
P[68]=00A040 2F B0
P[69]=20A040 2F B0
P[6A]=40A040 27 B0
P[6B]=60A040 28 B0
P[6C]=80A040 62 B0
P[6D]=A0A040 E0 B2
P[6E]=C0A040 E4 B1
P[6F]=E0A040 6C B0
P[70]=00C040 A1 B1
P[71]=20C040 1A B1
P[72]=40C040 A8 B1
P[73]=60C040 6A B1
P[74]=80C040 6A B0
P[75]=A0C040 2E B1
P[76]=C0C040 2E B1
P[77]=E0C040 EC B0
P[78]=00E040 A1 B0
P[79]=20E040 1A B2
P[7A]=40E040 A3 B1
P[7B]=60E040 A4 B0
P[7C]=80E040 A4 B1
P[7D]=A0E040 A4 B2
P[7E]=C0E040 6A B0
P[7F]=E0E040 E6 B2
P[80]=000080 04 DB
P[81]=200080 04 DB
P[82]=400080
P[83]=600080
P[84]=800080
P[85]=A00080
P[86]=C00080
P[87]=E00080
P[88]=002080
P[89]=202080
P[8A]=402080
P[8B]=602080
P[8C]=802080
P[8D]=A02080
P[8E]=C02080
P[8F]=E02080
P[90]=004080
P[91]=204080
P[92]=404080
P[93]=604080
P[94]=804080
P[95]=A04080
P[96]=C04080
P[97]=E04080
P[98]=006080
P[99]=206080
P[9A]=406080
P[9B]=606080
P[9C]=806080
P[9D]=A06080
P[9E]=C06080
P[9F]=E06080
P[A0]=008080
P[A1]=208080
P[A2]=408080
P[A3]=608080
P[A4]=808080 07 DB
P[A5]=A08080 07 DB
P[A6]=C08080
P[A7]=E08080
P[A8]=00A080
P[A9]=20A080
P[AA]=40A080
P[AB]=60A080
P[AC]=80A080
P[AD]=A0A080
P[AE]=C0A080
P[AF]=E0A080
P[B0]=00C080
P[B1]=20C080
P[B2]=40C080
P[B3]=60C080
P[B4]=80C080
P[B5]=A0C080
P[B6]=C0C080
P[B7]=E0C080
P[B8]=00E080
P[B9]=20E080
P[BA]=40E080
P[BB]=60E080
P[BC]=80E080
P[BD]=A0E080
P[BE]=C0E080
P[BF]=E0E080
P[C0]=0000C0
P[C1]=2000C0
P[C2]=4000C0
P[C3]=6000C0
P[C4]=8000C0
P[C5]=A000C0
P[C6]=C000C0
P[C7]=E000C0
P[C8]=0020C0
P[C9]=2020C0
P[CA]=4020C0
P[CB]=6020C0
P[CC]=8020C0
P[CD]=A020C0
P[CE]=C020C0
P[CF]=E020C0
P[D0]=0040C0 91 B0
P[D1]=2040C0
P[D2]=4040C0
P[D3]=6040C0
P[D4]=8040C0
P[D5]=A040C0 D1 B2
P[D6]=C040C0 D1 B1
P[D7]=E040C0 D1 B0
P[D8]=0060C0 B1 B2
P[D9]=2060C0 B9 B2
P[DA]=4060C0 89 B1
P[DB]=6060C0 51 B2
P[DC]=8060C0 51 B1
P[DD]=A060C0 51 B0
P[DE]=C060C0 57 B1
P[DF]=E060C0 57 B0
P[E0]=0080C0 9A B0
P[E1]=2080C0 93 B2
P[E2]=4080C0 93 B1
P[E3]=6080C0 92 B0
P[E4]=8080C0 17 B1
P[E5]=A080C0 51 B0
P[E6]=C080C0 58 B1
P[E7]=E080C0 D8 B2
P[E8]=00A0C0 B9 B1
P[E9]=20A0C0 9B B1
P[EA]=40A0C0 37 B1
P[EB]=60A0C0 37 B1
P[EC]=80A0C0 38 B2
P[ED]=A0A0C0 18 B2
P[EE]=C0A0C0 49 B1
P[EF]=E0A0C0 C9 B1
P[F0]=00C0C0 B7 B0
P[F1]=20C0C0 B3 B1
P[F2]=40C0C0 B3 B2
P[F3]=60C0C0 3F B0
P[F4]=80C0C0 37 B0
P[F5]=A0C0C0 38 B2
P[F6]=FFFBF0 FF DB
P[F7]=A0A0A4 87 B1
P[F8]=808080 08 DB
P[F9]=FF0000 0C DB
P[FA]=00FF00 0A DB
P[FB]=FFFF00 0E DB
P[FC]=0000FF 09 DB
P[FD]=FF00FF 0D DB
P[FE]=00FFFF 0B DB
P[FF]=FFFFFF FF DB
At the moment, I show bitmaps with size of 20x25, and monocrome:
Note there are some unused variables and some old code.

Code: Select all

@Echo Off
	SetLocal EnableDelayedExpansion EnableExtensions	
	rem Call :4Bit
	Set /p "File=File: "
	
	For %%F in (!File!) Do (
		Set /a "Size=%%~zF - 1"
		For /L %%# in (1,1,!Size!) Do Set /p =X
	) > "!Tmp!\Tmp.dat" < Nul
	
	:: 424D = BM in Hex
	:: Is = Info Header Size { commonly 40 bytes }
	Set /a "OffSet=0, Cnt=1, Cntp=1"
	Set "ID="

	For /F "Skip=1 Tokens=2 Delims= " %%D in ('Fc /B !File! "!Tmp!\Tmp.dat"') Do (
		For %%c in (!Cnt!) Do (
			%== Concatenates To ID first two values ==%
			If %%c Geq 1 If %%c Leq 2 Set "ID=!ID!%%D"
			If %%c Equ 2 If !ID! Neq 424D Goto :Err
			
			%== Gets Bitmap Info ==%
			If %%c Geq 15 If %%c Leq 18 Set "Is=!Is!%%D"
			If %%c Geq 19 If %%c Leq 22 Set "Width=%%D!Width!"
			If %%c Geq 23 If %%c Leq 26 Set "Height=%%D!Height!"
			If %%c Geq 29 If %%c Leq 30 Set "Bit=%%D!Bit!"
			If %%c Equ 30 If !Bit! Neq 0008 Echo;!Bit!& Goto :E.Bit
			If %%c Geq 31 If %%c Leq 34 Set "Compression=%%D!Compression!"
			If %%c Equ 34 If !Compression! Neq 000000 Goto :E.Comp
			
			%== Calculate the next padding, currently supports images from 1x1 to 99x99 ==%
			If %%c Equ 54 (
				Set /a "PaletteLimit=55 + (256 * 4) - 1, Pc=0, MXc=1, w=0x!Width!"
				Set /a "Map.Y=0x!Height!, Add=0"

				For /L %%P in (0,1,20) Do (
					Set /a "Pad=(0x!Width! + Add) / 4"
					Set /a "Pad_=Pad * 4, W_= W + Add"
					If Not "!Pad_!"=="!W_!" Set /a Add+=1
				)
			)


			%=== Reads Color Table ===%
			If %%c Geq 55 If %%c Leq !PaletteLimit! (

				For %%d in (!Cntp!) Do (
					If %%d Geq 1 If %%d Leq 3 Set "Color=%%D!Color!"
					If %%d Equ 3 (

					
						set /a dec=Pc
						set "hex="
						set "map=0123456789ABCDEF"
						for /L %%N in (1,1,2) do (
							set /a "d=dec&15,dec>>=4"
							for %%D in (!d!) do set "hex=!map:~%%D,1!!hex!"
						)
					
					
					
						Set "P[!Hex!]=!Color!"
						Set /a Pc+=1
					)
					If %%d Equ 4 Set Cntp=0& Set "Color="
					rem If defined cntx if !cntX! Geq !w_! set cntx=0& echo;
				)
				Set /a Cntp+=1

			) Else (

				%== Reads the array pixel using an index from palette ==%

				Set/a AddC+=1
				rem Echo;---- !AddC!
				If !AddC! Leq !W! (
					Set /a MXc+=1
					rem <nul set/p "=%%D "
				
					If %%D Neq FF (
						For %%Y in (!Map.Y!) Do (
							Set "C[%%Y]=!C[%%Y]!°"
						)
					) Else (
						For %%Y in (!Map.Y!) Do (
							Set "C[%%Y]=!C[%%Y]!Û"
						)
					)
					If !Mxc! Gtr !W! (
						Set/a MXc=1,Map.Y-=1
						rem Echo;
					)
				) Else (
					%== If padding is detected, stop writting and skip them ==%
					Set /a ToPad+=1
					If !ToPad! Geq !Add! Set /a ToPad=0, AddC=0
				)
			)
		)
		Set /a Cnt+=1
	)
	
	For /L %%Y in (0,1,0x!Height!) Do Echo;!C[%%Y]!
	set p[>palette.txt

	Set /a X=0x%Width%, Y=0x%Height%
	Echo; W: %Width%    H: %Height%
	Echo; BitMap size in pixels is: %X%.%Y%
	Pause
	exit
	
	:Err
	Echo;This is not a Bmp file^^!
	Pause & Exit
	
	:E.Comp
	Echo;Bmp file must be uncompressed^^!
	pause & Exit
	
	:E.Bit
	Echo;Bmp file must be 8-Bit^^!
	Pause & Exit
Real size:
Image

Zoomed version:
Image

out:

Code: Select all

File: img.bmp

█░██░█
█░██░█
██████
░████░
█░░░░█
 W: 00000006    H: 00000005
 BitMap size in pixels is: 6.5
Presione una tecla para continuar . . .
Any help is grateful! Credits are given.

Update

Note: may be have bugs with some image sizes.

Code: Select all

@Echo Off
	SetLocal EnableDelayedExpansion EnableExtensions

	For /L %%c in (0x00,1,0xFF) Do (
		Set Ct=%%c
		If %%c Equ 0 Set Ct=00
		If Not Exist "!Tmp!\%%c.chr" Call :GenChr !Ct!
		If "!Ct!"=="00" Ren "!Tmp!\00.chr" "0.chr" 2>Nul
	)
	
	SetLocal
	%== Clears unused data ==%

	Set "s=%ComSpec:~0,-7%"
	Set "t=%Tmp%"
	For /F "Tokens=1 Delims==" %%d in ('set') do If %%d neq s If %%d neq t set "%%d="

	%== Load Palette Array and ascii to unicode table converter ==%

	Call :LoadP
	For /F "Tokens=1-2 Delims== " %%X in ('%S%FindStr "^=" "%~0"') Do (
		Set AChr[%%X]=%%Y
	)
	
	Set /p "File=File: "
	
	%== Creates a bin file ==%
	For %%F in (!File!) Do (
		Set /a "Size=%%~zF"
		For /L %%# in (1,1,!Size!) Do (
			rem Set /a "Rnd=!Random! * 255 / 32768"
			rem Type "%T%\!Rnd!.Chr"
			Set /p =L
		)
	) > "Tmp.bin" < Nul
	Echo; Process Started...
	
	:: 424D = BM in Hex
	:: Is = Info Header Size { commonly 40 bytes }
	Set /a "OffSet=0, Cnt=1, Cntp=1"
	Set "ID="

(
	For /F "Skip=1 Tokens=2 Delims= " %%D in ('%S%Fc /B !File! "Tmp.bin"') Do (
		For %%c in (!Cnt!) Do (
			Title %%c

			If %%c Leq 40 (
				%== Concatenates To ID first two values ==%
				If %%c Geq 1 If %%c Leq 2 Set "ID=!ID!%%D"
				If %%c Equ 2 If !ID! Neq 424D Goto :Err
				
				%== Gets Bitmap Info ==%
				If %%c Geq 15 If %%c Leq 18 Set "Is=!Is!%%D"
				If %%c Geq 19 If %%c Leq 22 Set "Width=%%D!Width!"
				If %%c Geq 23 If %%c Leq 26 Set "Height=%%D!Height!"
				If %%c Geq 29 If %%c Leq 30 Set "Bit=%%D!Bit!"
				If %%c Equ 30 If !Bit! Neq 0008 Echo;!Bit!>&2& Goto :E.Bit
				If %%c Geq 31 If %%c Leq 34 Set "Compression=%%D!Compression!"
				If %%c Equ 34 If !Compression! Neq 000000 Goto :E.Comp
				If %%c Geq 35 If %%c Leq 38 Set "SizeOf=%%D!SizeOf!"
				If %%c Equ 38 Echo;Size of  bmp: !SizeOf! >&2
			)
			
			%== Calculate the next padding ==%
			If %%c Equ 54 (
				Set /a "PaletteLimit=54 + (256 * 4), Pc=0, MXc=1, w=0x!Width!"
				Set /a "Map.Y=0x!Height!, Add=0, AddC=0"

				For /L %%P in (0,1,4) Do (
					Set /a "Pad=(0x!Width! + Add) / 4"
					Set /a "Pad_=Pad * 4, W_= W + Add"
					If Not "!Pad_!"=="!W_!" Set /a Add+=1
				)
				Set "W_=" & Set "Pad_=" & Set "Pad="
			)


			%=== Reads Color Table ===%
			If %%c Geq 55 If %%c Leq !PaletteLimit! (

				Rem !Cntp!
				For %%d in (;) Do (
					If %%d Geq 1 If %%d Leq 3 Set "Color=%%D!Color!"
					If %%d Equ 3 (
						set /a dec=Pc
						set "hex="
						set "map=0123456789ABCDEF"
						for /L %%N in (1,1,2) do (
							set /a "d=dec&15,dec>>=4"
							for %%D in (!d!) do set "hex=!map:~%%D,1!!hex!"
						)
						Set "P[!Hex!]=!Color!"
						Set /a Pc+=1
					)
					If %%d Equ 4 Set Cntp=0& Set "Color="
				)
				Set /a Cntp+=1

			) Else (

				%== Reads the array pixel using an index from palette ==%

				If !Add! Neq 0 Set/a AddC+=1

				If !AddC! Leq !W! (
					Set /a MXc+=1
					Set/a Dec=Map.Y
					set "hex="
					set "map=0123456789ABCDEF"
					for /L %%N in (1,1,2) do (
						set /a "d=dec&15,dec>>=4"
						for %%D in (!d!) do set "hex=!map:~%%D,1!!hex!"
					)
					For %%Y in (!Hex!) Do (
						Set "C[%%Y]=!C[%%Y]!!P[%%D]! "
					)

					If !Mxc! Gtr !W! (
						Set/a MXc=1,Map.Y-=1
						For %%H in (!Hex!) Do Echo;%%H:!C[%%H]!
						rem Echo;!Hex! >&2
						rem Set "C[!Hex!]="
					)
				) Else (
					%== If padding is detected, stop writting and skip them ==%
					Set /a ToPad+=1
					If !ToPad! Geq !Add! Set /a ToPad=0, AddC=0
				)
			)
		)
		Set /a Cnt+=1
	)
)> Tmp.dat
set >temp.txt
	:: Enables transparency using black colour with FF char.
	Set AChr[FF]=0000
	(
	Set /a "X=0x%Width%, Y=0x%Height%"
	For %%T in (X;Y) Do (
		Type "%T%\!%%T!.Chr"
		Type "%T%\0.Chr"
	)	
	For /F "Tokens=2 Delims=:" %%A in ('%S%Sort Tmp.dat') Do (
		For %%D in (%%A) Do (
			For /F "Tokens=1-2 Delims=. " %%X in ("%%D") Do (
				Rem BgFG.Chr
				Set /a "Uc1=0x!AChr[%%Y]:~0,2!, Uc2=0x!AChr[%%Y]:~2,2!, Cl=0x%%X"
				Type "%T%\!Uc2!.Chr" "%T%\!Uc1!.Chr" "%T%\!Cl!.Chr" "%T%\0.Chr"
				
			)
		)
	)
	) > Sprite.spr 2>Nul
	
	
	
	rem For /L %%Y in (0,1,0x!Height!) Do Echo;!C[%%Y]!
	set p[>palette.txt

	Set /a X=0x%Width%, Y=0x%Height%
	Echo; W: %Width%    H: %Height%
	Echo; BitMap size in pixels is: %X%.%Y%
	Pause
	set
	pause
	exit
	
	:Err
	Echo;This is not a Bmp file^^!
	Pause & Exit /b 1
	
	:E.Comp
	Echo;Bmp file must be uncompressed^^!
	pause &Exit /b 2
	
	:E.Bit
	Echo;Bmp file must be 8-Bit^^!
	Pause & Exit /b 3
	
	:LoadP
	For /F "Tokens=1,3,4 Delims== " %%A in (palette.txt) Do Set "%%A=%%B.%%C"
	Goto :Eof
	
	:Genchr
	REM This code creates one single byte file. Parameter: <int>0-255
	REM Teamwork of carlos, penpen, aGerman, dbenham
	REM Tested under Win2000, XP, Win7, Win8
	Pushd !Cd!
	Cd !Tmp!
	set "options=/d compress=off /d reserveperdatablocksize=26"
	If %~1 neq 26  (
		type nul >t.tmp
		makecab %options% /d reserveperfoldersize=%~1 t.tmp %~1.chr >nul
		type %~1.chr | (
			(for /l %%N in (1 1 38) do pause)>nul&findstr "^">t.tmp
		)
		>nul copy /y t.tmp /a %~1.chr /b
		del t.tmp
	) else (
		copy /y nul + nul /a 26.chr /a >nul
	)
	Popd
	goto :eof

;Unicode To Ms-Dos Ascii By Honguito98 - Tiny version
;Ascii HEX Unicode HEX
=00 0000 : null
=B0 2591 : light shade
=B1 2592 : medium shade
=B2 2593 : dark shade
=DB 2588 : full block
=FF 00A0 : no-break space
Palette.txt

Code: Select all

P[00]=000000 00 FF
P[01]=800000 04 DB
P[02]=008000 02 DB
P[03]=808000 06 DB
P[04]=000080 01 DB
P[05]=800080 03 DB
P[06]=008080 07 DB
P[07]=C0C0C0 87 B2
P[08]=C0DCC0 27 B2
P[09]=A6CAF0 F9 B0
P[0A]=402000 40 B2
P[0B]=602000 40 B1
P[0C]=802000 40 B0
P[0D]=A02000 04 DB
P[0E]=C02000 C4 B2
P[0F]=E02000 C4 B1
P[10]=004000 02 B0
P[11]=204000 02 B1
P[12]=404000 06 B0
P[13]=604000 64 B1
P[14]=804000 64 B2
P[15]=A04000 6C B0
P[16]=C04000 6C B1
P[17]=E04000 6C B2
P[18]=006000 02 B3
P[19]=206000 20 B1
P[1A]=406000 62 B0
P[1B]=606000 06 B2
P[1C]=806000 46 B2
P[1D]=A06000 64 B1
P[1E]=C06000 6C B0
P[1F]=E06000 6C B1
P[20]=008000 02 DB
P[21]=208000 02 DB
P[22]=408000 28 B0
P[23]=608000 26 B0
P[24]=808000 06 DB
P[25]=A08000 64 B0
P[26]=C08000 64 B1
P[27]=E08000 CE B1
P[28]=00A000 A8 B2
P[29]=20A000 A8 B2
P[2A]=40A000 A8 B1
P[2B]=60A000 26 B1
P[2C]=80A000 26 B2
P[2D]=A0A000 46 B2
P[2E]=C0A000 46 B1
P[2F]=E0A000 EC B1
P[30]=00C000 A7 B0
P[31]=20C000 A7 B0
P[32]=40C000 A6 B1
P[33]=60C000 A6 B1
P[34]=80C000 A6 B2
P[35]=A0C000 2E B1
P[36]=C0C000 2E B2
P[37]=E0C000 4E B1
P[38]=00E000 A2 B2
P[39]=20E000 A2 B2
P[3A]=40E000 A2 B1
P[3B]=60E000 A2 B1
P[3C]=80E000 A6 B1
P[3D]=A0E000 A6 B2
P[3E]=C0E000 AE B2
P[3F]=E0E000 CA B1
P[40]=000040 01 B0
P[41]=200040 01 B1
P[42]=400040 05 B0
P[43]=600040 05 B1
P[44]=800040 45 B0
P[45]=A00040 45 B1
P[46]=C00040 C1 B1
P[47]=E00040 C1 B0
P[48]=002040 01 B0
P[49]=202040 01 B0
P[4A]=402040 05 B0
P[4B]=602040 05 B1
P[4C]=802040 45 B0
P[4D]=A02040 45 B1
P[4E]=C02040 C1 B1
P[4F]=E02040 C1 B0
P[50]=004040 03 B0
P[51]=204040 03 B0
P[52]=404040 38 B2
P[53]=604040 48 B2
P[54]=804040 C8 B2
P[55]=A04040 C8 B1
P[56]=C04040 C8 B0
P[57]=E04040 C7 B0
P[58]=006040 23 B0
P[59]=206040 23 B0
P[5A]=406040 23 B2
P[5B]=606040 68 B2
P[5C]=806040 48 B2
P[5D]=A06040 47 B1
P[5E]=C06040 C8 B1
P[5F]=E06040 C8 B0
P[60]=008040 21 B0
P[61]=208040 21 B0
P[62]=408040 28 B0
P[63]=608040 28 B1
P[64]=808040 68 B0
P[65]=A08040 64 B0
P[66]=C08040 64 B1
P[67]=E08040 6C B1
P[68]=00A040 2F B0
P[69]=20A040 2F B0
P[6A]=40A040 27 B0
P[6B]=60A040 28 B0
P[6C]=80A040 62 B0
P[6D]=A0A040 E0 B2
P[6E]=C0A040 E4 B1
P[6F]=E0A040 6C B0
P[70]=00C040 A1 B1
P[71]=20C040 1A B1
P[72]=40C040 A8 B1
P[73]=60C040 6A B1
P[74]=80C040 6A B0
P[75]=A0C040 2E B1
P[76]=C0C040 2E B1
P[77]=E0C040 EC B0
P[78]=00E040 A1 B0
P[79]=20E040 1A B2
P[7A]=40E040 A3 B1
P[7B]=60E040 A4 B0
P[7C]=80E040 A4 B1
P[7D]=A0E040 A4 B2
P[7E]=C0E040 6A B0
P[7F]=E0E040 E6 B2
P[80]=000080 04 DB
P[81]=200080 04 DB
P[82]=400080 14 B0
P[83]=600080 14 B1
P[84]=800080 14 B2
P[85]=A00080 14 B2
P[86]=C00080 C5 B2
P[87]=E00080 C5 B1
P[88]=002080 01 B2
P[89]=202080 10 B0
P[8A]=402080 15 B0
P[8B]=602080 15 B2
P[8C]=802080 14 B1
P[8D]=A02080 94 B2
P[8E]=C02080 9C B1
P[8F]=E02080 9C B2
P[90]=004080 13 B0
P[91]=204080 13 B0
P[92]=404080 18 B1
P[93]=604080 51 B1
P[94]=804080 58 B1
P[95]=A04080 58 B0
P[96]=C04080 C9 B1
P[97]=E04080 C9 B0
P[98]=006080 31 B0
P[99]=206080 13 B2
P[9A]=406080 30 B0
P[9B]=606080 18 B2
P[9C]=806080 58 B2
P[9D]=A06080 48 B2
P[9E]=C06080 C8 B2
P[9F]=E06080 C8 B1
P[A0]=008080 03 DB
P[A1]=208080 03 DB
P[A2]=408080 43 B2
P[A3]=608080 83 B0
P[A4]=808080 07 DB
P[A5]=A08080 07 DB
P[A6]=C08080 C8 B2
P[A7]=E08080 C8 B2
P[A8]=00A080 23 B2
P[A9]=20A080 32 B0
P[AA]=40A080 23 B1
P[AB]=60A080 23 B0
P[AC]=80A080 28 B1
P[AD]=A0A080 68 B1
P[AE]=C0A080 48 B1
P[AF]=E0A080 E5 B1
P[B0]=00C080 A1 B1
P[B1]=20C080 1A B1
P[B2]=40C080 A1 B1
P[B3]=60C080 27 B1
P[B4]=80C080 27 B1
P[B5]=A0C080 67 B1
P[B6]=C0C080 E8 B2
P[B7]=E0C080 E7 B1
P[B8]=00E080 A9 B0
P[B9]=20E080 9A B2
P[BA]=40E080 A1 B0
P[BB]=60E080 A3 B2
P[BC]=80E080 A7 B1
P[BD]=A0E080 A7 B2
P[BE]=C0E080 E7 B1
P[BF]=E0E080 E7 B2
P[C0]=0000C0 19 B0
P[C1]=2000C0 19 B1
P[C2]=4000C0 59 B2
P[C3]=6000C0 59 B1
P[C4]=8000C0 59 B0
P[C5]=A000C0 C9 B2
P[C6]=C000C0 C9 B1
P[C7]=E000C0 C9 B0
P[C8]=0020C0 96 B0
P[C9]=2020C0 97 B0
P[CA]=4020C0 71 B2
P[CB]=6020C0 51 B2
P[CC]=8020C0 D1 B2
P[CD]=A020C0 D1 B2
P[CE]=C020C0 D1 B1
P[CF]=E020C0 D8 B1
P[D0]=0040C0 91 B0
P[D1]=2040C0 98 B1
P[D2]=4040C0 79 B1
P[D3]=6040C0 D9 B2
P[D4]=8040C0 D1 B2
P[D5]=A040C0 D1 B2
P[D6]=C040C0 D1 B1
P[D7]=E040C0 D1 B0
P[D8]=0060C0 B1 B2
P[D9]=2060C0 B9 B2
P[DA]=4060C0 89 B1
P[DB]=6060C0 51 B2
P[DC]=8060C0 51 B1
P[DD]=A060C0 51 B0
P[DE]=C060C0 57 B1
P[DF]=E060C0 57 B0
P[E0]=0080C0 9A B0
P[E1]=2080C0 93 B2
P[E2]=4080C0 93 B1
P[E3]=6080C0 92 B0
P[E4]=8080C0 17 B1
P[E5]=A080C0 51 B0
P[E6]=C080C0 58 B1
P[E7]=E080C0 D8 B2
P[E8]=00A0C0 B9 B1
P[E9]=20A0C0 9B B1
P[EA]=40A0C0 37 B1
P[EB]=60A0C0 37 B1
P[EC]=80A0C0 38 B2
P[ED]=A0A0C0 18 B2
P[EE]=C0A0C0 49 B1
P[EF]=E0A0C0 C9 B1
P[F0]=00C0C0 B7 B0
P[F1]=20C0C0 B3 B1
P[F2]=40C0C0 B3 B2
P[F3]=60C0C0 3F B0
P[F4]=80C0C0 37 B0
P[F5]=A0C0C0 38 B2
P[F6]=FFFBF0 FF DB
P[F7]=A0A0A4 87 B1
P[F8]=808080 08 DB
P[F9]=FF0000 0C DB
P[FA]=00FF00 0A DB
P[FB]=FFFF00 0E DB
P[FC]=0000FF 09 DB
P[FD]=FF00FF 0D DB
P[FE]=00FFFF 0B DB
P[FF]=FFFFFF FF DB

Results:

Real size: 80x50
Image

Real size: 41x58
Image

Real size: 25x25

Code: Select all

https://i1060.photobucket.com/albums/t452/honguito98/Example_3.png
Last edited by Honguito98 (24 Aug 2014 14:24)

.::{Honguito98}::.

----------------------------

#2 24 Aug 2014 14:25
Honguito98

Post updated.
Added some images and finished code.

.::{Honguito98}::.

----------------------------
#3 31 Aug 2014 18:22
einstein1969

Hi Honguito98!

Very nice work! Sounds interesting...

How did you associate the index of the color palette to RGB?

einstein1969

----------------------------

#4 01 Sep 2014 00:36
Honguito98

Hi einstein1969!

RGB palette I get from a bitmap saved with Ms Paint (color palette is local), @ offset 0x55 of file.
Palette array size is 1024 bytes for 8-bit bitmaps.

Each four bytes sets the BGRN color (where 'N' is a NUL byte).

Code: Select all

[File Header - Size: 14 Bytes]
BM < --Id
...
[Image Header - Size: 40 Bytes]
...
if image is 8-bit or 4-bit [Color palette - Size: 4*256 = 1024 Bytes for 8-Bit or 4*16 = 64 Bytes]
B
G
R
N
B
G
R
N
...
if image is 8-bit or 4-bit [Number of index palette] else [BGRN BGRN...]
Get and dump color palette of BitMap file:

Code: Select all

@echo off
	SetLocal EnabledelayedExpansion
	Set /p "File=File: "
	
	For %%F in (!File!) Do (
		Set /a "Size=%%~zF"
		Set "Name=%%~nF"
		For /L %%# in (1,1,!Size!) Do (
			Set /p =L
		)
	) > "Tmp.bin" < Nul
	(
	For /F "Skip=1 Tokens=2 Delims= " %%D in ('Fc /B !File! "Tmp.bin"') Do Echo;%%D
	) > Data.bin
	Del Tmp.bin 2>nul
	
	< Data.bin (
		Echo; RGB Palette Of: !Name!.bmp
		For /L %%# in  (1,1,54) Do set /p null=
		Set Cnt=0
		For /L %%# in (1,1,1024) Do (
			Set /a Cnt+=1
			Set /p data_=
			If !Cnt! Leq 3 Set Data=!Data_!!Data!
			If !Cnt! Geq 4 (
				Echo;!Data!
				Set Cnt=0
				Set "Data="
			)
		)
	) > !Name!_ColorPalette.txt
	Pause
So there is a inconvenient, the 256 color palette is variable, on any tool convertion eg.: convert a 24-Bit png to 8-Bit Bitmap with adaptive palette.

The solution is truncate to default palette, with aproximated colours:

Code: Select all

0xRRBBGG

BitMap         Color Palette
0xFFFFFC  =  0xFFFFFF
Colour from Bitmap is truncated to another from color palette.
Also this may be useful to convert any 24-bit bmp file to 8-bit file then convert to spr format.

.::{Honguito98}::.
Post Reply