He solucionado el problema de velocidad
Pero desde luego no fue precisamente una solucion muy limpia, por el contrario bastante sucia.
Como el problema es por usar generics decidi reducir su uso al maximo en ese metodo porblema, asi que lo que hice fue determinar el tipo T e implementar una solucion especifica para los tipos soportados por mis formatos nativamente (8,16,24,32 bit) y conservar la interfaz generica para los clientes del metodo asi como proveer una solucion generica para los tipos no nativos que se requieran utilizar en un futuro.
Reduje el tiempo de ejecucion a menos de un segundo.
Codigo anterior:
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>
XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
public T[] ColorArrayDesdeBMP(Bitmap bmp)
{
T[] colorArray =
new T[bmp.Height * bmp.Width];
BitmapData bmpd = bmp.LockBits(
new Rectangle(
0,
0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);
IntPtr pbmp = bmpd.Scan0;
byte bytesPorPixel =
0;
int j =
0;
bytesPorPixel = (byte)((
int)imagen.informacionBase.ProfundidadColor /
8);
int anchoEnBytes = bmp.Width * bytesPorPixel;
int paddedBytes = ((anchoEnBytes +
3) & ~
3) - anchoEnBytes;
int anchoBytesPadd = anchoEnBytes + paddedBytes;
byte[] bmpArr =
new byte[bmp.Height * anchoBytesPadd];
System.Runtime.InteropServices.Marshal.Copy(pbmp, bmpArr,
0, bmp.Height * anchoBytesPadd);
bmp.UnlockBits(bmpd);
for (
int i =
0; i < bmpArr.Length; i += bytesPorPixel)
{
colorArray[j] =
new T();
colorArray[j++].FromBMPColorArray(bmpArr, i);
if (j % bmp.Width ==
0)
i += paddedBytes;
}
return colorArray;
}<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
Codigo nuevo (cochino pero rapido)
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>
XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
public T[] ColorArrayDesdeBMP(Bitmap bmp)
{
BaseColor[] objectArray =
new BaseColor[bmp.Height * bmp.Width];
T[] colorArray=
new T[
1];
Color8[] colorArray8 =
new Color8[
1];
Color16[] colorArray16 =
new Color16[
1];
Color24[] colorArray24 =
new Color24[
1];
Color32[] colorArray32 =
new Color32[
1];
BitmapData bmpd = bmp.LockBits(
new Rectangle(
0,
0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);
IntPtr pbmp = bmpd.Scan0;
byte bytesPorPixel = (byte)((
int)imagen.informacionBase.ProfundidadColor /
8);
int anchoEnBytes = bmp.Width * bytesPorPixel;
int paddedBytes = ((anchoEnBytes +
3) & ~
3) - anchoEnBytes;
int anchoBytesPadd = anchoEnBytes + paddedBytes;
byte[] bmpArr =
new byte[bmp.Height * anchoBytesPadd];
Type t = typeof(T);
int j =
0;
System.Runtime.InteropServices.Marshal.Copy(pbmp, bmpArr,
0, bmp.Height * anchoBytesPadd);
bmp.UnlockBits(bmpd);
switch (t.Name)
{
case "Color8":
colorArray8 = Array.ConvertAll<BaseColor, Color8>(objectArray, delegate(BaseColor b) {
return b as Color8; });
for (
int i =
0; i < bmpArr.Length; i += bytesPorPixel)
{
colorArray8[j] =
new Color8();
colorArray8[j++].FromBMPColorArray(bmpArr, i);
if (j % bmp.Width ==
0)
i += paddedBytes;
}
return colorArray8 as T[];
case "Color16":
colorArray16 = Array.ConvertAll<BaseColor, Color16>(objectArray, delegate(BaseColor b) {
return b as Color16; });
for (
int i =
0; i < bmpArr.Length; i += bytesPorPixel)
{
colorArray16[j] =
new Color16();
colorArray16[j++].FromBMPColorArray(bmpArr, i);
if (j % bmp.Width ==
0)
i += paddedBytes;
}
return colorArray16 as T[];
case "Color24":
colorArray24 = Array.ConvertAll<BaseColor, Color24>(objectArray, delegate(BaseColor b) {
return b as Color24; });
for (
int i =
0; i < bmpArr.Length; i += bytesPorPixel)
{
colorArray24[j] =
new Color24();
colorArray24[j++].FromBMPColorArray(bmpArr, i);
if (j % bmp.Width ==
0)
i += paddedBytes;
}
return colorArray24 as T[];
case "Color32":
colorArray32 = Array.ConvertAll<BaseColor, Color32>(objectArray, delegate(BaseColor b) {
return b as Color32; });
for (
int i =
0; i < bmpArr.Length; i += bytesPorPixel)
{
colorArray32[j] =
new Color32();
colorArray32[j++].FromBMPColorArray(bmpArr, i);
if (j % bmp.Width ==
0)
i += paddedBytes;
}
return colorArray32 as T[];
default:
colorArray = Array.ConvertAll<BaseColor, T>(objectArray, delegate(BaseColor b) {
return b as T; });
for (
int i =
0; i < bmpArr.Length; i += bytesPorPixel)
{
colorArray[j] =
new T();
colorArray[j++].FromBMPColorArray(bmpArr, i);
if (j % bmp.Width ==
0)
i += paddedBytes;
}
return colorArray;
}
}<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->