Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как инвертировать цвета TBitmap? [XP]


savyhinst ©   (2008-07-16 09:57:00) 

Здраствуйте.
Подскажите пожалуйста, как нивертировать цвета TBitmap;
Как я делал:

class procedure TSteelfGlyphs.InvertBitmap(const bmp:TBitmap);
var
 x,y,w,h:integer;
begin
 w:=bmp.Width-1;
 h:=bmp.Height-1;
 for x:=0 to w do
 begin
   for y:=0 to h do
   with bmp.Canvas do
   begin
     pixels[x,y]:=not pixels[x,y];
   end;
 end;
end;

-так не работает.
Спасибо за внимание.


Ega23   (2008-07-16 11:06:00) [1]


> Как ты это узнал?


ЕМНИП, в описании формата что-то под палитру отводится. В соответствии с этим выделяется размер под пиксели. И если у тебя строго 2 цвета, то при палитре в TrueColor тебе на описание каждого пикселя нужно 4 байта (3 + альфа-канал), то в монохроме в те же 4 байта 32 пикселя влезут.

Ну это так, условно всё.


savyhinst   (2008-07-16 11:00:00) [2]

ХмХм. Всем спасибо. InvertRect(Canvas.Handle, R); подошёл больше всего, т.к. делать ничего особенного не надо =]


> Johnmen ©   (16.07.08 10:50) [14]

Как я это узнал? догадался, так как при сохранении из MS Paint в формат Монохромный рисунок, bmp рисунок занимает подозрительно мало места. Меньше байт, чем получалось умножением его длины на ширину.


{RASkov}   (2008-07-16 10:56:00) [3]

> Как инвертировать цвета TBitmap?

InvColor:=Color xor $FFFFFF;


Johnmen   (2008-07-16 10:50:00) [4]


> на каждую точку приходится по одному биту?

Как ты это узнал?


Jeer   (2008-07-16 10:26:00) [5]

Тебе уже советовали:
TColor + F1


savyhinst   (2008-07-16 10:25:00) [6]

У меня тут появился такой вопрос: а если у меня картинка о двух цветах, чёрно-белая, и на каждую точку приходится по одному биту?


Jeer   (2008-07-16 10:25:00) [7]

Вариант:

 var
   R:  TRect;
...
 with Image1.Picture.Bitmap do
 begin
   R := Rect(0, 0, Width, Height);
   InvertRect(Canvas.Handle, R);
 end;
 Image1.Invalidate;


brother   (2008-07-16 10:24:00) [8]

те так

function InvertColor(AValue: TColor): TColor;
var r, g, b: byte;
begin
r := GetRValue(AValue);
g := GetRValue(AValue);
b := GetRValue(AValue);
Result := RGB(255-r, 255-g, 255-b);
end;
?
зы под рукой делфи нет проверить...


clickmaker   (2008-07-16 10:22:00) [9]

хотя да. Лучше 255 -


Jeer   (2008-07-16 10:20:00) [10]

На всякий случай, вдруг поможет :)


clickmaker   (2008-07-16 10:20:00) [11]

function InvertColor(AValue: TColor): TColor;
var r, g, b: byte;
begin
 r := GetRValue(AValue);
 g := GetRValue(AValue);
 b := GetRValue(AValue);
 Result := RGB(not r, not g, not b);
end;

?


brother   (2008-07-16 10:20:00) [12]

> ТАК: не работает
> classprocedure TSteelfGlyphs.InvertBitmap(const bmp:TBitmap)
> ;
> var
> pixs:PByteArray;
> x,y,w,h:integer;
> begin
> w:=bmp.Width-1;
> h:=bmp.Height-1;
> for y:=0 to h do
> begin
>   pixs:=bmp.ScanLine[y];
>   for x:=0 to w do
>   begin
>     pixs[x]:=not pixs[x];
>   end;
> end;
> end;

это зачем?


Jeer   (2008-07-16 10:17:00) [13]

invRed, myRed: byte;

invRed := 255 - myRed;
аналогично с G и B


savyhinst   (2008-07-16 10:16:00) [14]

ТАК: не работает
class procedure TSteelfGlyphs.InvertBitmap(const bmp:TBitmap);
var
 pixs:PByteArray;
 x,y,w,h:integer;
begin
 w:=bmp.Width-1;
 h:=bmp.Height-1;
 for y:=0 to h do
 begin
   pixs:=bmp.ScanLine[y];
   for x:=0 to w do
   begin
     pixs[x]:=not pixs[x];
   end;
 end;
end;


brother   (2008-07-16 10:09:00) [15]

> not pixels[x,y];

не факт... от многих параметров зависит


Ega23   (2008-07-16 10:08:00) [16]

TColor + F1


clickmaker   (2008-07-16 10:07:00) [17]

Bitmap.ScanLine


Наверх

Титульная страница Поиск, карта сайта Написать письмо