标签: pixelformat

如何在RenderTargetBitmap中使用PixelFormats.IndexedX?

我期待呈现DrawingVisual(在示例性视觉)到使用位图RenderTargetBitmap的观点来设置此位图作为背景的Canvas,如下:

var bmp = new RenderTargetBitmap(2000, 50, 120, 96, PixelFormats.Indexed2);
bmp.Render(visual);
var brush = new ImageBrush(bmp) { Stretch = Stretch.Fill };
Canvas.Background = brush;
Run Code Online (Sandbox Code Playgroud)

当使用PixelFormats.Default最后一个参数时RenderTargetBitmap,图像按预期呈现.然而,当我选择PixelFormats.Indexed2(或任何的PixelFormats.IndexedX),我的代码似乎退出方法没有例外,该bmp.Render线不会被调用,因此在图像上没有显示Canvas.

如何使用IndexedX像素格式RenderTargetBitmap?或者还有其他方法可以减少图像的内存占用量吗?它只使用三种颜色,所以使用调色板而不是32位RGB似乎是要走的路.

wpf pixelformat rendertargetbitmap

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

Open GL - 为什么像素值采用 ABGR 以及如何在 RGBA 中使用它们

我有一些用于加载纹理的代码,其中我使用 DevIL 加载图像,然后 OpenGL 从像素创建纹理。这段代码工作正常,纹理显示正确,这一切都很好。

除此之外,我还可以从程序内创建一个数组来创建纹理或直接更改纹理的像素。我的问题在于:处理像素时,它们的格式似乎是 ABGR 而不是我希望的 RGBA。

我偶然发现了这个问题,它指的是在 glTexImage2D 函数中传递的格式:

(...) 如果你有 GL_RGBA 和 GL_UNSIGNED_INT_8_8_8_8,这意味着像素存储在 32 位整数中,并且颜色按照这样的整数中的逻辑顺序 RGBA 排列,例如,红色位于高位字节,而颜色位于高位字节。 alpha 位于低位字节。但如果机器是小尾数法(如 Intel CPU),则内存中的实际顺序是 ABGR。而 GL_RGBA 和 GL_UNSIGNED_BYTE 将以 RGBA 顺序存储字节,无论计算机是小端还是大端。(...)

事实上我有一个英特尔CPU。图像按照现在的方式加载得很好,我实际上使用 GL_RGBA 模式和 GL_UNSIGNED_BYTE 类型。

GLuint makeTexture( const GLuint* pixels, GLuint width, GLuint height ) {

    GLuint texture = 0;

    glGenTextures( 1, &texture );

    glBindTexture( GL_TEXTURE_2D, texture );

    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels );

    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl pixelformat

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

Linux 帧缓冲区像素位域通用实现

我正在编写一个小型库来与 Linux 的帧缓冲区抽象接口。我的所有显卡都使用相同的像素格式(每个通道一个八位字节,四个通道,BGRA 排序),因此到目前为止,库仅采用这种格式。但是,如果我希望该库在任何 Linux 帧缓冲区上工作,帧缓冲区 API 提供了我必须使用的像素格式数据。你不需要知道帧缓冲区是如何工作的来回答这个问题(我希望),只需要一些我不熟悉的小技巧。这是我的标题中提供的像素格式信息:

/* Interpretation of offset for color fields: All offsets are from the right,
 * inside a "pixel" value, which is exactly 'bits_per_pixel' wide (means: you
 * can use the offset as right argument to <<). A pixel afterwards is a bit
 * stream and is written to video memory as that unmodified.
 *
 * For pseudocolor: offset and length should be the same for all color
 * components. Offset specifies the position …
Run Code Online (Sandbox Code Playgroud)

c linux bit-manipulation framebuffer pixelformat

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

图像读取器内将帧从 YUV_420_888 格式错误转换为 NV21

我配置了代码,以便使用对象和其余众所周知的APIYUV_420_888从设备的摄像头获取帧流。现在我需要将这些帧转换为像素格式并调用本机函数,该函数期望这种格式的帧执行某些计算。这是我在图像读取器回调中使用的代码,用于重新排列帧的字节:imageReadercamera2NV21

        ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader mReader) {
                Image image = null;
                image = mReader.acquireLatestImage();
                if (image == null) {
                    return;
                }                           

                byte[] bytes = convertYUV420ToNV21(image);

                nativeVideoFrame(bytes);
                image.close();   
            }
        };

private byte[] convertYUV420ToNV21(Image imgYUV420) {

    byte[] rez;

    ByteBuffer buffer0 = imgYUV420.getPlanes()[0].getBuffer();
    ByteBuffer buffer1 = imgYUV420.getPlanes()[1].getBuffer();
    ByteBuffer buffer2 = imgYUV420.getPlanes()[2].getBuffer();

    int buffer0_size = buffer0.remaining();
    int buffer1_size = buffer1.remaining();
    int buffer2_size = buffer2.remaining();

    byte[] buffer0_byte = new byte[buffer0_size];
    byte[] buffer1_byte = new …
Run Code Online (Sandbox Code Playgroud)

android yuv pixelformat android-camera2

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

如何在 Direct2D 中创建透明位图

我需要使用 Direct2D 创建一个透明位图,并使用我的设备上下文在其上绘制。

ID2D1DeviceContext1* d2dContext = ...
ID2D1Bitmap* pBitmap;

d2dContext->CreateBitmap(
    bitmapSize,
    nullptr,
    0,
    D2D1::BitmapProperties1(
        D2D1_BITMAP_OPTIONS_TARGET,
        D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED),
        dpiX, dpiY),
    &pBitmap);

d2dContext->BeginDraw();
d2dContext->SetTarget(pBitmap);
d2dContext->Clear(D2D1::ColorF(0, 0));
d2dContext->DrawLine(...);
hr = d2dContext->EndDraw();
Run Code Online (Sandbox Code Playgroud)

不幸的是我无法创建任何透明位图。我尝试了几种像素格式组合,包括D2D1_ALPHA_MODE_STRAIGHT,但没有成功。

有什么解决办法吗?

c++ directx transparency direct2d pixelformat

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

C#为什么Bitmap.Save会忽略Bitmap的PixelFormat?

我需要处理和保存原始bpp中的图像(1 - 对于BnW,8 - 对于灰色,24 - 颜色).处理后我总是有24bpp(由于使用Aforge.Net处理).我将原始bpp传递给保存功能,我正在使用下一个代码进行保存:

private static Bitmap changePixelFormat(Bitmap input, PixelFormat format)
    {
        Bitmap retval = new Bitmap(input.Width, input.Height, format);
        retval.SetResolution(input.HorizontalResolution, input.VerticalResolution);
        Graphics g = Graphics.FromImage(retval);
        g.DrawImage(input, 0, 0);
        g.Dispose();
        return retval;
    }
Run Code Online (Sandbox Code Playgroud)

当我通过时:

PixelFormat.Format8bppIndexed
Run Code Online (Sandbox Code Playgroud)

我得到一个例外:"图形对象无法在索引像素格式中创建图像":

Graphics g = Graphics.FromImage(retval);
Run Code Online (Sandbox Code Playgroud)

我已经尝试了下一个代码:

Bitmap s = new Bitmap("gray.jpg");
        Bitmap NewPicture = s.Clone(new Rectangle(0, 0, s.Width, s.Height),                   PixelFormat.Format8bppIndexed);
Run Code Online (Sandbox Code Playgroud)

在此"NewImage"之后有PixelFormat 8bppIndexed,但是当我保存NewImage时:

NewPicture.Save("hello.jpg", ImageFormat.Jpeg);
Run Code Online (Sandbox Code Playgroud)

hello.jpg有24bpp.

我需要保留原始图像的bpp和图像格式.

为什么Bitmap.Save会忽略Bitmap的PixelFormat?

================================================== =====

谢谢大家,我找到了一个解决方案:http: //freeimage.sourceforge.net/license.html

借助这个免费库,可以将图像(尤其是JPEG)保存到8位灰度级.

c# bitmap image-processing pixelformat

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

检查图像是否有颜色

我想弄清楚图像是否有颜色.在这个 StackOverflow问题上,有一个回复说我应该检查PixelFormat枚举Image.不幸的是,回复对我来说不是很清楚.检查它是否与彩色图像image.PixelFormat不同是否安全PixelFormat.Format16bppGrayScale?枚举的其他值怎么样?MSDN文档不是很清楚......

.net c# gdi+ image pixelformat

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

选择视频编码的像素格式有何影响?

我有一个工具可以将各种格式的视频转换为基线配置文件中的 mp4。它在底层使用 ffmpeg。该配置文件被明确指定为基线。但未指定像素格式。有一次我偶然发现avi容器中的视频格式如下:

Stream #0:0: Video: dvvideo, yuv411p, 720x480 [SAR 32:27 DAR 16:9], 25000 kb/s, 29.97 fps, 29.97 tbr, 29.97 tbn, 29.97 tbc

当我尝试转换它时,它说默认情况下它将选择yuv422p像素格式。然后它说基线配置文件与该像素格式不兼容。如果我明确指定像素格式,yuv420p那么它就可以正常工作。

将所有视频转换为相同的像素格式会产生什么影响?不同像素格式之间的实际区别是什么?基线配置文件的其他像素格式是否不同?

video ffmpeg yuv pixelformat video-conversion

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

如何将bayerrg8格式图像转换为rgb图像

我有一台可以提供拜耳 RG8 格式图像的相机。

我正在使用 skimage 处理图像,但我找不到将 Bayer RG8 格式转换为标准 RGB(以在屏幕上显示)的方法。

有什么办法可以用 skimage 做到这一点吗?

我确实找到了 opencv 转换的参考,但我试图避免在我的应用程序中包含 opencv (除非绝对必要)。

pixelformat scikit-image

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

SIMD 将 12 位字段解包为 16 位

我需要从每个 24 位输入中解压缩两个 16 位值。(3 字节 -> 4 字节)。我已经按照 na\xc3\xafve 的方式做到了,但我对性能不满意。

\n

例如,InBuffer 是__m128i

\n
value1 = (uint16_t)InBuffer[0:11]        // bit-ranges\nvalue2 = (uint16_t)InBuffer[12:24]\n\nvalue3 = (uint16_t)InBuffer[25:36] \nvalue4 = (uint16_t)InBuffer[37:48]\n... for all the 128 bits.\n
Run Code Online (Sandbox Code Playgroud)\n

解包后,值应存储在 __m256i 变量中。

\n

我该如何使用 AVX2 解决这个问题?可能使用解包/洗牌/排列内在函数?

\n

c avx pixelformat bit-fields avx2

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

压缩 12 位整数数组的 SIMD 位重新排序

我有一个大的紧密封装的 12 位整数数组,采用以下重复位封装模式:(其中A n /B n中的n表示位数,A 和 B 是数组中的前两个 12 位整数)

|           byte0           |            byte1          |           byte2         | etc..
| A11 A10 A9 A8 A7 A6 A5 A4 | B11 B10 B9 B8 B7 B6 B5 B4 | B3 B2 B1 B0 A3 A2 A1 A0 | etc..
Run Code Online (Sandbox Code Playgroud)

我将其重新排序为以下模式:

|           byte0           |            byte1          |           byte2         | etc..
| A11 A10 A9 A8 A7 A6 A5 A4 | A3 A2 A1 A0 B11 B10 B9 B8 | B7 B6 …
Run Code Online (Sandbox Code Playgroud)

c simd pixelformat neon avx2

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

从 int 数组创建 Javafx 图像

我拼命地试图从具有整数值的像素数组创建一个图像。不管是用WritableImage还是Canvas,总是说PixelFormat是BYTE_RGB或者BYTE_BGRA_PRE,所以我只好用byte-array了。

有什么方法可以将 PixelFormat 更改为<IntBuffer>或者我是否忽略了另一个能够具有PixelFormat<IntBuffer>?

javafx pixels pixelformat

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