Как я могу выполнить итерации через каждый пиксель в изображении .gif?

Я должен ступить через .gif, отображают и определяют значение RGB каждого пикселя, координат X и Y. Кто-то может дать мне обзор того, как я могу выполнить это? (методология, который пространства имен использовать, и т.д.)

14
задан Rodrigo Guedes 21 August 2012 в 13:53
поделиться

2 ответа

Это полный пример с обоими методами, использующими LockBits () и GetPixel (). Помимо проблем с доверием, связанных с LockBits (), все может легко запутаться.

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);
        }
    }
}
26
ответ дан 1 December 2019 в 07:40
поделиться

Вы можете загрузить изображение с помощью new Bitmap (filename) , а затем использовать Bitmap.GetPixel неоднократно. Это очень медленно, но просто. (См. Пример в ответе Винко.)

Если производительность важна, вы можете использовать Bitmap.LockBits и небезопасный код. Очевидно, это уменьшает количество мест, где вы могли бы использовать решение (с точки зрения уровней доверия), и, как правило, является более сложным, но может быть на лот быстрее.

9
ответ дан 1 December 2019 в 07:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: