根據Silverlight中的msdn,圖像可以在其圖像/媒體顯示區域(基本上是它們的高度和寬度)上進行測試。圖像文件中的透明/完整alpha像素仍然可以測試。 我的問題是現在,在Silverlight中的圖像中只有非透明像素點測試的最佳方式是什麼?在Silverlight的圖像中只有非透明像素點擊可測試的最佳方式是什麼?
2
A
回答
1
這是不可能使用正常的命中測試功能,因爲你發現與MSDN的參考。
我唯一的想法是將您的圖像轉換爲WritableBitmap類,並使用Pixels屬性進行alpha通道命中測試。我實際上沒有嘗試過這一點,我無法想象這是微不足道的,但它應該在理論上起作用。
像素是一個大的int [],每個整數的4個字節對應ARGB。它使用預乘ARGB32格式,因此如果除了完整255之外還有任何alpha透明度,其他RGB值將相應縮放。我假設你想要的任何東西不全字母被認爲是一個「打」,所以你可以只覈對阿爾法字節,看它是否是255
你會訪問你正在尋找的行/列像素通過數組索引檢查是這樣的:
int pixel = myBitmap.Pixels[row * myBitmap.PixelWidth + col];
退房this post一些更多的想法。
編輯:
我扔一起快速測試,它的工作原理,它是非常簡單的:
public MainPage()
{
InitializeComponent();
this.image = new BitmapImage(new Uri("my_tranny_image.png", UriKind.Relative));
this.MyImage.Source = image;
this.LayoutRoot.MouseMove += (sender, e) =>
{
bool isHit = ImageHitTest(image, e.GetPosition(this.MyImage));
this.Result.Text = string.Format("Hit Test Result: {0}", isHit);
};
}
bool ImageHitTest(BitmapSource image, Point point)
{
var writableBitmap = new WriteableBitmap(image);
// check bounds
if (point.X < 0.0 || point.X > writableBitmap.PixelWidth - 1 ||
point.Y < 0.0 || point.Y > writableBitmap.PixelHeight - 1)
return false;
int row = (int)Math.Floor(point.Y);
int col = (int)Math.Floor(point.X);
int pixel = writableBitmap.Pixels[row * writableBitmap.PixelWidth + col];
byte[] pixelBytes = BitConverter.GetBytes(pixel);
if (pixelBytes[0] != 0x00)
return true;
else
return false;
}
你可能會想做出一些優化,例如不能在每一個MouseMove事件創建WritableBitmap但這只是一個概念證明,表明它的工作原理。
相關問題
- 1. 什麼是使圖像透明的最佳方式?
- 2. 在Silverlight中分割圖像的最佳方式是什麼?
- 3. 不透明像素點擊檢測
- 4. 爲IE6保存alpha透明PNG圖像的最佳方式是什麼?
- 5. HTML - 點擊透明PNG中的像素?
- 6. 什麼是在.NET中「平方」圖像的最佳方式?
- 7. 在網站上顯示透明圖像的最佳方法是什麼?
- 8. 爲什麼Silverlight中的透明背景圖像不可見?
- 9. 什麼是測試DOM中元素的最佳方式
- 10. 單元測試生成圖像的代碼的最佳方式是什麼?
- 11. 在Java中縮放圖像的最佳方式是什麼?
- 12. 在clojure中處理圖像的最佳方式是什麼?
- 13. 什麼是在android中存儲圖像的最佳方式?
- 14. 在MVC中刪除圖像的最佳方式是什麼?
- 15. 什麼是在QLabel中呈現WSQ圖像的最佳方式
- 16. 檢索透明圖像的最後一個非透明像素位置
- 17. 的ImageButton檢測點擊甚至在透明的像素
- 18. 非透明圖像
- 19. 非透明圖像
- 20. 只有當點擊的像素不透明時,纔會點擊圖像上註冊的事件?
- 21. 什麼是不裁剪中心圖像的最佳方式?
- 22. 什麼是在網站上顯示圖像的最佳方式?
- 23. 什麼是讀取JavaFX Canvas像素的最佳方式?
- 24. 爲什麼透明像素在圖像中顯示爲黑色?
- 25. 什麼是改變圖像視圖來源的最佳方式?
- 26. 什麼是測試Silverlight 5類庫的最佳方法?
- 27. 只在html上點擊圖像上的不透明區域
- 28. 在部分透明的圖像上點擊透明區域
- 29. 什麼將是層圖像的畫廊的最佳方式?
- 30. 什麼是不透明的像素格式的
我曾經想過要做那樣的事情,但它似乎不必要的複雜,所以我想確保沒有更簡單的解決方案。我遇到的另一種方法嘗試使用對象輪廓來創建路徑幾何體,然後檢查鼠標點擊是否在內。這也適用於我的應用程序,但對於這樣一個基本問題似乎又太複雜了。 – cfroehlich 2010-10-20 16:22:50
是否有多個PNG或只有一個?我不認爲這會很糟糕,我猜測你正在測試MouseMove事件,所以你只有一個點轉換爲圖像座標,然後檢查X和Y對像素行和列。路徑幾何對我而言聽起來更加複雜。 – 2010-10-20 18:15:38
用一些示例代碼編輯我的答案。 – 2010-10-20 20:33:50