什么是真正的图片内部以及如何使用C创建一个

时间:2015-06-30 02:05:43

标签: c graphics

我曾经看到有人使用C创建图片,如下所示:

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>
#include <math.h>

float f(float x, float y, float z) {
    float a = x * x + 9.0f / 4.0f * y * y + z * z - 1;
    return a * a * a - x * x * z * z * z - 9.0f / 80.0f * y * y * z * z * z;
}

float h(float x, float z) {
    for (float y = 1.0f; y >= 0.0f; y -= 0.001f)
        if (f(x, y, z) <= 0.0f)
            return y;
    return 0.0f;
}

int main() {
    FILE* fp = fopen("heart.ppm", "w");
    int sw = 512, sh = 512;
    fprintf(fp, "P3\n%d %d\n255\n", sw, sh);
    for (int sy = 0; sy < sh; sy++) {
        float z = 1.5f - sy * 3.0f / sh;
        for (int sx = 0; sx < sw; sx++) {
            float x = sx * 3.0f / sw - 1.5f;
            float v = f(x, 0.0f, z);
            int r = 0;
            if (v <= 0.0f) {
                float y0 = h(x, z);
                float ny = 0.001f;
                float nx = h(x + ny, z) - y0;
                float nz = h(x, z + ny) - y0;
                float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz);
                float d = (nx + ny - nz) / sqrtf(3) * nd * 0.5f + 0.5f;
                r = (int)(d * 255.0f);
            }
            fprintf(fp, "%d 0 0 ", r);
        }
        fputc('\n', fp);
    }
    fclose(fp);
        return 0;
}

他所做的只是在文件heart.ppm中加入一些数字。只有少数,他在Photoshop中获得了惊人的3D图片,如下所示:enter image description here

所以我非常好奇heart.ppm文件中的内容。但打开它后,我只能看到一堆数字,纯数字。然后我打开另一个jpg文件,只看到一团糟。

所以,我很好奇这里的魔力是什么。也许只有格式计数。也许图片中始终只有数字和字符。但是当使用某些工具(如photoshop)打开它时,该工具会翻译该消息,然后为你制作一张图片。(对吧?)

我想问,

  1. 如何使用C制作照片?只能在文件中放几个数字就无法获得图片。必须有一些标准来使这些数字有意义,并使它们由图片组成。

  2. 这些格式的标准是什么? .jpg.ppm.png等任何引用和相关链接?

1 个答案:

答案 0 :(得分:2)

一般来说,有两种类型的图像文件格式(回答问题#2)

  1. 基于光栅的
  2. 基于矢量
  3. 基于栅格的

    .jpg / .png / .ppm(和.bmp)称为Raster格式。在光栅格式中,存储每个像素的颜色信息。图像存储为数组/像素网格。颜色信息通常由“RGB” - 红色/绿色/蓝色组成。通常,较大的分辨率或格式需要更多内存。

    上面的'C'代码将图像生成为基于光栅的图像,这些数学函数正在吐出“红色”颜色。 (回答你的问题#1)

    基于矢量 .svg / .eps通常是最知名的矢量格式。在矢量格式中,存在构成图像的命令。例如,您上面显示的图像也可能使用以下命令和更多

    来表示
    move-to (pos-x, pos-y)
    
    draw-heart(<specify dimensions of the heart>, color,  <shading model details>)
    

    然后是一系列

    concentric-circle(at-pos-x, at-pos-y, radius, line-thickness, biased-info-optional)
    

    draw-heartconcentric-circle将包含大量其他基本命令,例如line-tofill,等等

    这是一个令人着迷的问题 - 它是一个经过深入研究/讨论的领域。

    请考虑从此链接开始 http://www.ed-brandt.com/pdfs/digital-graphics-primer.pdf