实现一个行走的人,有大神挑战下吗
{:10_257:} 这个原理简单,但是文本的问题麻烦 #include "ximage.h"#include <iostream>
#include <string>
static void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = {100, false};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
static void GotoXY(SHORT x, SHORT y)
{
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), COORD{x, y});
}
// 字符与RGB的对应的映射关系
static char RgbToChar(uint8_t r, uint8_t g, uint8_t b)
{
static const std::string ascii_char = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\\|()1{}[]?-_+~<>i!lI;:,\"^`'. ";
int gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b);
double unit = (256.0 + 1) / ascii_char.size();
return ascii_char;
}
class AsciiGif
{
public:
AsciiGif()
{
this->image = nullptr;
}
~AsciiGif()
{
delete this->image;
}
bool Load(const std::string &filename)
{
if(this->image)
delete this->image;
this->image = new CxImage;
this->image->SetRetreiveAllFrames(true);
this->image->Load(filename.c_str(), CXIMAGE_FORMAT_GIF);
if(!this->image->IsValid())
return false;
return true;
}
bool Scale(double w_scale, double h_scale)
{
if(!this->image)
return false;
for(int32_t i = 0; i < this->image->GetNumFrames(); ++i)
{
CxImage *frame = this->image->GetFrame(i);
frame->Resample(int32_t(frame->GetWidth() * w_scale), int32_t(frame->GetHeight() * h_scale));
}
return true;
}
std::string GetFrame(int32_t index) const
{
if(!this->image)
return std::string();
if(index >= this->image->GetNumFrames())
return std::string();
CxImage *frame = this->image->GetFrame(index);
uint32_t width = frame->GetWidth();
uint32_t height = frame->GetHeight();
std::string buf;
for(int32_t h = height - 1; h >= 0; --h)
{
for(uint32_t w = 0; w < width; ++w)
{
RGBQUAD color = frame->GetPixelColor(w, h);
buf += RgbToChar(color.rgbRed, color.rgbGreen, color.rgbBlue);
}
buf += '\n';
}
return buf;
}
int32_t GetNumFrames() const
{
return this->image->GetNumFrames();
}
uint32_t GetFrameDelay() const
{
return this->image->GetFrameDelay();
}
private:
CxImage *image;
};
int main()
{
AsciiGif gif;
gif.Load("src\\1.gif");
gif.Scale(0.5 * 1.4, 0.25 * 1.4);
HideCursor(); // CxImage内部设置过显示光标,在这里覆盖这个设置
while(1)
{
for(int32_t i = 0; i < gif.GetNumFrames(); ++i)
{
std::string frame = gif.GetFrame(i);
puts(frame.c_str()); // std::cout太慢了,这里用puts
Sleep(gif.GetFrameDelay() * 10);
GotoXY(0, 0);
}
}
return 0;
}
完整源码
链接:https://pan.baidu.com/s/1Hkv1bl010J8Yb_5r1CMQyQ
提取码:ys82
人造人 发表于 2018-11-8 13:38
完整源码
链接:https://pan.baidu.com/s/1Hkv1bl010J8Yb_5r1CMQyQ
提取码:ys82
牛逼,原理是啥? 人造人 发表于 2018-11-8 13:38
完整源码
链接:https://pan.baidu.com/s/1Hkv1bl010J8Yb_5r1CMQyQ
提取码:ys82
卧槽大佬牛逼 人造人 发表于 2018-11-8 13:38
完整源码
链接:https://pan.baidu.com/s/1Hkv1bl010J8Yb_5r1CMQyQ
提取码:ys82
厉害了,感觉用像素点代替,这不就是动画嘛 人造人 发表于 2018-11-8 13:38
完整源码
链接:https://pan.baidu.com/s/1Hkv1bl010J8Yb_5r1CMQyQ
提取码:ys82
大佬牛逼 千公子 发表于 2018-11-8 17:52
牛逼,原理是啥?
gif就是好多的图片组成一个文件
这个程序就是循环显示每一张图片
核心原理就是把像素对应的颜色转换成字符
ssxx43 发表于 2018-11-8 19:05
厉害了,感觉用像素点代替,这不就是动画嘛
嗯,用相同的原理完全可以把视频字符化
^_^ sixsix six·····6了 6了··· 人造人 发表于 2018-11-8 13:38
完整源码
链接:https://pan.baidu.com/s/1Hkv1bl010J8Yb_5r1CMQyQ
提取码:ys82
麻烦问下你用的什么软件打开的啊{:10_277:} 我用dev和vc打开总找不到自定义那些头文件 GAI_0205 发表于 2018-11-30 00:48
麻烦问下你用的什么软件打开的啊 我用dev和vc打开总找不到自定义那些头文件
vs2017
人造人 发表于 2018-11-30 00:51
vs2017
直接打开main的cpp文件吗 有很多其他的附属文件会自己跳出来吗{:10_277:}刚学c
没多久不是很懂 GAI_0205 发表于 2018-11-30 01:08
直接打开main的cpp文件吗 有很多其他的附属文件会自己跳出来吗刚学c
没多久不是很懂
你用的是vs2017 ?
人造人 发表于 2018-11-30 01:21
你用的是vs2017 ?
我刚下了vs2017,打开那个cxlmage后运行时打开不了那些.h源文件怎么把它放进去啊 GAI_0205 发表于 2018-11-30 23:10
我刚下了vs2017,打开那个cxlmage后运行时打开不了那些.h源文件怎么把它放进去啊
直接打开 CxImage.sln
厉害啊。。。
页:
[1]