搞过计算机图像的人都知道,图像中的每一个像素通常为一个整型数,它可以分成4个无符号的char类型,以表示其RGBA四个分量。一幅图像可以看做是一个二维整型数组。这里我会生成一个float数组,其数组大小为1000000,刚好1000*1000,数组内的浮点数的数值范围在0到1000.0之间,呈等差数组排列,相邻两数的差为0.001。然后将其每一个浮点数强制转化成一个整型数或三个unsigned char型,以决定像素的RGB三个通道分量,看看其生成的图像是什么样子。

前几天写了一篇文章是在C语言中使用异或运算交换两个任意类型变量,引来某人的质疑,说什么“指针的强制类型转换有一定限制,不是你想怎么转就怎么转的,结果可能会出错的”。用这种莫须有的话来否定我的代码。为嘲笑他的无知,我特意写出这种用强制指针类型转换生成图像的算法。

先上C代码:

#include <iostream>
#include <cmath>
#include <cstdlib>#define DIM 1000void pixel_write(int,int);
FILE *fp;int main()
{fp = fopen("image.ppm","wb");if (!fp){return -1;}fprintf(fp, "P6\n%d %d\n255\n", DIM, DIM);for(int j=0;j<DIM;j++){for(int i=0;i<DIM;i++){pixel_write(i,j);}}fclose(fp);return 0;
}void pixel_write(int i, int j)
{static unsigned char color[3];float t = j + i*0.001f;memcpy(color, &t, 3);fwrite(color, 1, 3, fp);

    // 其实更简单粗爆的方式是
     //fwrite(&t, 1, 3, fp);
}

代码运行后会生成一种PPM格式的图像,如下图所示:

图像多少有点分形的感觉。PPM格式的图像不太常见,它是一种非常简单的图像格式。在我写的软件Why数学图像生成工具中可以查看,当然我也将该图像的生成算法写到这个软件中,相关代码如下:

#ifndef _PixelFloatConvertInt_H_
#define _PixelFloatConvertInt_H_// --------------------------------------------------------------------------------------

#include "IPixelEquation.h"// --------------------------------------------------------------------------------------class CPixelFloatConvertInt : public IPixelEquation
{
public:CPixelFloatConvertInt(){m_width = 1000;m_height = 1000;}const char*     GetName() const{return "Float Convert Int";}unsigned int    CalculatePixel(unsigned int x, unsigned int y){float t = y + x*0.001f;unsigned int rst = *(unsigned int*)&t;rst |= 0xff000000;return rst;}
};// --------------------------------------------------------------------------------------#endif

使用Why数学图像生成工具可以查看该图像的红绿蓝三个分量:

R通道图:

G通道图:

B通道图:

代码稍做修改,分形效果更为明显:

    unsigned int    CalculatePixel(unsigned int x, unsigned int y){float t = y/4+ x*0.001f;unsigned int rst = *(unsigned int*)&t;rst |= 0xff000000;return rst;}

转载于:https://www.cnblogs.com/WhyEngine/p/4051001.html

C语言中将0到1000的浮点数用强制指针类型转换的方式生成一幅图像相关推荐

  1. c语言程序0到1000的素数,C语言实现之100-1000以内素数的等差数列

    接上一篇,还是我同学给的题目,最后一个.一开始有点问题,现在改正了. *写的比较仓促,如果有更简便.执行效率更高的方法还请不吝赐教,当然我的如果有问题请大家给指出. 题目: 在小于10的素数中有3.5 ...

  2. C语言的本质(4)——浮点数的本质与运算

    C语言的本质(4)--浮点数的本质与运算 C语言规定了3种浮点数,float型.double型和long double型,其中float型占4个字节,double型占8个字节,longdouble型长 ...

  3. c语言赋值小数,c语言中将一个浮点型赋值给整型时,会不会四舍五入?

    c语言中将一个浮点型赋值给整型时,不会四舍五入,会直接舍去小数部分的数据,也可以认为是执行了下取整运算. 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分,只保留整数部分.将整型值赋给浮点型变 ...

  4. c语言保留小数点后n位_C语言(2)- 定点数和浮点数

    (本文为原创,版权归作者所有) 变量的基本类型里包含了整数和小数,它们是如何由一组0和1来表示的呢? 在数学的世界里,实数可以涵盖一个数轴上所有的点,它应该可以表示我们在日常生活中碰到的大部分的数.实 ...

  5. Java黑皮书课后题第2章:2.6(求一个整数各位数的和)读取一个0和1000之间的整数,并将给整数的各位数字相加

    2.6(求一个整数各位数的和)读取一个0和1000之间的整数,并将给整数的各位数字相加 题目 题目描述 运行示例 题目槽点与破题 题目槽点 破题 如何提取数字 代码块 方法评价 题目 题目描述 2.6 ...

  6. c语言中将函数指针作为形参_在C中将有效指针作为NULL指针

    c语言中将函数指针作为形参 Prerequisite: An Example of Null pointer in C 先决条件: C中的空指针示例 Any pointer that contains ...

  7. c语言中将整数转换成字符串_在C语言中将ASCII字符串(char [])转换为八进制字符串(char [])...

    c语言中将整数转换成字符串 Given an ASCII string (char[]) and we have to convert it into octal string (char[]) in ...

  8. c语言中将整数转换成字符串_在C语言中将ASCII字符串(char [])转换为十六进制字符串(char [])...

    c语言中将整数转换成字符串 Given an ASCII string (char[]) and we have to convert it into Hexadecimal string (char ...

  9. 1000以内所有同构数java算法_使用c语言求1到1000同构数的代码

    使用c语言求1到1000同构数的代码 发布时间:2020-04-30 14:39:17 来源:亿速云 阅读:679 作者:小新 今天小编给大家分享的是使用c语言求1到1000同构数的代码,相信很多人都 ...

最新文章

  1. vue 内打开一个新窗口,带传参!
  2. 移动端常见的不同苹果手机media query汇总
  3. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第6章-操作度优化条件下的移动机械臂协同搬运控制
  4. mybatis-spring 集成
  5. git add * 提示warning: LF will be replaced by CRLF in 解决办法
  6. CF235D-Graph Game【LCA,数学期望】
  7. word如何一键全选_学会这七个Word小技巧,五分钟完成3小时的工作
  8. [react] 请说下react组件更新的机制是什么
  9. 基于51单片机的车速控制系统
  10. ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存
  11. java代码执行linux命令_怎么用java代码运行linux命令
  12. 数据挖掘著名学者的网站
  13. vue 中如何引入字体(思源黑体)
  14. Junit实现抽象类测试(一)
  15. 自动加减工单结存算法实现
  16. win10联想软件商店壁纸的保存目录在哪
  17. 迅捷PDF转换器怎样将PDF文件转换为HTML网页
  18. win10计算机管理器端口号,Win10设备管理器没有端口选项的解决方法
  19. 教资(信息技术学科知识与教学能力)13-1信息技术课程知识
  20. Trac中的Ticket系统

热门文章

  1. 基于Golang的监听读取配置文件的程序包开发——simpleConfig_v1
  2. 数据结构(01)— 算法复杂度概念及常见的复杂度计算
  3. centos 7.4 上安装neo4j并测试
  4. 梯度下降理解和梯度下降计算检查斯坦福
  5. MLIR中间表示与编译
  6. deeplearning模型库
  7. MegEngine亚线性显存优化
  8. 稀疏自编码器及TensorFlow实现
  9. 适用于Windows和Linux的Yolo-v3和Yolo-v2(上)
  10. 马斯克如何颠覆航天? 1/5385成本,c++和python编程!