Столкнулся с удивительной для меня проблемой. Если пиксель не имел цвета(в программе(aseptite) закрашивал только определённые пиксели), то Delphi не устанавливает ей новый цвет. Подскажите как с этим бороться, пожалуйста. Как установить новый цвет такому пикселю?
Вот пример картинки с бесцветными пикселями
код изменения пикселей работает корректно, просто он не меняет бесцветные пиксели
код работы с изображением
if OpenDialog.Execute then
path := OpenDialog.FileName;
Cypher.pngForWork := Png.Create(opendialog.filename);
for var i := 0 to 40 do
Cypher.pngForWork.SetPixelColor(i, 0, 139, 0, 255);
Cypher.pngForWork.SaveResult('change.png');
код класса
unit Picture;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Rand, Vcl.Imaging.pngimage, jpeg;
type
Png = class
picture: TPngImage;
constructor Create(path:string);
procedure LoadPicture(path:string);
procedure SaveResult(filename:string);
function GetByteFromColor(color:TColor):TArray<Byte>;
function GetPartOfByteFromColorByte():string;
procedure SetPixelColor(x, y:integer; r, g, b:byte);
function GetPixelColor(x, y:integer):TColor;
end;
implementation
constructor Png.Create(path:string);
begin
LoadPicture(path);
end;
procedure Png.LoadPicture(path:string);
begin
picture := TPngImage.Create;
picture.loadfromfile(path);
end;
procedure Png.SaveResult(filename:string);
begin
picture.SaveToFile(filename)
end;
procedure Png.SetPixelColor(x, y:integer; r, g, b:byte);
begin
var color:Tcolor := RGB(r, g, b);
// showmessage(string.Format('%d %d %d', [GetRValue(color),GetGValue(color),GetBValue(color)]));
picture.Canvas.Pixels[x, y] := color;
end;
function Png.GetPixelColor(x, y:integer):TColor;
begin
Result := picture.Canvas.Pixels[y, x];
end;
function Png.GetByteFromColor(color:TColor):TArray<Byte>;
begin
end;
function Png.GetPartOfByteFromColorByte():string;
begin
end;
end.