Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.17;
Скачать: CL | DM;

Вниз

Как инвертировать цвета TBitmap?   Найти похожие ветки 

 
savyhinst ©   (2008-07-16 09:57) [0]

Здраствуйте.
Подскажите пожалуйста, как нивертировать цвета 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;

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


 
clickmaker ©   (2008-07-16 10:07) [1]

Bitmap.ScanLine


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

TColor + F1


 
brother ©   (2008-07-16 10:09) [3]

> not pixels[x,y];

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


 
savyhinst ©   (2008-07-16 10:16) [4]

ТАК: не работает
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;


 
Jeer ©   (2008-07-16 10:17) [5]

invRed, myRed: byte;

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


 
brother ©   (2008-07-16 10:20) [6]

> ТАК: не работает
> 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;

это зачем?


 
clickmaker ©   (2008-07-16 10:20) [7]

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;

?


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

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


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

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


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

те так

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;
?
зы под рукой делфи нет проверить...


 
Jeer ©   (2008-07-16 10:25) [11]

Вариант:

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


 
savyhinst ©   (2008-07-16 10:25) [12]

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


 
Jeer ©   (2008-07-16 10:26) [13]

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


 
Johnmen ©   (2008-07-16 10:50) [14]


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

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


 
{RASkov} ©   (2008-07-16 10:56) [15]

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

InvColor:=Color xor $FFFFFF;


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

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


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

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


 
Ega23 ©   (2008-07-16 11:06) [17]


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2008.08.17;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
2-1216035531
small
2008-07-14 15:38
2008.08.17
Сеть


2-1215500811
matriza
2008-07-08 11:06
2008.08.17
Excel. Узнать координату ячейки


2-1215802076
Jimmy
2008-07-11 22:47
2008.08.17
ScrollBar


2-1215703846
buzb
2008-07-10 19:30
2008.08.17
Как узнать текущую папку проэкта?


1-1196785219
necromancer
2007-12-04 19:20
2008.08.17
Поиск по тексту