我有一些 4k 影像(.png,3840p*2160p),我想在其中替換大約 2500 種顏色。
我有一個包含 2500 種當前顏色的 Color[] 陣列和一個包含 2500 種始終不同的新顏色的陣列。
目前我有一個 System.Drawing.Imaging.ColorMap 陣列,我在其中推送 2500 個單個 ColorMap 物件,它們各自的 OldColor 和 NewColor 屬性設定為我其他陣列中的每個值。
然后我可以執行以下操作:
[...]
ImageAttributes imageAttributes = new ImageAttributes();
imageAttributes.SetRemapTable(colorMapArray);
Rectangle rectangle = new Rectangle(0, 0, myImage.Width, myImage.Height);
Graphics graphics = Graphics.FromImage(myImage);
graphics.DrawImage(myImage, rectangle, 0, 0, myImage.Width, myImage.Height, GraphicsUnit.Pixel, imageAttributes);
myImage.Save("myImageWithReplacedColors.png");
這在技術上有效并用它們的新值替換了我所有的顏色,但它非常非常慢。(最多需要幾秒鐘)
我有哪些選擇可以加快這個程序?..或其他方式獲得相同的結果?我一直在尋找幾天,但還沒有真正找到任何東西
如果這有幫助,4k 影像和應替換的具有當前顏色的陣列始終相同。所以我可以將它們特殊保存,例如作為位元組陣列(?)
uj5u.com熱心網友回復:
您可以先根據這篇文章提取影像的像素。然后,您可以使用 將Color物件轉換為簡單的 32 位整數((int)color.R << 16) | ((int)color.G << 8) | color.B。然后您可以構建一個Dictionary<int, int>來映射字典值。然后,您可以將位元組轉換為int像素,使用字典轉換值并將整數轉換回影像每個像素的一些位元組。這個程序可以使用多個執行緒并行化,因為Dictionary它是執行緒安全的(只要你只從執行緒中讀取它)。
或者,您可以使用基本int[256*256*256] 查找表而不是Dictionary<int, int>類。如果前者適合 CPU 快取,它會更快,但大多數現代處理器還沒有這么大的 L3 快取(即 16 MiB)。它可以更快,因為只有很少的快取行(最多 2500 個)加載到快取中,并且它們可能很好地分布在記憶體中(請參閱快取關聯性)。
現代主流處理器(例如 x86-64 處理器)應該能夠在幾分之一秒內完成此操作:對于主流 PC,通常在 0.01 到 0.3 秒之間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435995.html
標籤:表现 位图 系统绘图 颜色图 system.drawing.imaging
下一篇:以串列效率方式搜索(嵌套lis)
