相关疑难解决方法(0)

什么是最简单的RGB图像格式?

我在C上进行物理实验,Young的干涉实验,我制作了一个打印到file大量像素的程序:

for (i=0; i < width*width; i++)
{
    fwrite(hue(raster_matrix[i]), 1, 3, file);
}
Run Code Online (Sandbox Code Playgroud)

其中hue,当给定值[0..255]时,给出char *3个字节,R,G,B.

我想在我的图像文件中放一个最小的标题,以使这个原始文件成为有效的图像文件.

更简洁:切换自:

offset
0000 : height * width : data } my data, 24bit RGB pixels
Run Code Online (Sandbox Code Playgroud)

offset
0000 : dword : magic        \
     : /* ?? */              \
0012 : dword : height         } Header <--> common image file
0016 : dword : width         /
     : /* ?? */             /
0040 : height * …
Run Code Online (Sandbox Code Playgroud)

c image raster

36
推荐指数
3
解决办法
2万
查看次数

为什么ofstream在0x0A之前插入一个0x​​0D字节?

我正在使用C++输出一个无符号字符数组,ofstream fout("filename"); 但它会产生一个虚假字符.这是导致问题的代码的一部分:

for(int i = 0; i < 12; i++)
fout << DChuffTable[i];
Run Code Online (Sandbox Code Playgroud)

这是数组的定义:

unsigned char DChuffTable[12] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B};
Run Code Online (Sandbox Code Playgroud)

在输出文件,我收到了虚假0x0D之间0x090x0A.我在调试模式中检查了数组,然后才开始打印并且没有更改.请告诉我你对这个问题的看法.

c++ ofstream

8
推荐指数
1
解决办法
3700
查看次数

如何在C++中将yuy2转换为BITMAP

我正在使用安全摄像头DLL从相机中检索图像.DLL调用我的程序的函数传递图像缓冲区作为参数,但图像是yuy2格式.我需要将此缓冲区转换为RGB,但我尝试了在Internet上找到的每个公式都没有成功.我尝试的每个例子(包括http://msdn.microsoft.com/en-us/library/aa904813(VS.80).aspx#yuvformats_2)都给我错误的颜色.

我只能使用像素的Y分量将缓冲区转换为BW图像,但我真的需要彩色图片.我调试(仅汇编)在屏幕上显示图像的DLL,它使用DirectDraw来执行此操作.

c++ camera directshow bitmap

7
推荐指数
1
解决办法
9040
查看次数

C++:将整数的文本文件转换为BMP格式的位图图像文件

我有一个文本文件由包含2D矩阵的矩阵库保存,如下所示:

1 0 0 
6 0 4
0 1 1
Run Code Online (Sandbox Code Playgroud)

其中每个数字用彩色像素表示.我正在寻找一些关于我如何解决这个问题的见解.如果需要更多信息,请不要犹豫.

编辑:我尝试的另一种方法是:fwrite(&intmatrix, size,1, bmp_ptr);我传入矩阵指针,它似乎没有输出可读的BMP文件.的值sizerows*cols当然的,和矩阵的类型是arma::Mat<int>作为从犰狳线性代数库的矩阵.

编辑II:阅读表明我的大小应该是行*cols*4给定行的大小如果我没有弄错,任何关于这一点的指导也会很好.

c++ image bmp armadillo

7
推荐指数
3
解决办法
1万
查看次数

如何在不使用剪贴板的情况下复制图像?

问题:我有以下代码从网络摄像头捕获图像.

我的问题是这部分:

SendMessage(hCaptureWnd, WM_CAP_COPY, 0, 0);                    // copy it to the clipboard
Run Code Online (Sandbox Code Playgroud)

它的作用是将图像从窗口复制到剪贴板,然后从中创建一个字节数组.

它可以工作 - 只要你在程序运行时不使用剪贴板.
问题是,这对我自己来说甚至都不起作用,因为我有时复制一些东西,而Visual Studio需要很长时间才能开始调试Web应用程序,然后崩溃.

所以我的问题是:
如何在不使用剪贴板的情况下获取图像?或者更具体地说,如何将hCaptureWnd转换为System.Drawing.Image?


- 编辑:
我错过了说"没有创建文件,我想要一个字节数组".
它是一个Web应用程序,因此运行应用程序的用户不应具有对文件系统的写访问权限(仅写入文件进行临时测试)...
- 结束编辑:


/// <summary>
/// Captures a frame from the webcam and returns the byte array associated
/// with the captured image
/// </summary>
/// <param name="connectDelay">number of milliseconds to wait between connect 
/// and capture - necessary for some cameras that take a while to 'warm up'</param>
/// <returns>byte array representing a bitmp or null …
Run Code Online (Sandbox Code Playgroud)

c# video webcam winapi vfw

6
推荐指数
2
解决办法
4664
查看次数

在C中加载8bpp灰度BMP

我无法理解BMP格式,我知道它应该很简单,但不知怎的,我错过了一些东西.我认为它是2个标题后跟定义图像的实际字节,但数字不加起来.

例如,我只是尝试将此BMP文件加载到内存(640x480 8bpp灰度)中,然后将其写回另一个文件.据我所知,有两种不同的标题BITMAPFILEHEADER和BITMAPINFOHEADER.BITMAPFILEHEADER是14个字节,BITMAPINFOHEADER是40个字节(这个取决于BMP,我怎么能告诉那是另一个故事).无论如何,BITMAPFILEHEADER通过其参数bfOffBits表示位图位从偏移1078开始.这意味着有1024(1078 - (40 + 14))个其他字节,携带更多信息.那些字节是什么,我怎么读它们,这就是问题所在.或者是否有更正确的方法来加载BMP并将其写入磁盘?

这里参考的是我使用的代码(我在windows btw下做了所有这些.)

#include <windows.h>
#include <iostream>
#include <stdio.h>


HANDLE hfile;
DWORD written;

BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;

int main()
    hfile = CreateFile("image.bmp",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
ReadFile(hfile,&bfh,sizeof(bfh),&written,NULL);

ReadFile(hfile,&bih,sizeof(bih),&written,NULL);

int imagesize = bih.biWidth * bih.biHeight;

image = (unsigned char*) malloc(imagesize);

ReadFile(hfile,image,imagesize*sizeof(char),&written,NULL);

CloseHandle(hfile);
Run Code Online (Sandbox Code Playgroud)

我正在做与写入文件完全相反的事情,

hfile = CreateFile("imageout.bmp",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

WriteFile(hfile,&bfh,sizeof(bfh),&written,NULL);
WriteFile(hfile,&bih,sizeof(bih),&written,NULL);
WriteFile(hfile,image,imagesize*sizeof(char),&written,NULL);

CloseHandle(hfile);
Run Code Online (Sandbox Code Playgroud)

编辑---解决了

好的,所以我终于做对了,毕竟它并不是很复杂.正如Viktor所指出的,这1024个字节代表了调色板.

我在代码中添加了以下内容:

RGBQUAD palette[256];
// [...] previous declarations [...] int main() [...] then read two headers
ReadFile(hfile,palette,sizeof(palette),&written,NULL);
Run Code Online (Sandbox Code Playgroud)

然后当我回信时,我添加了以下内容,

WriteFile(hfile,palette,sizeof(palette),&written,NULL);
Run Code Online (Sandbox Code Playgroud)

c windows image bmp

4
推荐指数
1
解决办法
2642
查看次数

C++从数组中创建png /位图

所以我发现这个关于我的问题的链接,但它是针对c#

从字节数组创建PNG

我有一个变量int数组.我现在称它为"pix []",它可以是3到256之间的任何大小,之后可能更大.

我现在想做的是将其转换为像素图像.我仍然是一个noobin c ++,请原谅我.我试图下载一些使libpng更容易使用的库,但它们似乎没有工作(ubuntu,code :: blocks)所以我有以下问题:

1)如何创建新的位图(哪个libaries,哪个命令)?

2)如何填写"pix []"的信息?

3)我该如何保存?

如果它是一个问题的转贴我也很高兴链接;)

这是我到目前为止所做的工作,谢谢你的帮助.

int main(){
 FILE *imageFile;
 int x,y,pixel,height=2,width=3;

 imageFile=fopen("image.pgm","wb");
 if(imageFile==NULL){
  perror("ERROR: Cannot open output file");
  exit(EXIT_FAILURE);
 }

 fprintf(imageFile,"P3\n");           // P3 filetype
 fprintf(imageFile,"%d %d\n",width,height);   // dimensions
 fprintf(imageFile,"255\n");          // Max pixel
  int pix[100] {200,200,200, 100,100,100, 0,0,0, 255,0,0, 0,255,0, 0,0,255};


       fwrite(pix,1,18,imageFile);


fclose(imageFile);
}
Run Code Online (Sandbox Code Playgroud)

我还没有完全明白它的作用.我可以打开输出图像,但它不是数组的正确表示.

如果我改变了一些东西,例如制作一个二维数组,那么图像查看器会告诉我"预期的整数"并且不会向我显示图像.

到现在为止还挺好.因为我在图像之前有数组我创建了一个函数aufrunden来舍入到下一个int数,因为我想创建一个方形图像.

int aufrunden (double h)
{
int i =h;
if (h-i == 0)
  {
  return i;
  }
else
  {
  i = h+1;
  return …
Run Code Online (Sandbox Code Playgroud)

c++ arrays png bitmap

4
推荐指数
4
解决办法
2万
查看次数

从无符号字符缓冲区创建图像

我正在使用称为Secugen Pro 20的设备捕获指纹,它拥有自己的Linux SDK,并且我想捕获指纹图像并将其保存为任何图像格式

他们有这个 typedef unsigned char BYTE;

我声明了我的imageBuffer

BYTE *CurrentImageBuffer;

然后我使用设备规格为其分配内存

CurrentImageBuffer = malloc(device_info.ImageWidth*device_info.ImageHeight);

在我的代码的某个点上,我捕获图像并将其CurrentImageBuffer作为参数传递给捕获函数:

SGFPM_GetImageEx(m_hFPM, CurrentImageBuffer, GET_IMAGE_TIMEOUT, NULL, GET_IMAGE_DESIRED_QUALITY)

那就是该行代码之后变量的外观(我可以确认它抓住了一根手指):

currentImageBuffer表示形式

我只是不明白如何从该缓冲区继续创建图像,因为它看起来不像ByteArray

我什至不知道那是从中获取我的图像的正确地方,但是那看起来像正确的地方,因为它有缓冲区,对吧?

OBS:我是C新手

c linux image fingerprint

4
推荐指数
1
解决办法
263
查看次数

将图像转换为索引的2位灰度BMP

首先,我的问题与我如何将图像转换为每个像素2位不同?不幸的是,它的解决方案不适用于我的情况...

我需要将图像转换为每像素2位灰度BMP格式。样本图像具有以下属性:

Color Model: RGB
Depth: 4
Is Indexed: 1
Dimension: 800x600
Size: 240,070 bytes (4 bits per pixel but only last 2 bits are used to identify the gray scales as 0/1/2/3 in decimal or 0000/0001/0010/0011 in binary, plus 70 bytes BMP metadata or whatever)
Run Code Online (Sandbox Code Playgroud)

样品

样本BMP图像开始部分的十六进制值: 样本图像的头部

3代表图像开始处的白色像素。再往下是代表黑色,深灰色和浅灰色的0、1和2: 样本图像的中间部分

使用以下命令,

convert pic.png -colorspace gray +matte -depth 2 out.bmp
Run Code Online (Sandbox Code Playgroud)

我可以获得视觉上正确的4级灰度图像,但是每个像素的深度或大小错误:

Color Model: RGB
Depth: 8 (expect 4)
Dimension: 800x504
Size: 1,209,738 bytes (something like 3 bytes per pixel, …
Run Code Online (Sandbox Code Playgroud)

imagemagick bmp grayscale

3
推荐指数
1
解决办法
2万
查看次数

如何使用文本中的自定义字体创建 PNG 图像

我正在用 C 编写一个程序,它将文本作为用户输入,并生成一个png图像作为输出,并使用以自定义字体呈现的相同文本。

我知道 C 没有用于图形的标准库,所以我试图确定对初学者开发人员来说最有效的库是什么。

我的操作系统是 Ubuntu,我想制作 CLI 工具

例如https://github.com/matsuyoshi30/germanium

c linux graphics png image

2
推荐指数
1
解决办法
133
查看次数

从RGB值数组生成BMP文件

我想从已存储的RGB值生成BMP文件.

我在OS X上编程,所以我不能使用预定义的BMP头.

我尝试过以下操作,但预览说文件已损坏.

void bitmap(Image * image) {

typedef struct                       /**** BMP file header structure ****/
{
    unsigned short bfType;           /* Magic number for file */
    unsigned int   bfSize;           /* Size of file */
    unsigned short bfReserved1;      /* Reserved */
    unsigned short bfReserved2;      /* ... */
    unsigned int   bfOffBits;        /* Offset to bitmap data */
} BITMAPFILEHEADER;

typedef struct                       /**** BMP file info structure ****/
{
    unsigned int   biSize;           /* Size of info header */
    int            biWidth;          /* Width …
Run Code Online (Sandbox Code Playgroud)

c++ bmp

1
推荐指数
1
解决办法
5494
查看次数