【问题标题】:How can I efficiently create a display bitmap of palletized colors in Android graphics?如何有效地在 Android 图形中创建调色板颜色的显示位图?
【发布时间】:2022-01-18 23:32:31
【问题描述】:

我的 Android Tide 应用显示来自 .KAP 文件的海图。这种文件格式 使用四位调色板显示系统,仅使用 10 种颜色。我的应用程序解码 将文件格式转换为四位颜色的数组。它显示了这个的一部分 数组显示如下:

for (displayLineNum  = 1; displayLineNum < displayHeight; displayLineNum++)
{   for (displayDotNum = 1; displayDotNum < displayWidth; displayDotNum++)
   {  color = colors [lineIndex-1][dotIndex-1];  
      switch (color)
      {   case 1:  displayCanvas.drawPoint(displayDotNum, displayLineNum, color1); break;
          case 2:  displayCanvas.drawPoint(displayDotNum, displayLineNum, color2); break;
          case 3:  displayCanvas.drawPoint(displayDotNum, displayLineNum, color3); break;
          case 4:  displayCanvas.drawPoint(displayDotNum, displayLineNum, color4); break;
          case 5:  displayCanvas.drawPoint(displayDotNum, displayLineNum, color5); break;
          case 6:  displayCanvas.drawPoint(displayDotNum, displayLineNum, color6); break;
          case 7:  displayCanvas.drawPoint(displayDotNum, displayLineNum, color7); break;
          case 8:  displayCanvas.drawPoint(displayDotNum, displayLineNum, color8); break;
          case 9:  displayCanvas.drawPoint(displayDotNum, displayLineNum, color9); break;
          case 10: displayCanvas.drawPoint(displayDotNum, displayLineNum, color10); break;
          default: displayCanvas.drawPoint(displayDotNum, displayLineNum, color1); break;                    
      }
   }
}
display_area.setImageBitmap(displayBitmap);

预设了 10 种油漆颜色,其中包含显示所需的 RGB 代码。但是每个像素 必须使用 displayCanvas.drawPoint 函数单独绘制。这有效,但 这是狗慢。 我宁愿在显示调用的另一端预先设置调色板代码,然后传入 调色板值代替。这会运行得更快,但我找不到这样做的方法 显示调用可用。 有 Android 函数可以评估图像以获取它的调色板等,但我看不到 如何有效地显示调色板图像。每个像素都被放大了四位 像素代码转换为 16 位 RGB565 代码,以便传入普通位图。能怎样 我可以这样做吗,谢谢。

【问题讨论】:

标签: java android bitmap palette


【解决方案1】:

要定义位图的像素,您不应该使用画布,因为它添加了额外的层并且效率低下。您应该直接处理 Bitmap 对象。有两种方法可以做到这一点。

调用 setPixel

setPixel() 方法允许设置像素的颜色。

例子:

Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
for(int x = 0; x < width; x++)
{
    for(int y = 0; y < height; y++)
        bm.setPixel(x, y, Color.BLUE);
}

调用 createBitmap

为避免大量调用setPixel() 的开销,您可以使用像素颜色构建一个数组并将其直接传递给createBitmap()。这可能是最有效的方式。

例子:

int length = width * height;
int[] colors = new int[length];
for(int i = 0; i < length; i++)
    colors[i] = Color.BLUE;
Bitmap bm = Bitmap.createBitmap(colors, width, height, Bitmap.Config.ARGB_8888);

【讨论】:

  • 谢谢,我会立即尝试#1,我对#2 有疑问。我的颜色是四位调色板代码,而像素是 RGB 565 结构。在方法 #2 中如何处理这种转换。再次感谢
  • #1 更快,当我将颜色预存为整数时。
  • 例如 int color1 = Color.rgb(0,0,0);
  • @user1644002 为什么需要 RGB_565?我会使用 ARGB_8888 来避免不必要的转换。 RGB_565 的唯一优势是减少了内存消耗。
  • Oliver 我使用的图表是高分辨率的。一个较小的大约是 16000 行乘 8500 个点。然而,它们的像素数据是四位托盘。 10 种颜色。 RGB565 像素适用于此。我对此的理想解决方案是以某种方式将调色板放在我调用的系统端。如果可能的话,我想使用四位代码进行绘制,这将是最有效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
相关资源
最近更新 更多