#delphi #colors #mask #blit
#delphi #Цвет #маска #блит
Вопрос:
Источником является либо PNG, либо GIF, где пиксели, которые должны быть «раскрашены», белые. Фон может быть черным или прозрачным, в зависимости от того, что проще всего.
Теперь я хотел бы вырезать прямоугольную часть исходного текста, и использовать для этого цвет палитры (gif) или RGB (png) «кисти», чтобы «проштамповать» его на TImage / TCanvas этим цветом.
Вероятно, один из тех ленивых вопросов, для которых подойдет RTFM. Но если у вас есть хорошее решение, пожалуйста, поделитесь
Я попробовал библиотеку PNGImage от Daud, но я даже не могу заставить ее загружать исходное изображение. Есть ли хитрость в его использовании?
Решение должно работать на D7 и выше, XP и выше.
Комментарии:
1. что вы подразумеваете под d7 и выше? Вы все еще используете эту незаконную версию d7?
Ответ №1:
правильно ли я понимаю, что вы хотите изменить белый цвет на какой-то другой цвет? если это так, я думаю, вам следует проверять изображение попиксельно и проверять, какого цвета пиксель, и изменять его, если он белый.
вот как вы можете прокручивать изображение
var
iX : Integer;
Line: PByteArray;
...
Line := Image1.ScanLine[0]; // We are scanning the first line
iX := 0;
// We can't use the 'for' loop because iX could not be modified from
// within the loop
repeat
Line[iX] := Line[iX] - $F; // Red value
Line[iX 1] := Line[iX] - $F; // Green value
Line[iX 2] := Line[iX] - $F; // Blue value
Inc(iX, 3); // Move to next pixel
until iX > (Image1.Width - 1) * 3;
Вот код, который показывает, как считывать значения красного и синего и переключать их.
var
btTemp: Byte; // Used to swap colors
iY, iX: Integer;
Line : PByteArray;
...
for iY := 0 to Image1.Height - 1 do begin
Line := Image1.ScanLine[iY]; // Read the current line
repeat
btSwap := Line[iX]; // Save red value
Line[iX] := Line[iX 2]; // Switch red with blue
Line[iX 2] := btSwap; // Switch blue with previously saved red
// Line[iX 1] - Green value, not used in example
Inc(iX, 3);
until iX > (Image1.Width - 1) * 3;
end;
Image1.Invalidate; // Redraw bitmap after everything's done
но это только для растрового изображения.
если это полезно, попробуйте преобразовать ваше изображение в bitmap и затем манипулировать им.
Комментарии:
1. Спасибо. Это не маскирует PNG или GIF, но было принято в качестве ответа, поскольку намекает на возможно медленный способ создания собственного. (И потому, что вопрос старый и ответов больше не получил. :))