|
| oprette bitmap fra char array... Fra : DaVinci | Vist : 3408 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);
}
| |
|
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 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 ?
| |
|
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
| |
|
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..
| |
|
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.
| |
|
|