部落冲突怎么用谷歌登陆谷歌版现在不能登陆了,有没有什么办法

C语言中将0到1000的浮点数用强制指针类型转换的方式生成一幅图像_C++,C语言_ThinkSAAS
C语言中将0到1000的浮点数用强制指针类型转换的方式生成一幅图像
C语言中将0到1000的浮点数用强制指针类型转换的方式生成一幅图像
内容来源: 网络
搞过计算机图像的人都知道,图像中的每一个像素通常为一个整型数,它可以分成4个无符号的char类型,以表示其RGBA四个分量。一幅图像可以看做是一个二维整型数组。这里我会生成一个float数组,其数组大小为1000000,刚好,数组内的浮点数的数值范围在0到1000.0之间,呈等差数组排列,相邻两数的差为0.001。然后将其每一个浮点数强制转化成一个整型数或三个unsigned char型,以决定像素的RGB三个通道分量,看看其生成的图像是什么样子。
前几天写了一篇文章是在C语言中,引来某人的质疑,说什么“指针的强制类型转换有一定限制,不是你想怎么转就怎么转的,结果可能会出错的”。用这种莫须有的话来否定我的代码。为嘲笑他的无知,我特意写出这种用强制指针类型转换生成图像的算法。
先上C代码:
#include &iostream&
#include &cmath&
#include &cstdlib&
#define DIM 1000
void pixel_write(int,int);
FILE *
int main()
fp = fopen("image.ppm","wb");
if (!fp)
return -1;
fprintf(fp, "P6n%d %dn255n", 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格式的图像不太常见,它是一种非常简单的图像格式。在我写的软件中可以查看,当然我也将该图像的生成算法写到这个软件中,相关代码如下:
#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
// --------------------------------------------------------------------------------------
#endif
使用可以查看该图像的红绿蓝三个分量:
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
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信使用libtiff储存TIFF格式图片,图片只存储了2045张 - C语言当前位置:& &&&使用libtiff储存TIFF格式图片,图片只存储了2045张使用libtiff储存TIFF格式图片,图片只存储了2045张&&网友分享于:&&浏览:0次使用libtiff存储TIFF格式图片,图片只存储了2045张?&&&&&&&&在windows7,32位的系统上建立的windows&console&application,想要使用libtiff库来输出一系列的TIFF格式的文件,因为需要输出的文件数目有30000张之多,因此使用了for循环。但是,发现在编译成功后,运行时,输出的文件数目总是在2045时,程序就发生错误。不能达到要求的文件数目。下面是我的代码(这个代码只是为了验证文件生成数目的会不会被限制)我的libtiff库所需要的必要库文件和头文件都是自己编译的。
&&&&&&&&PS:这个问题在Google上搜索了一下,貌似也有人需要相似的问题,但是都没有给出明确的解决方法,我自己猜想不知道是不是系统的问题,因为libtiff是在Linux系统下编写的库,还有就是我发现在TIFFClose(image)之后,image的值并没有变化,所以我怀疑是不是tiffclose并没有起作用,但是将tiffclose注释掉后,发现文件的数目只能输出1024个,所以自己真的是不明所以了,恳请各位图像处理的大神,能够给与一丝帮助。
#include&&stdio.h&
#include&&iostream&
#include&"tiffio.h"
#pragma&comment(&lib,&"libtiff.lib"&)
using&namespace&
#define&XSIZE&100
#define&YSIZE&120
int&main(int&argc,&char&*argv[])
&&&&TIFF&*
&&&&uint32&image_width,&image_
&&&&uint16&spp,&
&&&&int&i,&j;
&&&&char&szFileName[100];
&&&&uint16&array[XSIZE&*&YSIZE];
&&&&for&(j&=&0;&j&&&YSIZE;&j++)
&&for(i&=&0;&i&&&XSIZE;&i++)
&array[j&*&XSIZE&+&i]&=&i&*&j;
&&&&&&&&&&&&for(&int&m=1;&m&=5000;&m++)
&&&&&&&&sprintf(szFileName,"F:\\chenjun\\data\\%d.tif",m);
&&&&&&&&&&&&&&&&image&=&TIFFOpen(szFileName,&"w");
&&&&&&&&//&Open&the&TIFF&file
&&&&&&&&if((image&=&TIFFOpenW(szFileName,&"w"))&==&NULL)
&&&&&&&&cout&&"can&not&open&the&"&&szFileName&&"&to&write."&&
&&&&&&&&return&1;
&&&&&&&&image_width&=&XSIZE;
&&&&&&&&image_height&=&YSIZE;
&&&&&&&&spp&=&1;&/*&Samples&per&pixel&*/
&&&&&&&&bpp&=&16;&/*&Bits&per&sample&*/
&&&&&&&&//&We&need&to&set&some&values&for&basic&tags&before&we&can&add&any&data
&&&&&&&&TIFFSetField(image,&TIFFTAG_IMAGEWIDTH,&image_width);//set&the&width
&&&&&&&&TIFFSetField(image,&TIFFTAG_IMAGELENGTH,&image_height);//set&the&height
&&&&&&&&TIFFSetField(image,&TIFFTAG_BITSPERSAMPLE,&bpp);//set&the&size&of&the&channels
&&&&&&&&TIFFSetField(image,&TIFFTAG_SAMPLESPERPIXEL,&spp);//set&number&of&channels&per&pixel
&&&&&&&&TIFFSetField(image,&TIFFTAG_ROWSPERSTRIP,&image_width);
&&&&&&&&TIFFSetField(image,&TIFFTAG_COMPRESSION,&COMPRESSION_NONE);
&&&&&&&&TIFFSetField(image,&TIFFTAG_PHOTOMETRIC,&PHOTOMETRIC_MINISBLACK);
&&&&&&&&TIFFSetField(image,&TIFFTAG_FILLORDER,&FILLORDER_MSB2LSB);
&&&&&&&&TIFFSetField(image,&TIFFTAG_PLANARCONFIG,&PLANARCONFIG_CONTIG);
&&&&&&&&TIFFSetField(image,&TIFFTAG_XRESOLUTION,&96.0);
&&&&&&&&TIFFSetField(image,&TIFFTAG_YRESOLUTION,&96.0);
&&&&&&&&TIFFSetField(image,&TIFFTAG_RESOLUTIONUNIT,&RESUNIT_INCH);
&&&&&&&&for&(int&n&=&0;&n&&image_&n++)
&&&&&&&&&&&&&TIFFWriteScanline(image,&&array[n&*&image_width],&n,&0);
&&&&&&&&&&&&&&TIFFClose(image);//&Close&the&file
}------解决方案--------------------这个没有用过,不过看问题,似乎是,用完后句柄没有关闭,继续用同样的句柄打开下一个。造成的。
&image&=&TIFFOpen(szFileName,&"w");
&&&&&&&&//&Open&the&TIFF&file
把上面的那一句去掉应当就可以了。试试吧。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有基础(13)
三十二位机器下浮点型是32位,六十四位机器下浮点类型是64位。
&&&1)以平常使用的单精度浮点型为例,其存储分为3块。
&&&第一块符号位sign,由第一位来表示,1为负数,0为非负。
&&&第二块指数位exp,由8个二进制来表示,其存储的是二进制的指数值(二进制数化成正数位为1的指数形式,这种方式叫做隐含的以1开头的表示)加上偏移,单精度的偏移是127。
&&&第三块是位数位frac,由23个位构成,表示的是二进制数第一个1以后的二进制串。
&&2)浮点型的存储因指数位的不同,分为规格化的,非规格化的和无穷大,非数四种情况组成。
&&a.规格化的:exp!=0 && exp !=255,即指数位不全为零,也不全为1时的情况。此时存储的指数位是加上偏移127。其位数二进制表示为0
&= frac & 1,其位数实际为M = frac + 1;
&&b.非规格化的:exp = 0,存储的指数位是E = 1 - 127,其位数位为M
= frac,不再包含隐含的开头1。
c.无穷大:exp = 255,frac = 0,当sign
= 0时是正无穷,当sign = 1时是负无穷。
d.NaN(not a number):exp = 255,frac != 0;比如根号下负一的值。
例如:float f=0; 即f的存储全为零。当符号位为1的时候为-0;
双精度浮点型的一些参数:双精度的指数位由十位二进制构成,其偏移是1023,其尾数位为53位。
float型浮点数的取值范围:1.20e-38(2*2^)-----3.40e+38(2*2^).
double型浮点数取值范围:2.2e-308(2*2^)------1.8e+308(2*2^).
取出计算机中的浮点型数据:
void &float_spa(float f)
int d = *(int *)&f; &//将浮点型的存储形式用整型表现出来
int sign = (0x & d) && 31; &&//将符号位取出来
int exp = ((0x7f800000 & d) && (32 - 9)) - 127; &&//取出指数位
//其中特别注意exp为0和
int frac = ((0x007fffff & d) | 0x) && (23-exp); &&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&了解浮点型的存储格式,并且掌握位运算和移位操作。
将浮点型中的各部分通过位运算和移位操作按块出来,首先确定函数的符号,其次拿出指数位,减去偏移,得出尾数位中需要向右偏移多少位是整数部分,其中有一个1在进行浮点数存储的时候隐藏了需要补上。然后输出整型乘以符号得到整型形式。
指数位全为零和指数位全为一的存储与普通浮点数存储的形式在偏移计算中略有不同。将其三种不同详细介绍
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2786次
排名:千里之外
原创:36篇
(5)(4)(9)(9)(9)

我要回帖

更多关于 部落冲突怎么用谷歌登陆 的文章

 

随机推荐