Замаскируйте белый цвет из изображения в формате PNG или GIF, перенесите его на холст любым цветом

#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, но было принято в качестве ответа, поскольку намекает на возможно медленный способ создания собственного. (И потому, что вопрос старый и ответов больше не получил. :))