![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как инвертировать цвета 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