這是我的代碼。目標是將灰度值轉換為 ASCII 字符并列印 Lena 的影像。我是這樣做的,但我的老師說它不可擴展,這是真的。我對編碼比較陌生,所以有什么辦法可以縮短它嗎?我想過使用 for 回圈,但不知道如何。
#include <stdio.h>
#include "lenaArray.h" //This library imports a 2D array of Lena
//Functions used in code;
char charGrayScale(int grayScale)
{
//This function converts the grayscale values of every index array to a character in the ASCII
if (grayScale < 25) return ' ';
if (grayScale < 50) return '.';
if (grayScale < 75) return ':';
if (grayScale < 100) return '-';
if (grayScale < 125) return '=';
if (grayScale < 150) return ' ';
if (grayScale < 175) return '*';
if (grayScale < 200) return '#';
if (grayScale < 225) return '%';
return '@';
}
uj5u.com熱心網友回復:
類似查找表的東西是可能的:
#include <stdio.h>
#include "lenaArray.h" //This library imports a 2D array of Lena
//Functions used in code;
const char* GRAYSCALE_CHARS = {' ', '.', ':', '-', '=', ' ', '*', '#', '%'};
char charGrayScale(int grayScale)
{
const int index = (grayScale/25);
if (index >= (sizeof(GRAYSCALE_CHARS)/sizeof(GRAYSCALE_CHARS[0]))) return '@';
return GRAYSCALE_CHARS[index];
}
uj5u.com熱心網友回復:
我假設通過“可擴展”,您的老師希望您擺脫硬編碼的值,以便能夠將您的解決方案“縮放”到任意整數輸入(例如,不系結到固定值 0-255)。這可以與 Louis Wilke 在上一個答案中所寫的查找表實作結合使用。
例如這樣的:
#include <stdio.h>
#include "lenaArray.h" //This library imports a 2D array of Lena
//Functions used in code;
const char greyscaleChars[] = {' ', '.', ':', '-', '=', ' ', '*', '#', '%', '@'};
const char charGreyScale(int greyScale, int min, int max) {
int step = (max - min) / (sizeof greyscaleChars);
return greyscaleChars[greyScale/step - 1];
}
請注意我沒有測驗過這段代碼,它只是為了展示這個想法。
uj5u.com熱心網友回復:
其他答案取決于以 25 個間隔間隔的值。
我更新了相同的想法,以便間隔不需要定期間隔。每個間隔的限制在靜態表中指定。
這確實取決于按升序排序的間隔限制。因此,如果您必須向表中添加更多條目,請確保將它們添加到正確的位置。
#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
char charGrayScale(int grayScale)
{
static struct
{
int limit;
char symbol;
} grayMap[] = {
{ 25, ' ' },
{ 50, '.' },
{ 75, ':' },
{ 100, '-'},
{ 125, '='},
{ 150, ' '},
{ 175, '*'},
{ 200, '#'},
{ 225, '%'},
{ 250, '@'},
};
char symbol = grayMap[COUNT_OF(grayMap)-1].symbol;
for(int i=0; i<COUNT_OF(grayMap); i)
{
if (grayScale < grayMap[i].limit)
{
symbol = grayMap[i].symbol;
break;
}
}
return symbol;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/516684.html
下一篇:輸入無法在C中計算和列印
