倾斜位图,RGB565 C# 的步幅计算

2023-12-09

我生成的图像有些是倾斜的,有些则不是。

预期结果:(529x22)

enter image description here

实际结果:(529x22)

不要介意不同的图像尺寸,这些是屏幕截图。它们的尺寸均为 529x22。

enter image description here

我正在使用的代码是我刚刚从 SO 的一个问题的答案中得到的。

// some other method
byte[] pixels = new byte[size - 16];
Array.Copy(this.data, offset, pixels, 0, pixels.Length);
this.ByteToImage(w, h, pixels);

// builds the pixels to a image
private Bitmap ByteToImage(int w, int h, byte[] pixels)
{
    var bmp = new Bitmap(w, h, PixelFormat.Format16bppRgb565);

    var BoundsRect = new Rectangle(0, 0, bmp.Width, bmp.Height);
    BitmapData bmpData = bmp.LockBits(BoundsRect,
                                    ImageLockMode.WriteOnly,
                                    bmp.PixelFormat);

    // bytes => not using this because it gives error
    // eg. pixel.Length = 16032, bytes = 16064
    int bytes = bmpData.Stride * bmp.Height;

    Marshal.Copy(pixels, 0, bmpData.Scan0, pixels.Length);
    bmp.UnlockBits(bmpData);

    return bmp;
}

我很困惑,因为有些工作正常,而不是倾斜的。但其他人则有倾斜。我错过了什么?

Update

正如评论和答案中所述,问题是我如何计算步幅。我仍然对如何做到这一点感到困惑,但我尝试了以下方法:

public static void RemovePadding(this Bitmap bitmap)
{
    int bytesPerPixel = Image.GetPixelFormatSize(bitmap.PixelFormat) / 8;

    BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
    var pixels = new byte[bitmapData.Width * bitmapData.Height * bytesPerPixel];

    for (int row = 0; row < bitmapData.Height; row++)
    {
        var dataBeginPointer = IntPtr.Add(bitmapData.Scan0, row * bitmapData.Stride);
        Marshal.Copy(dataBeginPointer, pixels, row * bitmapData.Width * bytesPerPixel, bitmapData.Width * bytesPerPixel);
    }

    Marshal.Copy(pixels, 0, bitmapData.Scan0, pixels.Length);
    bitmap.UnlockBits(bitmapData);
}

但结果是(更倾斜):

enter image description here


这似乎在这里工作:

private Bitmap ByteToImage(int w, int h, byte[] pixels)
{
    var bmp = new Bitmap(w, h, PixelFormat.Format16bppRgb565);
    byte bpp = 2;
    var BoundsRect = new Rectangle(0, 0, bmp.Width, bmp.Height);
    BitmapData bmpData = bmp.LockBits(BoundsRect,
                                    ImageLockMode.WriteOnly,
                                    bmp.PixelFormat);
    // copy line by line:
    for (int y = 0; y < h; y++ )
        Marshal.Copy(pixels, y * w * bpp, bmpData.Scan0 + bmpData.Stride * y, w * bpp);
    bmp.UnlockBits(bmpData);

    return bmp;
}

我使用循环将每行数据放置在正确的位置。数据不包含填充,但目标地址必须包含填充。

因此我们需要乘以数据访问按实际情况width * bytePerPixel但是目标地址 by the Stride,即扫描线的长度,填充到下一个四个字节的倍数。为了width=300 it is stride=300, for width=301 it is stride=304..

仅当没有填充时,即宽度为以下倍数时,一步移动所有像素数据才有效4.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

倾斜位图,RGB565 C# 的步幅计算 的相关文章

随机推荐

  • 使用扩展方法表示的嵌套“from”LINQ 查询

    如何使用扩展方法语法编写此 LINQ 查询 var query from a in sequenceA from b in sequenceB select 为了供您将来参考 此表格的所有问题均由 C 规范第 7 16 节解答 本段回答了您
  • IntelliJ IDEA 终端特殊字符

    我最近开始在 Windows 10 上使用 IntelliJ IDEA Ultimate 并且非常想使用集成终端 但是 我无法让它与特殊字符 例如德语元音变音或 等 一起使用 如果我没有一些以 开头的文件夹 我无法重命名这些文件夹 那不会是
  • 移除边框后,边距超出 div 范围

    源于我网站上边框和边距的实际问题 我制作了这个测试示例 我认为它有点奇怪
  • 如何在Java中拥有多重地图功能?

    我想要具有以下功能MultiMap在 Java 中 提供与 cpp MultiMap 相同的功能 以便我能够拥有多个具有相同值的键 容器中的多个元素可以具有相同的键 我认为这会起作用 TreeMap
  • 从列表值动态创建匿名对象c#

    我有一个字符串列表 或者可以是数组 我想从中动态创建匿名对象 我该怎么做呢 var dataSet new DataSet dataSet ReadXml var dataTable dataSet Tables 0 var dataRow
  • Javascript 可以检测嵌入的 Youtube 视频何时结束吗?

    我有一个包含视频的 div div 的背景有一个假的 播放 按钮 我将其设计为用作播放按钮 而不是 Youtube 的标准视频 播放 按钮 视频最初设置为 display none 我部署了下面的代码 以便当您单击 div 时 div 消失
  • 蒙特卡洛圆周率计算可以用来创造世界纪录吗?

    我有这个随机函数来计算 pi蒙特卡罗风格 max 10000000 format long in 0 tic for k 1 max x rand y rand if sqrt x 2 y 2 lt 1 in in 1 end end to
  • 以编程方式更改 Windows 电源设置

    是否可以更改笔记本电脑合上盖子时的省电行为休眠 待机 关机 to 没做什么来自 NET 框架 Edit 看来 通过将值设置为 待机 并阻止我的应用程序的待机 可以检测到盖子关闭事件 这正是我真正想要的 I found 这个问题它涉及检测盖子
  • 重新启动自己 - 我可以从头开始重新初始化一切吗?

    我有这样的事情 public static final String path static path loadProperties config conf getProperty path public static void main
  • AnyLogic Attractor 奇怪的行为

    我的理解是 节点内的吸引子的容量应该为 1 从某种意义上说 在 3D 动画中 每个吸引子应该只有一个代理 当我运行模型时 我看到同一个吸引子上有两个代理形状 而其他吸引子是空的 这是正常行为吗 有没有办法防止这种情况发生 请注意 这种情况并
  • pgAdmin III 的错误行为?

    我在 pgAdmin 上进行查询时偶然发现了这种奇怪的行为 我已连接到运行 PostgreSQL 9 1 9 的服务器 我有一个名为 messages 的表 其定义如下 ghareh godot psql psql 9 1 9 Type h
  • 错误:“f”的类型与之前的“f”声明存在冲突

    这段代码只是我在实际代码中发现的一种情况 它非常大 所以我给出这个 在此代码中 结构 struct node 未定义 它是在另一个 c 源文件中定义的 我的c源代码 test c 1 include
  • 字节变量的 VBA 溢出错误

    有人可以解释一下为什么当操作的接收者时以下代码会在 VBA 中生成溢出错误c is an Integer Dim a As byte b As Byte Dim c As Integer a 3 b 100 c a b 或者这是否意味着涉及
  • 将整数转换为十六进制

    我只需要将整数转换为十六进制 实际上我有一个字符数组 在其中存储十六进制值 int var var self getValue char hexValues 5 hexValues 0 0x02 hexValues 1 0x04 hexVa
  • Heroku 应用程序和 mysql 的 config.php 代码出错

    我正在使用 Heroku for PHP 我查看了 Heroku 日志 发现 config php 代码中有错误 我正在为我的编码组合制作一个 Spotify 克隆 我使用 xampp apache mysql 成功制作了该组合 但现在我需
  • 在针对顺序运行进行优化的程序上使用 openMP 后没有性能提升

    我已经尽可能地优化了顺序运行的功能 当我使用 openMP 时 我发现性能没有提高 我在1核机器和8核机器上测试了我的程序 性能是一样的 将年份设置为 20 我有1 核 1 秒 8 核 1 秒 将年份设置为 25 我有1 核 40 秒 8
  • 将重复文本文件上传到 SQL Server 的最简单方法

    我有一个制表符分隔的日志文件 其中该日志文件中的新数据需要转储到 sql server 2008 数据库中 我想知道自动化此操作的最佳方法是什么 我可以在管理工作室内使用哪些服务来帮助我 如果你有SQL Server Integration
  • 创建信封时出现 ACCOUNT_LACKS_PERMISSIONS 错误

    我在创建信封时收到此错误 DocuSign eSign Client ApiException Error calling CreateEnvelope errorCode ACCOUNT LACKS PERMISSIONS message
  • HTML 中的 PHP 不起作用

    我只是想知道为什么这个 HTML 文件不显示任何内容 我在网络服务器上运行它 文件名是index php 我已经修复了 您应该确保提供以下信息 PHP 在您的服务器上 文件必须以 php 结尾 使用开放标签
  • 倾斜位图,RGB565 C# 的步幅计算

    我生成的图像有些是倾斜的 有些则不是 预期结果 529x22 实际结果 529x22 不要介意不同的图像尺寸 这些是屏幕截图 它们的尺寸均为 529x22 我正在使用的代码是我刚刚从 SO 的一个问题的答案中得到的 some other m