在没有外部库的情况下使用C ++读取图像或pdf

时间:2015-11-18 13:08:27

标签: c++

我在阅读有关Java& amp; C#,C ++是否也可以在不使用外部库的情况下读取image & pdf files? C ++没有byte类型,如Java& C#。那么我们如何完成任务(再次不使用外部库)?

任何人都可以进行小型演示(即用于阅读,复制或编写图像或pdf文件的程序或代码)吗?

3 个答案:

答案 0 :(得分:2)

您可以使用unsigned charchar重新解释为某种整数类型来解析二进制文件格式,如pdf,jpeg等。您可以创建一个缓冲区std::vector<char>并按如下方式读取:

std::vector<char> buffer((
            std::istreambuf_iterator<char>(infile)), // Ensure infile was opened with binary attribute
            (std::istreambuf_iterator<char>()));

相关问题:Reading and writing binary file

答案 1 :(得分:2)

您在二进制模式下打开的文件没有区别,唯一的区别是您应该如何解释从文件中获取的数据。

准备好使用像libjpeg或其他什么。有很多。但是如果你真的想这样做,首先你应该定义合适的结构和常量(见下面的链接),以使代码更方便和可用。然后你只需阅读数据并尝试逐步解释它。下面的代码只是伪代码,我没有编译它。

#include <fstream>

// define header structure
struct jpeg_header 
{ 
  enum class marker: unsigned short { eoi = 0xffd8, sof0 = 0xffc0 ... };
  ...
};

bool is_eoi(unsigned short m) { return jpeg_header::eoi == m; }

jpeg_header read_jpeg_header(const std::string& fn)
{
    std::ifstream inf(fn, std::ifstream::binary);
    if (!inf) 
    {
        throw std::runtime_error("Can't open file: " + fn);
    }

    inf.exceptions(std::ifstream::failbit | std::ifstream::eofbit);

    unsigned short marker = inf.get() << 8;
    marker |= inf.get();
    if (!is_eoi(marker))
    {
        throw std::runtime_error("Invalid jpeg header");
    }
    ...

    jpeg_header header;
    // read further and fill header structure
    ...
    return header;
}

要使用ifstream::read()ifstream::readsome()方法阅读大量数据。这是一个很好的例子http://en.cppreference.com/w/cpp/io/basic_istream/read。 这些函数也比流迭代器更快。它还可以更好地定义从std::runtime_error派生的自己的异常类。

有关您感兴趣的文件格式的详细信息,请点击此处

答案 2 :(得分:1)

拥有像C这样的系统语言将是一个奇怪的世界,在这种情况下,C ++没有类型字节:)。 是的,我接受它,它有奇怪的名字,unsigned char,但它仍然存在:)。

真的只是考虑所有事情的重新开发的规模,以避免字节:)。外围设备,CPU和其他芯片中的许多寄存器,通信,数据协议。这一切都必须重做:)。