Битмап Из Массива.

Тема в разделе ".NET - Общие вопросы по языкам", создана пользователем EugenOS, 20 апр 2014.

  1. EugenOS

    EugenOS Active Member

    Регистрация:
    22 июл 2007
    Сообщения:
    27
    Симпатии:
    0
    Добрый день всем.
    Имею проблему. В основной программе из больших (1600 x 1200 ) картинок делаю массивы и обрабатываю их как мне нужно.
    Для проверки решил сохранить обрабатываемые области (64 x 240) в файлики (результат программы дает постоянную ошибку точек а 100..150, хотел узнать все ли правильно )
    Для этого ранее созданную область копирую в массив Int32 только в младший байт, т.е. включаю кое где одну составляющую цвета (исходные картинки черно белые, так что для проверки этого достаточно). Но при сохранении вижу белый прямоугольник. По-видимому я чего-то не доделываю...но не могу найти и понять чего:
    Код (C++):
            public static Bitmap bufToBmp( Int32[] buf, Rectangle size ) // использую для размера Rect, просто потому что в основной программе он уже есть с нужными значениями, незачем плодить сущности
    {
    Int32 len = size.Width * size.Height;
    Bitmap retImg = new Bitmap(size.Width, size.Height);
    PixelFormat pxf = PixelFormat.Format32bppArgb;
    BitmapData bmpData = retImg.LockBits(
    new Rectangle(0, 0, size.Width, size.Height) , ImageLockMode.ReadWrite, pxf );
    Marshal.Copy( buf, 0, bmpData.Scan0, len );
    retImg.UnlockBits(bmpData);
    return retImg;
    }

    ...
    Int32 len = testRect.Width * testRect.Height;  // размер тестируемой области
    Int32[] buf = new Int32[len];
    for( int i=0; i< len; i++ )
    {
    byte b = bytes[i];  // в bytes[] лежит байтовый образ картинки (тоже одна составляющая) который обрабатывается программой, им судя по результату (дающему на разных картинках строго линейную погрешность) содержит адекватные данные.
    buf[i] = b; // через переменную кидал, потому что изначально собирал сдвигом все три составляющих.
    }
    return bufToBmp(buf, testRect);
    ...
     
  2. EugenOS

    EugenOS Active Member

    Регистрация:
    22 июл 2007
    Сообщения:
    27
    Симпатии:
    0
    почитал немного про битмапы...оказалось в формате argb32 старший байт (А) отвечает за прозрачность.
    помогло:
    Код (C++):
     buf[i] = unchecked((Int32)0xFF000000 + bytes[i] );
     
Загрузка...

Поделиться этой страницей