/ Forside/ Teknologi / Udvikling / C/C++ / Spørgsmål
Login
Glemt dit kodeord?
Brugernavn 

Kodeord  


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
oprette bitmap fra char array...
Fra : DaVinci
Vist : 3207 gange
200 point
Dato : 21-11-04 00:45

Jeg har 128 char arrays som representere en ascii tabel. Det jeg skal have lavet, er at indlæse disse arrays og lave en BMP fil med alle de tegn i..

Arrayet som lave det store A, ser sådan ud:
const unsigned char uc2_0041[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x0c,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x3f,0x00,0x21,0x00,0x40,0x80,0xe1,0xc0,0x00,0x00,0x00,0x00}

Formatet som A'et er gemt i er sådan: http://c.1asphost.com/pixeltek/assets/images/afont.gif

Kunne virkeligt godt bruge lidt hjælp, med at få diss data lavet om til en MBP fil.


 
 
Accepteret svar
Fra : BertelBrander

Modtaget 200 point
Dato : 21-11-04 02:25

Jeg er lidt usikker på om du vil have alle karakterer i én BMP-fil eller du vil have en for hver tegn.
Hvad mener du med at du skal "indlæse disse arrays" ?

Følgende laver dit A-array om til en BMP-fil, med 24 bit per pixel, formatet kan godt ændres:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

const unsigned char uc2_0041[] =
{
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x1c,0x00,
0x0c,0x00,
0x12,0x00,
0x12,0x00,
0x12,0x00,
0x3f,0x00,
0x21,0x00,
0x40,0x80,
0xe1,0xc0,
0x00,0x00,
0x00,0x00
};

void WriteHeader(FILE *f, int Width, int Height)
{
BITMAPFILEHEADER BitmapFileHeader;
BITMAPINFOHEADER BitmapInfoHeader;
unsigned int BytesPerLine = (3*Width + 3) & ~0x03;

BitmapFileHeader.bfType = (('M' << 8) | 'B');
BitmapFileHeader.bfSize = sizeof(BitmapFileHeader) + sizeof(BitmapInfoHeader) + BytesPerLine*Height;
BitmapFileHeader.bfReserved1 = 0;
BitmapFileHeader.bfReserved2 = 0;
BitmapFileHeader.bfOffBits = 0x36;

BitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
BitmapInfoHeader.biWidth = Width;
BitmapInfoHeader.biHeight = Height;
BitmapInfoHeader.biPlanes = 1;
BitmapInfoHeader.biBitCount = 24;
BitmapInfoHeader.biCompression = BI_RGB;
BitmapInfoHeader.biSizeImage = 0;
BitmapInfoHeader.biXPelsPerMeter = 0;
BitmapInfoHeader.biYPelsPerMeter = 0;
BitmapInfoHeader.biClrUsed = 0;
BitmapInfoHeader.biClrImportant = 0;
fwrite(&BitmapFileHeader, sizeof(BitmapFileHeader), 1, f);
fwrite(&BitmapInfoHeader, sizeof(BitmapInfoHeader), 1, f);
};

int main()
{
FILE *f = fopen("test.bmp", "wt");
int i, j;
char Color[3] = {0x00, 0x00, 0x00};
char Back[3] = {0xFF, 0xFF, 0xFF};
if(!f)
{
fprintf(stderr, "Failed to create test.bmp");
return EXIT_FAILURE;
}
WriteHeader(f, 12, 12);
for(i = sizeof(uc2_0041) - 1; i >= 0; i -= 2)
{
for(j = 0; j < 8; j++)
{
if(uc2_0041[i - 1] & (0x80 >> j))
fwrite(Color, 3, 1, f);
else
fwrite(Back, 3, 1, f);
}
for(j = 0; j < 4; j++)
{
if(uc2_0041[i] & (0x80 >> j))
fwrite(Color, 3, 1, f);
else
fwrite(Back, 3, 1, f);
}
}
fclose(f);
}

Kommentar
Fra : BertelBrander


Dato : 21-11-04 03:12

Jeg lavede lige en monochrom udgave. En af de to er vist spejlvendt, fortæl lige hvilken.

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

const unsigned char uc2_0041[] =
{
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x00,0x00,
0x1c,0x00,
0x0c,0x00,
0x12,0x00,
0x12,0x00,
0x12,0x00,
0x3f,0x00,
0x21,0x00,
0x40,0x80,
0xe1,0xc0,
0x00,0x00,
0x00,0x00
};

void WriteHeader(FILE *f, int Width, int Height)
{
BITMAPFILEHEADER BitmapFileHeader;
BITMAPINFOHEADER BitmapInfoHeader;
unsigned int WordsPerLine = (Width + 31)/32;
BitmapFileHeader.bfType = (('M' << 8) | 'B');
BitmapFileHeader.bfSize = sizeof(BitmapFileHeader) + sizeof(BitmapInfoHeader) + 4*WordsPerLine*Height;
BitmapFileHeader.bfReserved1 = 0;
BitmapFileHeader.bfReserved2 = 0;
BitmapFileHeader.bfOffBits = 0x36 + 8;

BitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
BitmapInfoHeader.biWidth = Width;
BitmapInfoHeader.biHeight = Height;
BitmapInfoHeader.biPlanes = 1;
BitmapInfoHeader.biBitCount = 1;
BitmapInfoHeader.biCompression = BI_RGB;
BitmapInfoHeader.biSizeImage = 0;
BitmapInfoHeader.biXPelsPerMeter = 0;
BitmapInfoHeader.biYPelsPerMeter = 0;
BitmapInfoHeader.biClrUsed = 0;
BitmapInfoHeader.biClrImportant = 0;
fwrite(&BitmapFileHeader, sizeof(BitmapFileHeader), 1, f);
fwrite(&BitmapInfoHeader, sizeof(BitmapInfoHeader), 1, f);
};

int main()
{
FILE *f = fopen("test.bmp", "wt");
int i, j;
char Color[4] = {0x00, 0x00, 0x00};
char Back[4] = {0xFF, 0xFF, 0xFF};
char Fill = 0;
if(!f)
{
fprintf(stderr, "Failed to create test.bmp");
return EXIT_FAILURE;
}
WriteHeader(f, 12, 12);
fwrite(Back, 4, 1, f);
fwrite(Color, 4, 1, f);
for(i = sizeof(uc2_0041) - 2; i >= 0; i -= 2)
{
fwrite(&uc2_0041[i], 2, 1, f);
fwrite(&Fill, 1, 1, f);
fwrite(&Fill, 1, 1, f);
}
fclose(f);
}

Kommentar
Fra : DaVinci


Dato : 21-11-04 13:46

Rigtige godt svar, mange tak..

Det er meningen at alle 128 ascii tegn skal smides i en lang bmp fil, side om side. (Så det bliver en rigtig lang og tynd fil)

Man skal også kunne bestemme højde og bredde på hver enkle billed, så selvom arrayet ligger an til en 16x16 pixel bmp, skal man altså skære noget væk, alt efter hvar brugeren har sat som HxB.

Programmet laves i MFC, hbor bruger angiver en fil der indeholder alle disse arrays, og filnavn på bmp filen, samt HxB..

Du har allerede vundes mine point, men en smule ekstra hjælp ville være fantastisk. Da det er fonts vi har med at gøre er monochrom helt ok.

Kommentar
Fra : DaVinci


Dato : 21-11-04 13:50

Jeg har tidligere lavet disse filer i hånden, og her kan du se et eksemple på en som er 5x7 pixel...

http://davinci.hjem.wanadoo.dk/5x7_eksemple.bmp

Kommentar
Fra : BertelBrander


Dato : 21-11-04 16:04

Jeg kan godt kikke på en løsning, men det bliver først i aften.
Jeg kunne godt bruge lidt flere test data, et par bogstaver mere og nogle i en anden størrelse.
Det eksempel du har ovenfor, er det 16*16 eller 16*12 ?

Kommentar
Fra : BertelBrander


Dato : 21-11-04 20:30

Jeg lavede en ny udgave der læser en dat fil (første argument til programmet) der ser ca. sådan ud:
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x0c,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x3f,0x00,0x21,0x00,0x40,0x80,0xe1,0xc0,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x0c,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x3f,0x00,0x21,0x00,0x40,0x80,0xe1,0xc0,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x0c,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x3f,0x00,0x21,0x00,0x40,0x80,0xe1,0xc0,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x0c,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x3f,0x00,0x21,0x00,0x40,0x80,0xe1,0xc0,0x00,0x00,0x00,0x00

Dvs et tegn pr linie.

Det laver én bmp (monochrom) med alle tegn. Du skal selv rette højde og bredde (const int Width = 12, Height = 16;), man kunne godt læse dette fra filen eller angive det på kommando-linien.

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

void WriteHeader(FILE *aFile, int aWidth, int aHeight)
{
BITMAPFILEHEADER BitmapFileHeader;
BITMAPINFOHEADER BitmapInfoHeader;
unsigned int WordsPerLine = (aWidth + 31)/32;
BitmapFileHeader.bfType = (('M' << 8) | 'B');
BitmapFileHeader.bfSize = sizeof(BitmapFileHeader) + sizeof(BitmapInfoHeader) + 4*WordsPerLine*aHeight;
BitmapFileHeader.bfReserved1 = 0;
BitmapFileHeader.bfReserved2 = 0;
BitmapFileHeader.bfOffBits = 0x36 + 8;

BitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
BitmapInfoHeader.biWidth = aWidth;
BitmapInfoHeader.biHeight = aHeight;
BitmapInfoHeader.biPlanes = 1;
BitmapInfoHeader.biBitCount = 1;
BitmapInfoHeader.biCompression = BI_RGB;
BitmapInfoHeader.biSizeImage = 0;
BitmapInfoHeader.biXPelsPerMeter = 0;
BitmapInfoHeader.biYPelsPerMeter = 0;
BitmapInfoHeader.biClrUsed = 0;
BitmapInfoHeader.biClrImportant = 0;
fwrite(&BitmapFileHeader, sizeof(BitmapFileHeader), 1, aFile);
fwrite(&BitmapInfoHeader, sizeof(BitmapInfoHeader), 1, aFile);
};

class BitWriter
{
public:
BitWriter(FILE *aFile) : File(aFile)
{
Current = 0;
BitCouter = 0;
ByteCounter = 0;
}
void Write(const unsigned char *aSrc, unsigned int aNumBit)
{
unsigned int counter;
for(counter = 0; counter < aNumBit; counter++)
{
if(aSrc[counter/8] & (0x80 >> (counter%8)))
Current |= 0x80U >> BitCouter;
if(++BitCouter == 8)
{
fwrite(&Current, 1, 1, File);
Current = 0;
BitCouter = 0;
ByteCounter++;
}
}
}
~BitWriter()
{
unsigned char Fill = 0;
if(BitCouter)
{
fwrite(&Current, 1, 1, File);
ByteCounter++;
}
for(; ByteCounter % 4; ByteCounter++)
fwrite(&Fill, 1, 1, File);

}
private:
unsigned char Current;
unsigned int BitCouter;
unsigned int ByteCounter;
FILE *File;
};

const int Width = 12, Height = 16;
unsigned char Data[128][32];

int main(int argc, char *argv[])
{
FILE *f;
int i, NumLetter, j, BytePrLine;
char Color[4] = {0x00, 0x00, 0x00};
char Back[4] = {0xFF, 0xFF, 0xFF};
char Line[1024];
if(argc != 3)
{
printf("Usage: %s data-file bmp-file\n", argv[0]);
return EXIT_FAILURE;
}

// Read the data file
f = fopen(argv[1], "rt");
if(!f)
{
printf("Failed to open: %s\n", argv[1]);
return EXIT_FAILURE;
}

for(NumLetter = 0; NumLetter < 128 && fgets(Line, sizeof(Line), f); NumLetter++)
{
char *s = strtok(Line, "\n, ");
for(i = 0; i < 32 && s; i++)
{
Data[NumLetter][i] = (unsigned char )strtol(s, 0, 0);
s = strtok(0, "\n, ");
}
}
fclose(f);

// Write output
f = fopen(argv[2], "wt");
if(!f)
{
fprintf(stderr, "Failed to create %s\n", argv[2]);
return EXIT_FAILURE;
}
WriteHeader(f, Width*NumLetter, Height);
fwrite(Back, 4, 1, f);
fwrite(Color, 4, 1, f);

BytePrLine = (Width + 7)/8;
for(i = Height - 1; i >= 0; i--)
{
BitWriter Writer(f);
for(j = 0; j < NumLetter; j++)
{
Writer.Write(&Data[j][i*BytePrLine], Width);
}
}
fclose(f);
return EXIT_SUCCESS;
}

Kommentar
Fra : DaVinci


Dato : 22-11-04 04:09

Her kan du se dit program complileret og en input fil, samt det output bmp den lavede. input filen er 16x16 ariel fonten fra windows..

http://davinci.hjem.wanadoo.dk/fontprog/

Hvis det var muligt at lave dette kode til en selvstendigt klasse, hvor man kunne lave følgene f.eks.

BmpClass bmp;
bmp.WriteFile(Filename,Height,Width);

Programmet skal nemlig laves i MFC, hvor man kan vælge fil som input og output samt højde og bredde.

eg har ikke kontrol over det format som dat filen kommer i, da det er i en anden afd. fonten bliver lavet, de aflevere så bare en fil til mig med bitmønstret i, som ser sådanne ud http://davinci.hjem.wanadoo.dk/fontprog/fonttest2.txt hvis du ikke gider rode med det mere, forstår jeg det godt, men hvis du gerne vil, kunne jeg da godt tænke mig at snakke over msn en aften om det. min msn er davinci@wanadoo.dk

Kommentar
Fra : BertelBrander


Dato : 22-11-04 20:11

Jeg kan godt lave det til en class. Vil du inkludere .txt filen i programmet eller læse den fra programmet?
Jeg har valgt ikke at have MSN. Du kan evt sende mig en email på bertel at post4 dot tele dot dk

Godkendelse af svar
Fra : DaVinci


Dato : 25-11-04 13:24

Tak for svaret BertelBrander.

Måske nok den mest hjælpsomme person jeg har mødt herinde..               

Kommentar
Fra : BertelBrander


Dato : 25-11-04 20:13

Jeg siger tak for point, endelig kommer jeg på top 10 i en kategori her på kandu.

Du har følgende muligheder
Eftersom du ikke er logget ind i systemet, kan du ikke skrive et indlæg til dette spørgsmål.

Hvis du ikke allerede er registreret, kan du gratis blive medlem, ved at trykke på "Bliv medlem" ude i menuen.
Søg
Reklame
Statistik
Spørgsmål : 173361
Tips : 31646
Nyheder : 719565
Indlæg : 6381669
Brugere : 218245

Månedens bedste
Årets bedste
Sidste års bedste