Задать вопрос
@Jut_Rut

Как установить цвет пикселю, если ранее у него не был установлен цвет?

Столкнулся с удивительной для меня проблемой. Если пиксель не имел цвета(в программе(aseptite) закрашивал только определённые пиксели), то Delphi не устанавливает ей новый цвет. Подскажите как с этим бороться, пожалуйста. Как установить новый цвет такому пикселю?

Вот пример картинки с бесцветными пикселями
6634967c080bf261151325.png
код изменения пикселей работает корректно, просто он не меняет бесцветные пиксели

код работы с изображением
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.
  • Вопрос задан
  • 98 просмотров
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Я бы не советовал работать прямо через TPngImage. Но если уж решили — надо смотреть канал прозрачности. Что-то вроде:
case picture.TransparencyMode of
ptmNone: ; // порядок, ничего не делаем
ptmBit: // если есть такие PNG — ну, придумайте сами, чё делать
            // Всё через тот же AlphaScanLine
  raise Exception.Create('1-bit transparency unsupported');  // вроде так? — давно не паскалил
ptmPartial: AlphaScanline[y]^[x] := 255;
end;


Надо признаться, «амбаркадебра» известна яростной скупкой открытых компонентов, и я даже нарывался на известные ошибки известных открытых компонентов прямо в оболочке Delphi.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы