当我打开时ppm,UI向我显示了几个可升级的包.不幸的是,我无法通过键入Ctrla或单击第一个元素来选择它们,按住Shift然后选择列表中的最后一个元素.
我是否真的需要遍历所有元素并+按键才能选择它们?拒绝相信.
尝试在PPM图像上进行基本的隐写术.
我已完成基本算法.读入文件,检查标题以P6开头,获取图像的宽度和高度,以及像素数据.
我需要总共有四种方法:ReadPPM,WritePPM,WriteMsg和ReadMsg.
我有ReadImg和WriteImg方法,但我遇到的是我的WriteMsg方法.这是基本的隐写术,只是将字符串的每个位写入每个字节的最后一位.假设前8个字节包含被隐藏的字符串的大小,然后每个字节开始隐藏的消息.
我的想法是创建一个大型数组,其中包含字符串大小的二进制代码,然后是字符串本身的二进制代码.我只想弄清楚如何将该数组添加到图像中的每个字节.
任何帮助深表感谢.这是我目前的代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct {
unsigned char red,green,blue;
} PPMPixel;
typedef struct {
int x, y;
PPMPixel *data;
} PPMImage;
#define CREATOR "RPFELGUEIRAS"
#define RGB_COMPONENT_COLOR 255
static PPMImage *readPPM(const char *filename)
{
char buff[16];
PPMImage *img;
FILE *fp;
int c, rgb_comp_color;
//open PPM file for reading
fp = fopen(filename, "rb");
if (!fp) {
fprintf(stderr, "Unable to open file '%s'\n", filename);
exit(1);
}
//read image format
if (!fgets(buff, sizeof(buff), fp)) {
perror(filename);
exit(1);
}
//check …Run Code Online (Sandbox Code Playgroud) 我最近在Windows 8.1上安装了ActivePerl 18(v5.18.2)64位,并且ppm一直产生相同的错误:DBD :: SQLite :: db selectrow_array失败:数据库磁盘映像格式错误.
这是我的命令提示符的一个exerpt:
ppm install Win32-Console-ANSI
ppm install failed: DBD::SQLite::db selectrow_array failed: database disk image is malformed
ppm rep
ppm rep failed: DBD::SQLite::db selectrow_array failed: database disk image is malformed
ppm
ppm gui failed: DBD::SQLite::db selectrow_array failed: database disk image is malformed
Run Code Online (Sandbox Code Playgroud) 我正在尝试运行一些ppm命令,但我没有走得太远.我正在Ubuntu 12.04.1 LTS上
天蓝 VM.
> $ sudo apt-get install ppm
Reading package lists... Done
Building dependency tree
Reading state information... Done
ppm is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 7 not upgraded.
Run Code Online (Sandbox Code Playgroud)
> $ ppm repo add ASSP2 "http://downloads.sourceforge.net/project/assp/ASSP V2 multithreading/packages/"
No command 'ppm' found, but there are 16 similar ones
ppm: command not found
Run Code Online (Sandbox Code Playgroud)
> $ perl -v
This is perl 5, version 14, subversion 2 (v5.14.2) …Run Code Online (Sandbox Code Playgroud) 这是相当基本的,我可能错过了一些非常明显的东西,但是这个让我有点难过.基本上,假设我试图将整个PPM图像变为红色(这实际上并不是我正在做的事情,但为了排除故障,我们将继续这样做).我有一个结构,我用来存储像素值.
typedef struct pixel_type
{
unsigned char r;
unsigned char g;
unsigned char b;
} pixel_t;
Run Code Online (Sandbox Code Playgroud)
我用来指向该结构的指针是"缓冲区".
pixel_t *buffer;
Run Code Online (Sandbox Code Playgroud)
我也分配了我需要的空间量(图像的宽度*图像的高度*像素值的数量[3])
buffer = malloc(WIDTH*HEIGHT*sizeof(pixel_t));
Run Code Online (Sandbox Code Playgroud)
然后我有一个'for'循环,我用它来逐步通过缓冲区指针并将每个像素值转换为红色.
int i;
for (i=0;i<(WIDTH*HEIGHT);i++){
buffer->r=255;
buffer->g=0;
buffer->b=0;
buffer++;} //this part appears to be the problem
Run Code Online (Sandbox Code Playgroud)
这里的问题是输出只是一个黑色图像,顶部有几个垃圾像素.我也尝试取出'buffer ++',并且第一个像素似乎被转换为红色而没有任何问题.但是,当我把它重新放入时,没有像素是红色的(甚至不是第一个).
我不确定我错过了什么.我知道当你创建一个指针时,你可以直接通过在末尾用'++'做指针(没有*取消引用)来逐步指向指针的下一个地址.然而,这似乎是个问题.有人能告诉我我做错了什么吗?
再次感谢,
奥斯汀
该程序我正在创建一个隐写术程序,通过将随机红色像素值更改为 ascii 字符来隐藏 .ppm 图像中的秘密消息。该程序基于 stackoverflow 上用于读取和写入 ppm 图像的代码(读取 PPM 文件并将其存储在数组中;用 C 编码),所有其他代码都是我自己的工作。我已经完成了所有必要的功能,例如写入、读取、编码和解码文件,但我正在努力掌握 fwrite 功能。
当前,当程序对图像进行编码时,它会在 .ppm 中将其转换为结构中的 rgb 值。然后它通过将红色值编辑为 ascii 字符来隐藏秘密消息。将图像“打印”到文件时会出现问题。程序完成后,生成的图像大约是应打印图像的 90%。示例如下: 未完成图像示例
我已经检查过它是否通过打印所有 rgb 值来存储所有值都被正确存储,并且确实如此。(使用 showPPM 方法)。是否没有足够的内存来写入图像?写入功能的图像是否过大?这些是我的猜测。
关于我应该如何更改 writePPM 函数以便我将 100% 的图像正确打印到文件的任何信息都会很棒。
这是下面的代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<time.h>
typedef struct {
unsigned char red,green,blue;
} PPMPixel;
typedef struct {
int x, y;
PPMPixel *data;
} PPMImage;
void writePPM(PPMImage *img);
static PPMImage *getPPM(const char *filename)
{
char buff[16];
PPMImage *img;
FILE *fp;
int c, rgb_comp_color;
//open PPM …Run Code Online (Sandbox Code Playgroud) 尝试以我知道的方式读取和写入PPM图像文件(.ppm):
std::istream& operator >>(std::istream &inputStream, PPMObject &other)
{
inputStream.seekg(0, ios::end);
int size = inputStream.tellg();
inputStream.seekg(0, ios::beg);
other.m_Ptr = new char[size];
while (inputStream >> other.m_Ptr >> other.width >> other.height >> other.maxColVal)
{
other.magicNum = (string) other.m_Ptr;
}
return inputStream;
}
Run Code Online (Sandbox Code Playgroud)
我的值对应于实际文件.所以我乐意尝试写数据:
std::ostream& operator <<(std::ostream &outputStream, const PPMObject &other)
{
outputStream << "P6" << " "
<< other.width << " "
<< other.height << " "
<< other.maxColVal << " "
;
outputStream << other.m_Ptr;
return outputStream;
}
Run Code Online (Sandbox Code Playgroud)
我确保使用std :: ios :: …