Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Разбор картинки..


Автор: Mpak 29.1.2009, 12:58
Есть у нас некий *.bmp файлик.. ака изображение..
достали мы из него пиксель нужный нам..
теперь надо его представить ввиде (незнаю чего) что бы изменить в нем 4-ый бит и опять представить в виде пекселя и запихать обратно в картинку...
внимание вопрос: 
1. ввиде чего его надо представить
2. и ГЛАВНОЕ как это все провернуть? smile

Автор: mrbrooks 29.1.2009, 15:18
Код

#include <bitset>

int x = ... , y = ...; // координаты пиксела
Graphics::TBitmap *bmp = new Graphics::TBitmap(); 
if ((x <= bmp->Width) && (y<= bmp->Height) )


   bmp->LoadFromFile("new.bmp");
   TColor cl = bmp->Canvas->Pixels[x][y];
   unsigned long i = ColorToRGB(cl);
   std::bitset<32>b(i);
   i = b.set(3,!b.at(3)).to_ulong();
   bmp->Canvas->Pixels[x][y] = (TColor)i;
   bmp->SaveToFile("old.bmp");
   delete bmp;
}



Автор: taiven 29.1.2009, 16:22
Код

TColor color;
color = Image1->Canvas->Pixels[10][10];
color ^= (1 << 3);
Image1->Canvas->Pixels[10][10] = color;

Автор: mrbrooks 29.1.2009, 17:29
taiven, идея замечательная, особенно для поставленной задачи, только надо сделать так
Код

TColor color;
color = Image1->Canvas->Pixels[10][10];
color = color ^ (1 << 3);
Image1->Canvas->Pixels[10][10] = color;


иначе будет ошибка при компиляции
Цитата

E2277 Lvalue required

Автор: Mpak 30.1.2009, 01:11
ну это из разряда, что ансистроки нельзя складывать
Код

str += " !!! ";

//можно только так
str = str + " !!! ";


Автор: mrbrooks 30.1.2009, 08:44
Цитата(Mpak @  30.1.2009,  01:11 Найти цитируемый пост)
ну это из разряда, что ансистроки нельзя складывать

ага. по научному оператор  += в классе AnsiString не перегружен.

Что касается сабжа - то изменение четвертого бита никаких изменений для цвета не даст - это будет малозаметный оттенок. Что бы визуализировать пиксел на фоне по логике надо менять старшие биты. Здесь думается смещением работать не очень кошерно - bitset более уместен - ибо рисунки то бывают разные по битности изображения. 

Автор: taiven 30.1.2009, 12:51
Цитата(mrbrooks @  29.1.2009,  16:29 Найти цитируемый пост)
иначе будет ошибка при компиляции

скорее всего зависит от версии копилятора... 

Цитата(Mpak @  30.1.2009,  00:11 Найти цитируемый пост)
ну это из разряда, что ансистроки нельзя складывать

на самом деле можно... опять же зависит от версии билдера скорее всего. 


Автор: mrbrooks 30.1.2009, 13:07
Цитата(taiven @  30.1.2009,  12:51 Найти цитируемый пост)
скорее всего зависит от версии копилятора... 

C++ Builder 2009
Цитата(taiven @  30.1.2009,  12:51 Найти цитируемый пост)
на самом деле можно... опять же зависит от версии билдера скорее всего. 

 smile в  2009 перегружена эта операция для строк

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)