Bir .gif görüntüye adım atmalı ve her bir pikselin, x ve y koordinatlarının RGB değerini belirlemeliyim. Birisi bana bunu nasıl başarabileceğime dair bir genel bakış sunabilir mi? (kullanılacak isimler, metodoloji, vb.)Her bir pikselde .gif görüntüsünde nasıl yineleyebilirim?
cevap
Bu, her iki yöntemde de LockBits() ve GetPixel() kullanarak tam bir örnektir. LockBits() ile ilgili güven sorunlarının yanı sıra kılları kolayca alabilirsiniz.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
namespace BitmapReader
{
class Program
{
static void Main(string[] args)
{
//Try a small pic to be able to compare output,
//a big one to compare performance
System.Drawing.Bitmap b = new
System.Drawing.Bitmap(@"C:\Users\vinko\Pictures\Dibujo2.jpg");
doSomethingWithBitmapSlow(b);
doSomethingWithBitmapFast(b);
}
public static void doSomethingWithBitmapSlow(System.Drawing.Bitmap bmp)
{
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height; y++)
{
Color clr = bmp.GetPixel(x, y);
int red = clr.R;
int green = clr.G;
int blue = clr.B;
Console.WriteLine("Slow: " + red + " "
+ green + " " + blue);
}
}
}
public static void doSomethingWithBitmapFast(System.Drawing.Bitmap bmp)
{
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
System.Drawing.Imaging.BitmapData bmpData =
bmp.LockBits(rect,
System.Drawing.Imaging.ImageLockMode.ReadOnly,
bmp.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = bmpData.Stride * bmp.Height;
byte[] rgbValues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr,
rgbValues, 0, bytes);
byte red = 0;
byte green = 0;
byte blue = 0;
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height; y++)
{
//See the link above for an explanation
//of this calculation
int position = (y * bmpData.Stride) + (x * Image.GetPixelFormatSize(bmpData.PixelFormat)/8);
blue = rgbValues[position];
green = rgbValues[position + 1];
red = rgbValues[position + 2];
Console.WriteLine("Fast: " + red + " "
+ green + " " + blue);
}
}
bmp.UnlockBits(bmpData);
}
}
}
Sen new Bitmap(filename)
kullanarak resim yüklemek ve daha sonra art arda Bitmap.GetPixel
kullanabilirsiniz. Bu çok yavaş ama basit. (Örnek için Vinko'nun yanıtına bakın.)
Performans önemliyse, Bitmap.LockBits
ve güvenli olmayan kodu kullanmak isteyebilirsiniz. Açıkçası bu, çözümü (güven düzeyleri açısından) kullanabileceğiniz yer sayısını azaltır ve genellikle daha karmaşıktır - ancak lot daha hızlı olabilir.
Vay. Bunu birkaç hafta önce aradım. Kesinlikle daha örnekte görünecek. Bağlantı için teşekkürler. – maxwellb
Bu gerçekten çok daha karmaşık (ve gerçekten çok daha hızlı), görüntünün PixelFormatını göz önünde bulundurmanız, verilerin olup olmadığını kontrol etmemesi ve buna göre bazı değerleri atlamaması gerekiyor. MSDN örneği, bunlardan hiç bahsedilmediği için özellikle yararlı değildir. –
- 1. ManyToManyField üzerinde nasıl yineleyebilirim?
- 2. XML dosyasındaki her çocuk düğümüne rağmen nasıl yineleyebilirim?
- 3. Common Lisp'te bir dizinde nasıl yineleyebilirim?
- 4. Go'da run'lerle bir dize üzerinde nasıl yineleyebilirim?
- 5. LinkedHashMap'te belirli bir tuştan başlayarak nasıl yineleyebilirim?
- 6. Görüntü görüntüsünde bir görüntü nasıl gri tonlamalıdır?
- 7. JSON dizisini JavaScript'te nasıl yineleyebilirim?
- 8. Fragmentpageradapter'deki her sekmenin simgesi gif animasyonuna nasıl ayarlanır?
- 9. Vurguluda bir gif animasyonu
- 10. Rails Görüntüsünde Truncate + Sanitize
- 11. Kaydırma görüntüsünde yakınlaştırmayı etkinleştirme
- 12. Python'da her birinde bir sütun seçmek için birden çok veri çerçevesinden nasıl yineleyebilirim?
- 13. Alfa kanalıyla animasyonlu bir gif nasıl okunur
- 14. Native React'ta nasıl animasyonlu bir gif görüntüleyebilirim?
- 15. Ataş görüntüsünde orijinal görüntü URL'si nasıl kullanılır?
- 16. Php docker görüntüsünde pdo sürücüsü nasıl yüklenir?
- 17. Bir arka plan görüntüsünde CSS3 geçişi
- 18. Swift'de UIImageView'e gif nasıl gösterilir?
- 19. PostgreSQL docker görüntüsünde tablo oluşturma
- 20. Android'de gif android'den nasıl oynanır?
- 21. std :: stack` öğelerini bir for döngüsünde nasıl yineleyebilirim?
- 22. Jade template lang ile çok boyutlu bir diziyi nasıl yineleyebilirim
- 23. Bir IGrouping <T> Arabirimini nasıl yineleyebilirim?
- 24. Perl'de, bir dizinin birden çok öğesi üzerinde nasıl yineleyebilirim?
- 25. Homogeneous Intensity görüntüsünde tespit nesnesi
- 26. C++ SDL2 | SDL2'de nasıl GIF oynarım?
- 27. html css Gif Animasyon
- 28. JQuery (veya sadece javascript) kullanarak tanımlama bilgileri üzerinde nasıl yineleyebilirim?
- 29. Android için Gif Klavye
- 30. Android hareketli GIF desteği
Get/SetPixel kullanarak hiçbir görüntü işleme türünü uygulayamadım. Her zaman * yol * çok yavaş, hatta genel parlaklığı arttırmak gibi önemsiz işlemler için bile. –
Resimleriniz büyük olduğunda her zaman çok yavaş. Simge büyüklüğünde görüntüler için bu mükemmel uygun :-) –
Ah, evet, evet :-) –