В настоящее время я делаю проект, в котором мне нужно уменьшить изображение 24 бит на пиксел до изображения 3 бит на пиксел, используя упорядоченную матрицу дизеринга 4х4. Тем не менее, после обработки дизеринга мое изображение показывается только на 1/3 пути. Кто-нибудь знает, что я делаю не так?
Источник:
#include <stdio.h>
#include <fstream>
/*24 bit per pixel - 3 bit per pixel dither*/
/*Use the 4x4 Ordered Dither Matrix:
[1 9 3 11]
[13 5 15 7]
[4 12 2 10]
[16 8 14 6]
*/
int checkColor(int a, int b);
unsigned char buf[512][512];
unsigned char out[512][512];
float ratio = 1.0 / 17;int main(){
FILE *fp, *output;
int i, j, k, l;
/*dither matrix*/
unsigned int dith[4][4] = {{1, 9, 3, 11}, {13, 5, 15, 7}, {4, 12, 2, 10}, {16, 8, 14, 6}};if((fp = fopen("LennaRGB512.data", "rb")) == NULL){
printf("error opening file\n");
}
for (i = 0; i < 512; i++) {
for (j = 0; j < 512; j++) {
buf[i][j] = fgetc(fp); /*Put data in buffer*/
}
}
i = 0;
j = 0;
int x, y;
int bd = 64;
for (k = 0; k < 512; k++){
for (l = 0; l < 512; l++){
int oldPixel = buf[k][l];
int value = (oldPixel + (ratio * dith[k%4][l%4]));
int r = ((oldPixel >> 16) & 0xff) + value;
int g = ((oldPixel >> 8) & 0xff) + value;
int b = (oldPixel & 0xff) + value;
int newPixel = 0x000000 | checkColor(r, bd) << 16 | checkColor(g, bd) << 8 | checkColor(b, bd);
out[k][l] = newPixel;
}
}output = fopen("converted_img.data", "wb");
for (i = 0; i < 512; i++){
for (j = 0; j < 512; j++){
fputc(out[i][j], output);
}
}
fclose(output);
fclose(fp);
return 0;
}
int checkColor(int a, int b){
return a / b * b;
}
Мое предыдущее изображение представляет собой изображение 512×512, однако мое выходное изображение, которое является размытым, является лишь частью изображения (512×170).
Ваше исходное изображение 24bpp. Это три байта на пиксель. Если вы читаете только 512 байт в ширину и 512 байт в высоту, это точно соответствует 512×170 (512/3) вашего изображения. Вам нужно прочитать 3 байта на пиксель в начале.
Кроме того, вы конвертируете в 32bpp с int newPixel
, не 3bpp, а сохраняя его в символе, который будет переполнять (урезать) значение.
Кроме того, почему ваш шаблон дизеринга 4bpp? (2 ^ 4 = 16 значений).
Кажется, твой учитель плохо объяснил.
Других решений пока нет …