2008-12-29 26 views
6

Bir algoritmanın farklı varyasyonları tarafından üretilen iki bitmapim var. Farklılıkları göstermek için birinden diğerini çıkararak üçüncü bir bitmap oluşturmak istiyorum.C# /. NET'te bir bitmap'ten diğerinden nasıl çıkarılır?

Bu, .NET'te nasıl yapılabilir? Grafik sınıfına ve ImageAttributes sınıfı da dahil olmak üzere tüm seçeneklerine baktım ve renk matrisini veya tablo işlevlerini yeniden eşleştirmesini içeren bir önsezim var.

Kimsenin bir örnek kodla bağlantısı var mı, yoksa doğru yönde mi işaret edebilir? Google-fu bugün beni başarısız olmazsa google araması çok fazla ortaya çıkmaz.

cevap

7

Asıl soru, hangi farklılıkları göstermek istiyorsunuz? Sadece RGB renk değerlerinde çalışmanız gerekiyorsa, bence en iyi bahis iki bitmap'i taramak ve GetPixel'i kullanarak Renk değerlerini karşılaştırmak ve 'fark' bitmap'inizi oluşturmak için SetPixel'i kullanmaktır. Belki de sadece değerleri çıkartmak ve bunları üçüncü bitmap için yeni Renk değeri olarak kullanmak istersiniz. Veya belki de parlaklığı hesaplamak ve bunu kullanmak istersiniz. Daha da iyisi, karşılaştırma için üç ölçümünüz varsa, her birini rengin R G ve B bileşenlerine atayın. Bu yaklaşımı daha önce fraktal renklendirme için kullandım.

Başka yaklaşımlar da vardır, ancak bununla sadece hayal gücünüzle sınırlısınız. En hızlı yaklaşım olmayabilir, ancak bu senaryo için performans gerekli gibi görünmüyor.

+0

Haklısınız, performans nbr değil. Burada 1 gol ve daha fazla düşünürüm, sadece kodu kendim yazmam gerekiyormuş gibi geliyor. Başlangıçta bir sihirli invert-image2-add-to-image1 algoritması düşünmekteydim, ancak negatif sonuçlarla nasıl başa çıkacaktı? Tamam, işe dön o zaman :) –

+0

Performansa ihtiyacınız varsa, kullanabileceğinizi unutmayın. Bitmap nesnesinin LockBits yöntemi, üzerinde çalışabileceğiniz ham piksel değerlerinin bayt dizisini elde eder. GetPixel ve SetPixel'den çok daha hızlı olma eğilimindedir. – driis

3

Bu projeye göz atın. Andrew Kirillov tarafından yapılan bir hareket dedektörüdür. İki resim arasındaki farklılıkları elde etmek için birkaç filtre uygular ve hareketleri hesaplamak için kullanır. Gerçekten çok güzel ve kendi uygulamanızda değiştirip kullanması kolay.

http://www.codeproject.com/KB/audio-video/Motion_Detection.aspx

+0

gerçekten güzel bir örnek –

1

İlk olarak, cevap gibi görünmek ne istiyorsun ;-p çıkarma tanımlamak?

Bunu yapmanın en iyi yolu muhtemelen LockBits - çok GetPixel çağrısından daha hızlı olmalı, ancak baytların kodunu çözmeniz gerekecek. Sadece 32bpp ARGB gibi bir şey olsa kolay, ancak bazı daha karmaşık durumlar için zor.

0

Adobe Pixel Bender'da kullanılan dilin, Microsoft'un bir zamanlar yaptığı bir şeyden ilham aldığını bir yere okudum. Nerede okuduğumu hatırlamıyorum. Benim düşüncem belki de Microsoft'un “bir şey” bir .Net projesinin kullanabileceği bir şeye sarılmış olmasıdır. Sadece iki görüntüyü çıkarmak için çok fazla, ama yine de.

2

Bu, BitBlt API işlevini PInvoking yaparak yapılabilir. İşte bazı örnek kod:

http://www.codeproject.com/KB/GDI-plus/Bitblt_wrapper_class.aspx

örnek SRCCOPY raster op kodu kullanır; İki bitmap arasındaki farkları almak için SRCPAINT veya bir şey kullanmak istersiniz (GOOGLE kodların listesini vermelidir).

GetPixel ve SetPixel (Bitmap sınıfında) inanılmaz derecede yavaştır. LockBits'i kullanmak çok daha hızlı olacaktır, ancak yine de kendi kodunuzu yazmanız gerekecektir.

Güncelleme: bu daha iyi bir bağlantıdır:

http://www.pinvoke.net/default.aspx/gdi32.BitBlt

ve tüm olası üçlü tarama işlemlerini kapsamaktadır (SRCPAINT veya SRCAND muhtemelen aradığınız şeylerdir.).

İlgili konular