img+canvas+transparent

0

Witam,
Mam następujący problem: tworzę sobie listę obiektów klasy TImage, w ten sposób, że kliknięcie buttona tworzy obiekt na (powiedzmy) całą formę, następnie sobie na tym obiekcie rysuję (tylko linie na cavasie), a po zakończeniu rysunek jest przycinany tylko do tej przestrzeni ile zajmuje. Kolejne obiekty oczywiście nakładają się jeden na drugi.
I teraz sprawa jest taka: chciałbym żeby te nowotworzone obiekty były przezroczyste (żeby te pod spodem "prześwitywały"). Od razu mówię, że transparent:True nie przynosi efektu.
Czy można prosić o poradę w tej sprawie?

0

a staje się cokolwiek przezroczyste?
bo jak masz np. tło o kolorze białym które ma się stać przezroczyste to dajesz:
Image1.Transparent := True;
Image1.Picture.Bitmap.Mask(clWhite);
jeśli nie masz ustawione maski to za kolor przezroczysty ustawia się kolor piksela w lewym dolnym rogu

0

Ustawienie koloru przezroczystości czy to przez maskę czy przez img.Picture.Bitmap.TransparentColor w ogóle uniemożliwia rysowanie (?).
Wrzucę może to co mam:

onClik buttona:

img:=TImage.Create(Self);
img.Parent:=Self;
img.Top:=50;
img.Left:=0;
img.Width:=Form1.Width-100;
img.Height:=Form1.Height-100;

//  img.Transparent:=True;
//  img.Picture.Bitmap.Mask(clWhite);

img.Canvas;
img.OnMouseDown:=imgMouseDown;
img.OnMouseMove:=imgMouseMove;
img.OnMouseUp:=imgMouseUp;

W imgMouseDown i imgMouseMove standard, czyli odpowiednio
img.Canvas.MoveTo(x,y);
img.Canvas.LineTo(x,y);

a w imgMouseUp:

{******
   obinanie
****}
imgList.Add(img);
0

to dołóż jeszcze coś takiego:

img.Picture.Bitmap.Width := img.Width;
img.Picture.Bitmap.Height := img.Height;

może pomoże ;)

0

W sumie jak się tak przyglądnąć, to efekt jest taki że w trakcie rysowania (tzn kliknąłem, trzymam i przesuwam), to obrazek spod spodu jest widoczny.
Ale mnie by chodziło bardziej o to, że jak mi button utworzy nowy obiekt, to żeby on już był przezroczysty (i przed rysowaniem, i w trakcie, i po).

0

To ciekawe że nie jest.. bo u mnie jakoś jest ;)

0

To ja może obnażę cały swój kod :P

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    img: TImage;
    imgList:TList;
    //klik:Boolean;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
    img:=TImage.Create(Self);
    img.Parent:=Self;
    img.Top:=50;// Form1.Top;//+100;
    img.Left:=0; //Form1.Left;//+100;
    img.Width:=Form1.Width-100; //Form1.ClientWidth;
    img.Height:=Form1.Height-100; //Form1.ClientHeight;
    img.Picture.Bitmap.TransparentColor:=clWhite;
    img.Transparent:=True;
    //img.Picture.Bitmap.Mask(clWhite);
    img.Picture.Bitmap.Width:=img.Width;
    img.Picture.Bitmap.Height:=img.Height;
//    img.Canvas;
    img.OnMouseDown:=Image1MouseDown;
    img.OnMouseMove:=Image1MouseMove;
    img.OnMouseUp:=Image1MouseUp;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  imgList:=TList.Create;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  img.Canvas.MoveTo(x,y);
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then
    img.Canvas.LineTo(x,y);
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var i,j:Integer;
    koniec_petli:Boolean;
begin
  koniec_petli:=False;
  // obetnij to prawego końca obiektu
  for i:=img.Picture.Width downto 0 do
    if koniec_petli then break else
    for j:=0 to img.Picture.Height do
      if img.Canvas.Pixels[i,j] = clBlack then
        begin
        img.Width:=i+1;
        koniec_petli:=True;
        break;
        end;
  koniec_petli:=False;

  imgList.Add(img);
end;

end.

Może ja po prostu czegoś nie dostrzegam, albo coś pomijam :(

0

Nie wiem czy masz.. ale by sie przydało... do kodu projektu przed Application.Run dodać

Application.MainForm.DoubleBuffered := True;

to nie będzie migać, u mnie wszystko działa jakoś :)

a poza tym.. mógłbyś już zadbać o to by przy zamykaniu aplikacji usuwać te Image'sy z pamięci ;)

0

DoubleBuffered jest.
Nie wiem, co jest w takim razie nie tak:( Jestem już tak zdesperowany, że wrzucam screen'y:P

Na tym kliknąłem button pierwszy raz i coś nabazgrałem (na razie ok)
user image

A teraz kliknąłem button drugi raz chcąc mieć nowy image ponad tamtym, ale widzieć ten spod spodu, a tu lipa:P
user image

0

lol to ciekawe .. u Ciebie jakby ta przezroczystość się nie włączała.. ale u mnie (po skopiowaniu słowo w słowo tego kodu co podałeś) działa wszystko dobrze ;P

tu masz ten program skompilowany i jego źródło:
www.arthan.yoyo.pl/else/canvas0.rar

0

[glowa] Hmmm dziwne, bo ja na serio nawet u ciebie tego nie widzę:P
Kurdę ja chce rysować jak na kalkomanii, coś takiego jak warstwy (spod których przecież widać te co są pod spodem) w photoshopie czy gimpie... Czemu Delphi tego nie potrafi :P

0

Delphi potrafi.. i robi...
Moje zrzuty ekranu wyglądają tak:
Po pierwszym kliknięciu i nabazgraniu czegoś:
http://www.arthan.yoyo.pl/else/screen1.jpg

Po drugim kliknięciu i kolejnych bazgrołach:
http://www.arthan.yoyo.pl/else/screen2.jpg

chyba masz jakiegoś dziwnego kompa :/

0

O ja pierdziele, Mistrzu! U ciebie to działa idealnie tak jak chciałem....
Ale czemu u mnie nie ;-( Sprawdziłem na dwóch kompach... Może to wina XP?
Eh, chyba sobie odpuszczę:(

1 użytkowników online, w tym zalogowanych: 0, gości: 1