DELPHI如何读取一个图片,保存到字节数组中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DELPHI如何读取一个图片,保存到字节数组中相关的知识,希望对你有一定的参考价值。
如题我想问下,如何读取一个图片或者一个任意格式的文件保存到一个动态的 字节数组中
参考技术A 使用工作流,采用savetostream存入和loadfromstream读取 参考技术B TFileStream.ReadBuffer();追问可以详细点吗,谢谢
追答这还不够详细么?自己搜一下Delphi TFileStream,所有东西都有了。学习要有方法,不能只是复制别人的代码。
追问顺便问下如何 输出 字节数组中的 16进制数据
追答IntToHex();
本回答被提问者采纳如何读取和写入位到字节数组
【中文标题】如何读取和写入位到字节数组【英文标题】:How to read and write bits to a byte array 【发布时间】:2009-09-12 18:06:19 【问题描述】:我有一个 unsigned char 缓冲区,我想知道如何将有符号和无符号位写入和读取到这个字节缓冲区。
在Source Engine中有一个名为bf_write的类,其中两个主要方法(WriteString、WriteChar、WriteLong等使用)使用了两个名为的函数>WriteUBitLong 和 WriteSBitLong。
提前致谢
【问题讨论】:
“有符号位和无符号位”是什么意思。没有符号位或无符号位之类的东西。它是 0 或 1。 你能提供一些你想做的代码示例吗? 位如何有符号或无符号?它可以是 0 或 1。 你的意思是写一个 N 位的有符号/无符号变量吗? 符号+幅度,+0 或 -0 【参考方案1】:如果位数是编译时常数:
#include <bitset>
...
std::bitset<100> b;
b[2]=true;
如果不是,请使用Boost.dynamic_bitset
或者,如果你很绝望,std::vector,它确实是一个压缩位向量:
#include <vector>
...
std::vector<bool> b(100);
b[2]=true;
您似乎想使用一个需要将位向量打包在字节数组中的库。在不知道它放置位的确切顺序的情况下,我只能注意到:
1) 以上所有内容可能会使用至少 32 位整数,位排序为最低->最高或最高->最低有效
2) 在 little endian (Intel/AMD) CPU 上,这意味着 int 数组的字节占用的内存可能与 int 中的位顺序不一致。如果它是“位 0 是 int 0 的 lsb,... 位 32 是 int 1 的 lsb,...”那么在小端序中这与“位 0 是 char 0 的 lsb,...位32 是 char 4 ..." 的 lsb,在这种情况下,您可以将指向 int 数组的指针转换为指向 char 数组的指针
3) 假设您的位集/向量中的本机字节顺序不是库所需要的,那么您必须要么必须创建自己的具有所需布局的布局,要么将副本转录到他们的布局中.
a) 如果一个字节内的位顺序不同,则一个 256 条目查找表给出位反转的字节将是有效的。你可以用一个小程序生成表格。
b) 从 littlebig endian 反转字节:
inline void endian_swap(unsigned short& x)
x = (x>>8) |
(x<<8);
inline void endian_swap(unsigned int& x)
x = (x>>24) |
((x<<8) & 0x00FF0000) |
((x>>8) & 0x0000FF00) |
(x<<24);
inline void endian_swap(unsigned long long& x)
x = (x>>56) |
((x<<40) & 0x00FF000000000000) |
((x<<24) & 0x0000FF0000000000) |
((x<<8) & 0x000000FF00000000) |
((x>>8) & 0x00000000FF000000) |
((x>>24) & 0x0000000000FF0000) |
((x>>40) & 0x000000000000FF00) |
(x<<56);
要获取/设置一个字中的特定位,位 #0 在字 0 的最低有效位中:
typedef unsigned char block_t;
const unsigned block_bits=8;
inline void set_bit(block_t *d,unsigned i)
unsigned b=i/block_bits;
unsigned bit=i-(block_bits*b); // same as i%b
block_t &bl=d[b];
bl|=(1<<bit); // or bit with 1 (others anded w/ 0)
inline void clear_bit(block_t *d,unsigned i)
unsigned b=i/block_bits;
unsigned bit=i-(block_bits*b); // same as i%b
block_t &bl=d[b];
bl&=(~(1<<bit)); // and bit with 0 (other bits anded w/ 1)
inline void modify_bit(block_t *d,unsigned i,bool val)
if (val) set_bit(d,i) else clear_bit(d,i);
inline bool get_bit(block_t const* d,unsigned i)
unsigned b=i/block_bits;
unsigned bit=i-(block_bits*b); // same as i%b
return d[b]&(1<<bit);
显然,如果位组织规则不同,则必须更改上述内容。
最好使用最广泛的 int CPU 进程,因为 block_t 是最好的(不要忘记更改 block_bits
),除非您使用的库无法解决字节序问题。
【讨论】:
非常感谢!太棒了(+1,但需要 15 个代表)。如果您不介意,请告诉我如何使用您的 set_bit 函数编写一个短的 and or 字符(不要浪费时间填充,我知道该怎么做:))【参考方案2】:我觉得几个宏就够了:
#define set_bit0(buf, i) ((buf)[(i)/8]&=~(1u<<(i)%8))
#define set_bit1(buf, i) ((buf)[(i)/8]|=1<<(i)%8)
#define get_bit(buf, i) ((buf)[(i)/8]>>(i)%8&1)
此外,交换字节顺序可以更快地完成。例如,对于 64 位整数 v,以下操作会交换其字节顺序:
v = ((v & 0x00000000FFFFFFFFLLU) << 32) | (v >> 32);
v = ((v & 0x0000FFFF0000FFFFLLU) << 16) | ((v & 0xFFFF0000FFFF0000LLU) >> 16);
v = ((v & 0x00FF00FF00FF00FFLLU) << 8) | ((v & 0xFF00FF00FF00FF00LLU) >> 8);
【讨论】:
以上是关于DELPHI如何读取一个图片,保存到字节数组中的主要内容,如果未能解决你的问题,请参考以下文章