我正在编写一个程序,用于将文件从PPM格式转换为ASCII艺术。通过计算红绿蓝值((red + green +blue)/3)
的平均值,将输入图像的每个像素转换为灰度。
基本版本的升级是我在大小为n*n
的窗口中计算RGB的平均值,并将其转换为可减小图像大小的字符。因此,如果给定的数字n
为3
,则窗口大小为3*3
,这意味着您将所有九个红色,绿色和蓝色值相加并将其除以3 {{1} (在这种情况下为n*n
)。当程序计算第一个窗口的灰度时,它会移动到另一个窗口,依此类推,直到结束。当宽度结束时,它会向下跳过n个像素并读取下一行等。
计算灰度时,会将其转换为字符,并将此字符写入输出文件以形成ASCII艺术图像。
我的程序确实编译了,但是当我测试它时,我得到了错误的图像。一个非常简单的图像转换为空白文件,另一个应该看起来像棋盘,但它打印了一个非常大的列图像。通过扫描像素块1 * 1将这两个图像转换为ASCII艺术。第三个图像非常大,所以它应该被3 * 3块转换,但是我得到的输出文件太大而无法打开。在简单的文本编辑器中。
谁能告诉我哪里犯了错误?
以下是代码:
3*3
答案 0 :(得分:1)
这些行:
for(i = 0; i < width; i+=n){
for(j=0; j < height; j+=n){
可能不正确。如果是n = 3
,则会在图像的X和Y上读取每3个像素而不是本地块。这将为您提供分散的数据集而不是块。
或者......在此代码中放置第二组for循环,从0
到n-1
计算并读取要平均的所有像素。这实际上可能是这里缺少的一部分。
for(i = 0; i < width; i+=n){
for(j=0; j < height; j+=n){
for(blockx = 0; blockx < n; blockx++){
for(blocky=0; blocky < n; blocky++){
// Use current averaging code to gather all numbers,
// being careful of overflow.