#c #for-loop #image-processing #hex #fwrite
#c #цикл for #обработка изображений #шестнадцатеричное #fwrite
Вопрос:
Я пытаюсь создать изображение .pam с помощью некоторого c-кода, но функция fwrite записывает в файл только аналог ASCII, а не шестнадцатеричные значения.
Заголовок файла должен быть ASCII, а фактические данные изображения должны быть просто шестнадцатеричными значениями для rgb и alpha.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
FILE *out;
out = fopen("C:/Users/entin/Desktop/write.pam", "wb ");
if (out == NULL) {
printf("Unable to access file.n");
} else {
//everything concerning the head
//buffer the head to not get an overflow
unsigned char headbuf[100];
sprintf(headbuf, "P7nWIDTH 255nHEIGHT 255nDEPTH 4nMAXVAL 255nTUPLTYPE RGB_ALPHAnENDHDRn");
//reduce head to nessesary length so it dosent output useless NULL's
int len = strlen(headbuf);
unsigned char head[len];
sprintf(head, "P7nWIDTH 255nHEIGHT 255nDEPTH 4nMAXVAL 255nTUPLTYPE RGB_ALPHAnENDHDRn");
//write head to file
fwrite(head, sizeof (head), 1, out);
//initiating pixel values
unsigned char buf[8];
int r = 0; //AA
int g = 0; //BB
int b = 0; //CC
int a = 255; //DD
//for now just change the red and green values
for (r = 0; r <= 255; r ) {
for (g = 0; g <= 255; g ) {
//coppy pixel data to buffer
sprintf(buf, "XXXX", r, g, b, a);
//write buffer to head
fwrite(buf, sizeof (buf), 1, out);
}
}
}
fclose(out);
printf("fin");
getchar();
return (EXIT_SUCCESS);
}
Он выводит заголовок так, как я хочу, но значения пикселей также записываются в их значениях ASCII
Он выводит ENDHDR nAABBCCDD
как. 45 4E 44 48 44 52 0A 41 41 42 42 43 43 44 44
это должно выводиться следующим образом: 45 4E 44 48 44 52 0A AA BB CC DD
Комментарии:
1. Вы правильно написали код, который у меня есть
00FFCC0001FFCC0002FFCC0003FFCC0
… Чего вы ожидаете от первых байтов?2.
sprintf(buf, "XXXX", r, g, b, a);
Это форматирует ваши байтовые значения в виде шестнадцатеричных чисел. Если вам нужны двоичные данные вместо шестнадцатеричного представления, запишите значение напрямую.3. Если вам нужны пробелы между числами … гм … добавьте пробелы в строку вашего формата. И почему бы просто не использовать
fprintf()
вместо этогоsprintf()
/fwrite()
thing (Которая имеет неопределенное поведение, потому чтоsprintf()
записывает 9 элементов в 8-элементный массив символов…4.
unsigned char head[len];
Это не требуется. Если у вас есть длина вашего текста, вы можете использовать его для записиheadbuffer
. Нет необходимости копировать это снова. Вам не хватает байта для NUL-терминатора enyway, а второйsprintf
будет записывать за пределы. А также использованиеstrcpy
было бы дешевле, чем выполнять форматирование черезsprintf
второй раз.
Ответ №1:
Я исправил свой код и просто записал значения как их аналог ASCII.
Вот исправленный код
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *out;
out = fopen("C:/Users/entin/Desktop/write.pam", "wb ");
if (out == NULL) {
printf("Unable to access file.n");
} else {
//head
fprintf(out, "P7nWIDTH 255nHEIGHT 255nDEPTH 4nMAXVAL 255nTUPLTYPE RGB_ALPHAnENDHDRn");
//initiating pixel values
int r = 0; //red
int g = 0; //green
int b = 255; //blue
int a = 255; //alpha
//for now just change the red and green values
for (r = 0; r <= 255; r ) {
for (g = 0; g <= 255; g ) {
//call the numbers as theirr ASCII counterpart and print them
fprintf(out, "%c%c%c%c", r, g, b, a);
}
}
}
fclose(out);
printf("fin");
getchar();
return (EXIT_SUCCESS);
}
Вот первый результат
Комментарии:
1. да, я знаю, нужно увеличить высоту и ширину до 256