Вопрос пользователя заключается в необходимости удаления белого фона из изображения в формате BMP, загруженного в TBitmap, и последующей конвертации в PNG с прозрачным фоном. Изображение состоит из белого фона и чёрных линий без антиалиасинга. Также рассматривается возможность замены цвета линий. Для работы используется среда разработки Delphi XE3, и предпочтительно избегать использования сторонних библиотек, за исключением FreeImage, если это необходимо.
Решение проблемы
Для решения поставленной задачи можно использовать следующий подход:
Изменение формата пикселей изображения на pf1Bit. Это позволит обрабатывать изображение как бинарное, где каждый пиксель будет иметь только два состояния: фон или линия.
Создание палитры с двумя цветами: один для фона, другой для линий. Значения цветов в палитре можно задать в соответствии с желаемыми.
Создание объекта TPNGImage, присваивание ему обработанного TBitmap и установка прозрачности для PNG.
Пример кода на Object Pascal (Delphi), демонстрирующий вышеописанные шаги:
Type
TMyPalette = Packed Record
palVersion : Word;
palNumEntries : Word;
palPalEntry : Array [0..1] of TPaletteEntry;
End;
Procedure ChangeBlackColor(bmp:TBitMap);
var
pal:TMyPalette;
begin
bmp.PixelFormat := pf1Bit;
bmp.HandleType := bmDIB;
With pal Do
Begin
palVersion:=$0300;
palNumEntries:=2;
palPalEntry[0].peRed:= $FF; // Белый цвет фона
palPalEntry[0].peGreen:=$00;
palPalEntry[0].peBlue:= $00;
palPalEntry[0].peFlags:=PC_BLACK; // Прозрачный цвет
palPalEntry[1].peRed:= $00; // Черный цвет линии
palPalEntry[1].peGreen:=$00;
palPalEntry[1].peBlue:= $FF; // Можно изменить на другой цвет
palPalEntry[1].peFlags:=PC_WHITE; // Непрозрачный цвет
End;
bmp.Palette := CreatePalette(pLogPalette(@pal)^);
end;
procedure TForm3.Button1Click(Sender: TObject);
var
png:TPngimage;
bmp:TBitmap;
begin
// Загрузка изображения в TBitmap
bmp := LoadBitmapFromFile('path_to_your_map_image.bmp');
// Изменение цвета линий
ChangeBlackColor(bmp, clRed); // Заменить на нужный цвет
// Создание PNG с прозрачным фоном
png:=TPngimage.Create;
try
png.Assign(bmp);
png.TransparentColor := clWhite; // Цвет фона, который будет прозрачным
png.Transparent := true;
// Сохранение результата в PictureBox или на диск
Image2.Picture.Assign(png);
finally
png.Free;
end;
end;
// Функция ChangeBlackColor может быть дополнена параметром для указания цвета линий
Procedure ChangeBlackColor(bmp:TBitMap; NewColor: TColor);
begin
// ... (код из предыдущей процедуры)
// Здесь может быть условие для изменения цвета линии в соответствии с NewColor
end;
Обратите внимание, что для работы с PNG изображениями необходимо включить в проект соответствующие модули из библиотеки PNGImage. Также важно правильно указать цвета в палитре, чтобы достичь желаемого результата.
Примечание
В примере кода использованы константы PC_BLACK и PC_WHITE, которые являются псевдонимами для указания прозрачного и непрозрачного цветов соответственно. В реальной программе их значения могут быть заданы как произвольные числа, не используемые в палитре для других цветов, чтобы обеспечить их идентификацию как "прозрачный" и "непрозрачный".
Используя данный подход, вы сможете удалить белый фон из изображения и конвертировать его в PNG с прозрачным фоном, а также заменить цвет линий на желаемый.
Удалить белый фон из изображения BMP и сохранить его в формате PNG с прозрачным фоном, используя среду разработки Delphi XE3 без использования сторонних библиотек, за исключением возможного применения FreeImage.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.