
рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдХрд╛рд░рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреЛрд╕реНрдЯ рдерд╛:
"рдЖрдЧреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ bmp рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд ред
" рдПрдХ рд╕рдордп рдореЗрдВ, рдореБрдЭреЗ C # рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╢реЛрдз рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдереЗ, рдЬрд┐рд╕рдиреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдкреАрдбрд╝рди рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдб рдЦреЛрдЬрдкреВрд░реНрдг рд╣реИ, рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЖрдХрд╕реНрдорд┐рдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдХреЛрдб рдореЗрдВ рдЕрдЬреАрдмреЛрдЧрд░реАрдм рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВред рдПрдХ рдУрд░, рдЕрдиреБрдХреВрд▓рди рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ - рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЬрд╛рдВрдЪ рдШрдВрдЯреЛрдВ рдФрд░ рджрд┐рдиреЛрдВ рддрдХ рдирд╣реАрдВ рдмрдврд╝реЗ (рдЬрдм рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдирд┐рдХрд╛рдп рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ)ред рдЙрдкрд░реНрдпреБрдХреНрдд рдкреЛрд╕реНрдЯ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдкрд┐рдХреНрд╕реЗрд▓ luminances bmp.GetPixel (x, y) рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╡рд╣ рд╣реИ рдЬреЛ рдореЗрд░реА рдкрд╣рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдИ рдереАред рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣рд╛рдВ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ? рдЪрд▓реЛ рдЗрд╕реЗ рдорд╛рдкреЗрдВред
рд╣рдо рдХреНрд▓рд╛рд╕рд┐рдХ рдмрд┐рдЯрдореИрдк (System.Drawing.Bitmap) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╡рд░реНрдЧ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдорд╕реЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд░реЗрдЦрд╛рдкреБрдВрдЬ рд╕реНрд╡рд░реВрдкреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЫрд┐рдкрд╛рддрд╛ рд╣реИ - рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╡реЗ рд╣рдореЗрдВ рд░реБрдЪрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕реА рд╕рдордп, рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рд╕реНрд╡рд░реВрдкреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдмреАрдПрдордкреА, рдЬреАрдЖрдИрдПрдл, рдЬреЗрдкреАрдИрдЬреА, рдкреАрдПрдирдЬреАред
рд╡реИрд╕реЗ, рдореИрдВ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рд▓рд╛рдн рдкреЗрд╢ рдХрд░реВрдВрдЧрд╛ред рдмрд┐рдЯрдореИрдк рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдкрд┐рдХреНрдЪрд░ рдлрд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдПрдХ рдЕрдкреНрд░рд┐рдп рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ - рдпрд╣ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реА рдкрд╣реБрдВрдЪ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдмрд╛рд░-рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд┐рдЯрдореИрдк рдХреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рддреБрд░рдВрдд "рд░рд┐рд▓реАрдЬрд╝" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдВ:
public static Bitmap LoadBitmap(string fileName) { using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)) return new Bitmap(fs); }
рдорд╛рдкрди рд╡рд┐рдзрд┐
рд╣рдо рдЗрд╕реЗ рдРрд░реЗ рдореЗрдВ рдбрд┐рд╕реНрдЯрд┐рд▓ рдХрд░рдХреЗ рдФрд░ рдмрд┐рдЯрдореИрдк рдкрд░ рдХреНрд▓рд╛рд╕рд┐рдХ рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ - Lena (
http://en.wikipedia.org/wiki/Lenna ) рдореЗрдВ рдорд╛рдкреЗрдВрдЧреЗред рдпрд╣ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдЫрд╡рд┐ рд╣реИ, рдпрд╣ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рд╢реАрд░реНрд╖рдХ рдореЗрдВ рднреА)ред рдЖрдХрд╛рд░ - 512 * 512 рдкрд┐рдХреНрд╕реЗрд▓ред
рддрдХрдиреАрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ - рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореИрдВ рдЕрд▓реНрдЯреНрд░рд╛-рд╕рдЯреАрдХ рдЯрд╛рдЗрдорд░ рдХрд╛ рдкреАрдЫрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдмрд╕ рдПрдХ рд╣реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрдИ рдмрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВред рдмреЗрд╢рдХ, рдПрдХ рддрд░рдл, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдФрд░ рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреИрд╢ рдореЗрдВ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди, рджреВрд╕рд░реА рдУрд░, рд╣рдо MSIL рдХреЛрдб рдХреЗ рдЕрдиреБрд╡рд╛рдж рд╕реЗ рдЬреБрдбрд╝реЗ рдХреЛрдб рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреА рд▓рд╛рдЧрдд рдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрдб рдФрд░ рдЕрдиреНрдп рдУрд╡рд░рд╣реЗрдб рд▓рд╛рдЧрдд рдореЗрдВ рдЕрд▓рдЧ рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдб рдХреЛ рдПрдХ рдмрд╛рд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВ - рд╣рдо рддрдерд╛рдХрдерд┐рдд "рд╡рд╛рд░реНрдо-рдЕрдк" рдХрд░рддреЗ рд╣реИрдВред
рд╣рдо рдХреЛрдб рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рдиреАрдЪреЗ рд╕реЗ рд▓реЙрдиреНрдЪ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рднреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ - рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрдм рдЗрд╕рдХреЗ "рдЙрдкреЗрдХреНрд╖рд╛" рдХреЗ рдмрд╣реБрдд рддрдереНрдп рдХрднреА-рдХрднреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА, рдЕрдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИред
рд╣рдо рдХрдИ рдмрд╛рд░ рдХреЛрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ - рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдПрдВрдЯреАрд╡рд╛рдпрд░рд╕ рдпрд╛ рдХреБрдЫ рдФрд░ рдЬрд╛рдЧ рдЙрдард╛ред рдпреЗ рд╕рднреА рдЙрдкрд╛рдп рд╣рдореЗрдВ рд╕реНрдерд┐рд░, рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рднреЛрд▓реА рд╡рд┐рдзрд┐
рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдореЗрдВ Bitmap.GetPixel (x, y) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдРрд╕реА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдХреЛрдб рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдмрд┐рдЯрдореИрдк рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рддреАрди-рдЖрдпрд╛рдореА рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд╣рд▓рд╛ рдЖрдпрд╛рдо рд░рдВрдЧ рдШрдЯрдХ (0 рд╕реЗ 2 рддрдХ) рд╣реИ, рджреВрд╕рд░рд╛ y рд╕реНрдерд┐рддрд┐ рд╣реИ, рдФрд░ рддреАрд╕рд░рд╛ x рд╕реНрдерд┐рддрд┐ рд╣реИред рдпрд╣ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╣реБрдЖ, рдпрджрд┐ рдЖрдк рдбреЗрдЯрд╛ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
public static byte[, ,] BitmapToByteRgbNaive(Bitmap bmp) { int width = bmp.Width, height = bmp.Height; byte[, ,] res = new byte[3, height, width]; for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { Color color = bmp.GetPixel(x, y); res[0, y, x] = color.R; res[1, y, x] = color.G; res[2, y, x] = color.B; } } return res; }
рдЙрд▓рдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдПрдХ рдЕрд▓рдЧ рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдпрд╣рд╛рдВ рдЙрдирдХрд╛ рдХреЛрдб рдирд╣реАрдВ рджреВрдВрдЧрд╛ - рдХреЛрдИ рднреА рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред
I5-2520M 2.5GHz рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рд▓реИрдкрдЯреЙрдк рдкрд░ рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП 100 рд░реВрдкрд╛рдВрддрд░рдг рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, 43.90 рд╕реЗрдХрдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ 512 * 512 рдХреА рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде, рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдкрд░ рдХреЗрд╡рд▓ рдЖрдзрд╛ рд╕реЗрдХрдВрдб рдЦрд░реНрдЪ рд╣реЛрддрд╛ рд╣реИ!
рдмрд┐рдЯрдореИрдк рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рдо
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдмрд┐рдЯрдореИрдк рд╡рд░реНрдЧ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдПрдХ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ BitmapData рд╡рд░реНрдЧ рдФрд░ рдкрддреЗ рдЕрдВрдХрдЧрдгрд┐рдд рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
public unsafe static byte[, ,] BitmapToByteRgb(Bitmap bmp) { int width = bmp.Width, height = bmp.Height; byte[, ,] res = new byte[3, height, width]; BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); try { byte* curpos; for (int h = 0; h < height; h++) { curpos = ((byte*)bd.Scan0) + h * bd.Stride; for (int w = 0; w < width; w++) { res[2, h, w] = *(curpos++); res[1, h, w] = *(curpos++); res[0, h, w] = *(curpos++); } } } finally { bmp.UnlockBits(bd); } return res; }
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдореЗрдВ рдкреНрд░рддрд┐ 100 рд░реВрдкрд╛рдВрддрд░рдг ()реи рдмрд╛рд░ рддреНрд╡рд░рд┐рдд) рдореЗрдВ реж.релрейрей рд╕реЗрдХрдВрдб рджреЗрддрд╛ рд╣реИ! рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ - рдХреНрдпрд╛ рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ? рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдо рдЕрднреА рднреА рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдХреЗ рднреАрддрд░ рд░рд╣рдХрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧрддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?
рдмрд┐рдВрджреБ рдмрдирд╛рдо рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ
рдмрд╣реБрдЖрдпрд╛рдореА рд╕рд░рдгрд┐рдпрд╛рдБ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВред рдпрд╣рд╛рдВ, рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рддрддреНрд╡ рдХреА рдЧрдгрдирд╛ рдЧреБрдгрди рдФрд░ рдЬреЛрдбрд╝ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛рддреА рд╣реИред рдЪреВрдВрдХрд┐ рдмрд┐рдЯрдореИрдк рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдкрддрд╛ рдЕрдВрдХрдЧрдгрд┐рдд рдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╣рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддреНрд╡рд░рдг рджрд┐рдпрд╛ рд╣реИ, рд╢рд╛рдпрдж рд╣рдо рдЗрд╕реЗ рдмрд╣реБрдЖрдпрд╛рдореА рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ? рдпрд╣рд╛рдБ рдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛрдб рд╣реИ:
public unsafe static byte[, ,] BitmapToByteRgbQ(Bitmap bmp) { int width = bmp.Width, height = bmp.Height; byte[, ,] res = new byte[3, height, width]; BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); try { byte* curpos; fixed (byte* _res = res) { byte* _r = _res, _g = _res + width*height, _b = _res + 2*width*height; for (int h = 0; h < height; h++) { curpos = ((byte*)bd.Scan0) + h * bd.Stride; for (int w = 0; w < width; w++) { *_b = *(curpos++); ++_b; *_g = *(curpos++); ++_g; *_r = *(curpos++); ++_r; } } } } finally { bmp.UnlockBits(bd); } return res; }
рдкрд░рд┐рдгрд╛рдо? рдкреНрд░рддрд┐ 100 рд░реВрдкрд╛рдВрддрд░рдг рдкрд░ 0.162 рд╕реЗрдХрдВрдбред рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЛрдВрдиреЗ "рднреЛрд▓реА" рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдФрд░ 3.3 рдЧреБрдирд╛ (270 рдмрд╛рд░) рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ред рдпрд╣ рдПрдХ рдРрд╕рд╛ рдХреЛрдб рдерд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВрдиреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рд╢реЛрдз рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдерд╛ред
рдХреНрдпреЛрдВ рдвреЛрддреЗ рд╣реИрдВ?
рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдмрд┐рдЯрдореИрдк рд╕реЗ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд╢рд╛рдпрдж рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рд╡рд╣рд╛рдБ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП? рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд▓реЗрдХрд┐рди, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдбреЗрдЯрд╛ рдкрд░ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред рдлрд┐рд░ рдЗрдВрдЯрд░рдлреНрд▓реЛ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдордзреНрдпрд╡рд░реНрддреА рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕рдЯреАрдХрддрд╛ рдХреА рд╣рд╛рдирд┐ред рдПрдХ рдбрдмрд▓ / рдлреНрд▓реЛрдЯ рдРрд░реЗ рдореЗрдВ рдХрдиреНрд╡рд░реНрдЯ рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрд▓рдЯрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рдмрд╛рдЗрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рддреНрдпрд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдХреЛрдб рд╣реИ:
private static byte Limit(double x) { if (x < 0) return 0; if (x > 255) return 255; return (byte)x; }
рдРрд╕реЗ рдЪреЗрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдЬреЛрдбрд╝рдирд╛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИред рдбрдмрд▓ рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рдкрддрд╛ рдЕрдВрдХрдЧрдгрд┐рдд рд╡рд╛рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 0.713 рд╕реЗрдХрдВрдб (рдкреНрд░рддрд┐ 100 рд░реВрдкрд╛рдВрддрд░рдг) рдЪрд▓ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди "рднреЛрд▓реА" рд╡рд┐рдХрд▓реНрдк рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдЦрд┐рд▓рд╛рдл - рдпрд╣ рд╕рд┐рд░реНрдл рдмрд┐рдЬрд▓реА рд╣реИред
рдФрд░ рдЕрдЧрд░ рдЖрдк рддреЗрдЬреА рд╕реЗ рдЬрд░реВрд░рдд рд╣реИ?
рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рддреЗрдЬрд╝ рдЪрд╛рд╣рд┐рдП, рддреЛ рд╣рдо C, Asm рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░, рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд╣рдо SIMD рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдмрд┐рдЯрдореИрдк рд░реИрдкрд░ рдХреЗ рдмрд┐рдирд╛, рд╕реАрдзреЗ рд░реЗрдЦрд╛рдкреБрдВрдЬ рдкреНрд░рд╛рд░реВрдк рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рдмреЗрд╢рдХ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рд╕рднреА рдкреНрд░рдмрдВрдзрд┐рдд рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХреЗ рд╕рд╛рде, рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рд╣реИрдВред рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбреАрдмрдЧ рдХрд┐рдП рдЧрдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рд▓реЗрдЦ рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
rasterconversion.codeplex.com/SourceControl/latestрдЕрджреНрдпрддрди 2013-10-08:рдЯрд┐рдкреНрдкрдгреАрдХрд╛рд░реЛрдВ рдХреЗ рд╕реБрдЭрд╛рд╡ рдкрд░, рдЙрдиреНрд╣реЛрдВрдиреЗ рдХреЛрдб рдореЗрдВ рдорд╛рд░реНрд╢рд▓ (рдХреЛрдкреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рд╛ред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЗрд╕ рддрд░реАрдХреЗ рдХреА рдЕрдкрдиреА рд╕реАрдорд╛рдПрдБ рд╣реИрдВ:
- рдбреЗрдЯрд╛ рдСрд░реНрдбрд░ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдореВрд▓ рдмрд┐рдЯрдореИрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдШрдЯрдХ рдорд┐рд╢реНрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдбреЗрдЯрд╛ рдХреА рдирдХрд▓ рдХрд░рддреЗ рд╣реБрдП, рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдЗрдХрд┐рд▓ рдЪрд▓рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред
- рдЪрдордХ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдмрд╛рдЗрдЯ рд░рд╣рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА, рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рдордзреНрдпрд╡рд░реНрддреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИред
- рдорд╛рд░реНрд╢рд▓ред рдХреЛрдкреА () рдПрдХ рдЖрдпрд╛рдореА рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рдВ, рд╡реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╣реИрдВ рдФрд░ рд╣рд░ рдЬрдЧрд╣ рдЖрд░рдЬреАрдмреА [x + рдЪреМрдбрд╝рд╛рдИ * y] рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА ...
рддреЛ, рджреЛ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдирдХрд▓ рдХрд░рдиреЗ рдореЗрдВ 0.158 рд╕реЗрдХрдВрдб (рдкреНрд░рддрд┐ 100 рд░реВрдкрд╛рдВрддрд░рдг) рд▓рдЧрддреЗ рд╣реИрдВред рдкреЙрдЗрдВрдЯрд░реНрд╕ рдкрд░ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд▓реЙрдиреНрдЪ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рддреНрд░реБрдЯрд┐ рдХреЗ рднреАрддрд░ рддреНрд╡рд░рдг рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИред
рдЕрджреНрдпрддрди 2016-04-25:рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
Ant00 рдиреЗ BitmapToByteRgbQ рд╡рд┐рдзрд┐ рдХреЗ рдХреЛрдб рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ред рдпрд╣ рд╕рдордп рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд░реНрдХрд┐рдВрдЧ рдХреЛрдб рд╕реЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реБрдИред рд╕рд╣реА рдХрд┐рдпрд╛ред рдЖрдкрдХреА рджреГрдврд╝рддрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж (рдкрд╣рд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ рдХрд┐рд╕реА рд▓реЗрдЦ рдореЗрдВ рдХреЛрдб рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЬрд╛рдВрдЪ рдХреА рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 2.5 рд╕рд╛рд▓ рдкреБрд░рд╛рдирд╛ рд╣реИ)ред