работа с изображениями в VC++ _БЕЗ MFC_

Тема в разделе "WASM.WIN32", создана пользователем chatty2, 26 июл 2006.

  1. chatty2

    chatty2 New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2006
    Сообщения:
    15
    помогите кто-нибудь. неделю уже ищу по всему инету, а найти не могу. нужно всего-то загрузить bmp с диска, заменить все нечерные пикселы на белые, разбить его на 3 части и сохранить. на дельфе я это за 5 мин сделал, а на VC не иогу...
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    LoadImage

    Создаём Ч/Б DC: CreateCompatibleDC
    Устанавливаем фоновый цвет (чёрный): SetBkColor
    Грузим в этот DC битмап: SelectObject
    Всё.

    BitBlt по частям в другие DC.

    пример в MSDN.
     
  3. chatty2

    chatty2 New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2006
    Сообщения:
    15
    Что-то не получается преобразовать изображение в монохромное. Или вместо картинки просто чернота, или она бело-хрен_понять_какая. Простое изменение biBitCount в PBITMAPINFO не помогает. Помогите plz!!!
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Воспользуйся GetDIBits, чтобы получить матрицу пикселей, и пройдись по ней, устанавливая все ненулевые пиксели в FFFFFF.
     
  5. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    Попробуй покурить сурсы из аттача.
    Это не совсем то, что тебе надо, но может спасти отца русской демократии.
    Там две мои програмки, которые используют GDI+.
    Первая - грузит картинку из файла и отображает на окне.
    Вторая чисто на случай если тебе приходится крузить картинку не из файла, тогда это можно сделать через IStream - там он местами используется. Программа делает скриншет экрана и сохраняет в формате png.
    В общем тебе должно стать понятно, как работает CGI+ и COM (IStream, IImage, IGraphics) на чистом апи.
    Затем идешь на msdn.microsoft.com и ищешь функции для попиксельной обработки изображения.
    Алгоритм такой - получаешь размер картинки (если он зарание не известен) и для каждого пикселя[i,j] если он не черный сделать его белым.
    Ну и там же функции для "резанья".
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    chatty2
    Создаём Ч/Б картинку:
    Код (Text):
    1. invoke CreateBitmap,width,height,1,1,0
    Помещаем её в DC. Устанавливаем цвет фона и накладываем с помощью BitBlt оригинальную картинку. Вот пример в MSDN. То, что они называют "AND mask", как раз и является Ч/Б преобразованием оригинальной картинки.
     
  7. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    Хм.. кажется я пальнул из пушки по воробью.
    короче не слушай меня - делай как cresta и Quantum говорят ;)
     
  8. chatty2

    chatty2 New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2006
    Сообщения:
    15
    да нет, спасибо. я решил написать одинаковую прогу на delphi, vc и asm. а то все как-то больше на дельфе, вот и решил vc и asm подучить. а вообще, сделать ч/б картинку у меня получается. но у нее размер 4 кило. я хочу ее уменьшить до правильных 500 байт, но не получается. вот если бы кто подсказал, как ...
     
  9. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    chatty2
    Ну все дело в формате - ты сохраняешь изображение не как монохромное, а как 8/16/24 битное.
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    она у тебя и будет 4 кб, т.к. замена цветов не меняет формата рисунка. Каким бы способом ты не менял пиксели. Он как был, так и останется 24-битным.
    Получаи DIB исходного рисунка, создай DIB для своего черно-белого и заполняй самостоятельно в соответствии с цветами исходного рисунка. Затем когда черно-белый будет заполнен, сохрани его в рисунок.
     
  11. chatty2

    chatty2 New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2006
    Сообщения:
    15
    thx всем! я думал над этим способом, и мне он показался не совсем правильным. поэтому и спрашиваю. ну раз нет другого способа, буду так делать. а вообще у меня почти получалось, просто изменяя кол-во бит, описывающих 1 пиксел. но при этом портится картинка, хотя там только ч. и б. цвета.
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Изменять количество бит в описании недостаточно, надо чтобы биты в памяти располагались с соответствие с твоим описанием. Видимо их расположение не соответствует, отсюда и портится картинка. Для 24-битных понятно как располагать биты, а для черно-белых я даже и не припомню, видел ли эту структуру вообще.