- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 C 的新手,这个表示图像的结构让我感到困惑。它用于此 Graphics Gem .
有人可以解释结构的正确实例化和使用,尤其是关于扫描线指针数组吗?
typedef unsigned char Pixel;
typedef struct {
short Hres; /* no. pixels in x direction */
short Vres; /* no. pixels in y direction */
int Size; /* size in bytes */
Pixel *i; /* pixel array */
Pixel *p[1]; /* scanline pointer array; position (x,y) given by image->p[y][x] */
} Image;
此外:在索引二维数组时是否要避免隐式乘法?它不应该是 **p
可以分配给 Vres * sizeof(size_t)
并填充适当的行指针吗?
更新
我想我明白。这个示例 block 有效吗?
int m, n, y, x; /* Vres, Hres, index variables */
Image *image;
image = malloc(sizeof(Image) + (m - 1) * sizeof(Pixel*));
image->Hres = n;
image->Vres = m;
image->Size = m*n*sizeof(Pixel);
image->i = malloc(image->Size);
for (y=0; y<m; y++)
{
image->p[y] = image->i + (y * n);
for (x=0; x<n; x++)
{
image->p[y][x] = 0; /* or imageSource[y][x] */
}
}
/* use image */
free(image->i);
free(image);
最后,在现代计算机(具有大量内存)上,使用这样的扫描线指针数组而不是二维数组是否有意义?在这种情况下,唯一的区别是隐式指针乘法。
最佳答案
Image
结构的最后一个成员 p
用作 C89 灵活数组成员。
灵活数组成员 是 C99 的一项功能,在 C99 之前,人们有时会使用所谓的struct hack 来实现与 C89 类似的行为。
下面是如何动态分配一个只有一个数组元素的Image
结构对象:
Image *bla1, *bla2;
bla1 = malloc(sizeof *bla1);
下面是如何使用 n
数组元素分配结构对象:
bla2 = malloc(sizeof *bla2 + (n - 1) * sizeof bla2->p[0]);
在 p
数组中正确初始化 Pixel *
指针后,您可以像这样访问 Pixel
值:
bla2->p[x][y]
关于 struct hack 的一致性,C99 Rationale 说
the validity of this construct has always been questionable.
而 C 缺陷报告 (DR #051) 是这样说的
The idiom, while common, is not strictly conforming.
关于c - 解释一下这个图像对象中的 "scanline pointer array"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8841291/
我想将像素从 BMP1 复制到 BMP2,但复制的图像出现乱码。为什么? 注意:输入图像为pf8bit; TYPE TPixArray = array[0..4095] of Byte; PP
我想将像素从 BMP1 复制到 BMP2,但复制的图像出现乱码。为什么? 注意:输入图像为pf8bit; TYPE TPixArray = array[0..4095] of Byte; PP
我正在尝试调整 bufio.ScanLines,以便它知道转义的新行 \\n。 输入: line1 \ continues on line2 预期输出: ["line1 continues on li
目前,我循环播放 Canvas.Pixels[]属性并读取 Canvas 上的每个像素以交换红色/蓝色字节(出于特定原因)。然而,每张图片平均需要 2 秒,而且我有超过 8,000 张图片需要转换(一
我是 C 的新手,这个表示图像的结构让我感到困惑。它用于此 Graphics Gem . 有人可以解释结构的正确实例化和使用,尤其是关于扫描线指针数组吗? typedef unsigned char
请您提供引用以帮助我了解基于扫描线的渲染引擎的工作原理吗? 我想实现一个 2D 渲染引擎,它可以支持基于区域的剪裁、基本形状绘制和抗锯齿填充以及基本变换(透视、旋转、缩放)。我需要优先考虑性能而不是质
我需要使用 PyQt4 访问 qimage 对象中的像素数据。 .pixel() 太慢,因此文档说使用 scanline() 方法。 在 C++ 中,我可以获得 scanline() 方法返回的指针,
问题说明:我有一个矩形且均匀间隔的像素图像,其顶点坐标为 (i,j)、(i+1,j)、(i, j+1)、(i+1, j+1) [i=0,。 ..,m-1; j=0,...,n-1] 和顶点坐标为 (x
在使用 32 位 TBitmap 时,我从 Canvas.Pixels 切换到 ScanLine。 然后我将值设置为红色,却发现它显示为蓝色。 知道为什么吗? 以下是代码摘录: procedure T
我正在尝试使用带有 scanLine() 的 Qt 修改图像方法。此方法返回指向给定行数据的指针。我创建了如何读取行 here .现在,我能够像这样读取所有像素的值: QRgb ** pixels;
Delphi 和 C++ Builder 有一个带有 Scanline 属性的 TBitmap 类,该属性返回位图像素的内存。当我在 BMP 文件的十六进制编辑器中查看时,这似乎有所不同。 我正在尝试
我是一名优秀的程序员,十分优秀!