Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas (https://www.delphipraxis.net/58053-bild-ohne-zu-zeichnen-bearbeiten-geht-nicht-mit-canvas.html)

gordon freeman 30. Nov 2005 16:25


Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas
 
Hi Leute,
ich habe auf meiner Form ein Image-Objekt mit einem Bild, dass der User hineingeladen hat. In FormCreate wird bereits ein Objekt der Klasse "TBildbearbeiter" erstellt. Dieses Objekt besitzt den Dienst "SchwarzWeissBild". Diesem Dienst soll nun das Bild übergeben werden. Er macht ein Schwarzweißbild daraus und gibt das Bild zurück. Ich hatte es also so versucht:

Delphi-Quellcode:
//in der Klasse TBildbearbeiter
function SchwarzWeissBild(pBild: TCanvas):TCanvas;
begin
//Das Bild wird verändert
end;


//In der Klasse TForm
//...
Bildbearbeiter:= TBildbearbeiter.Init;
Image1.Canvas := Bildbearbeiter.SChwarzWeissBild(Image1.Canvas);
//...
Dann bekomm ich den Fehler "Einer Nur-Lesen-Eigenschaft kann kein Wert zugewiesen werden." :gruebel:

Dann hab ich versucht das Bild per Hand zu kopieren, hat aber nicht hingehauen, er hat einfach das Bild unverändert angezeigt, hab es mit folgendem Beispiel versucht:

Delphi-Quellcode:
var x,y : integer;
bild : TCanvas;
begin
  bild := Image1.Canvas;
  bild.floodfill(1,1,clblue,fsborder);
  for x:= 0 to Image1.wisth-1 do
    for y:= 0 to Image1.Height-1 do
      Image1.Canvas.Pixels[x,y] := Bild.Pixels[x,y];
end;
Eigentlich sollte das weiße eingefügte Bild danach doch blau sein, oder? Auf jeden Fall zeigt er das weiße Bild im Original wieder genau so an.

Was mach ich falsch :wall:

DGL-luke 30. Nov 2005 16:31

Re: Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas
 
das canvas funktioniert nicht ohne das dazugehörige Bitmap ;)

also solltest du zum zeichnen das gesamte bitmap als const oder var übergeben.

gordon freeman 30. Nov 2005 16:36

Re: Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas
 
Aber es gibt keinen Befehle
Delphi-Quellcode:
Image1.Canvas.Bitmpap
//oder
Image1.Bitmap
Kannst du mir das mit dem Bitmap genauer erklären?

Okay, hab's unter
Delphi-Quellcode:
Image1.Canvas.Brush.Bitmap
gefunden, aber dann hab ich ja nur das Bitmap, wie krieg ich dann die Bearbeitungsfunktionen vom Canvas?

Robert Marquardt 30. Nov 2005 16:42

Re: Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas
 
Irgendwie ist der ganze Ansatz verquer.

Bildbearbeiter:= TBildbearbeiter.Init;

Entweder ist das eine Klassenfunktion oder ein ungewoehnlich benannter Konstruktor.
Wahrscheinlich ein Konstruktor. Bitte beim Namen Create bleiben.

Image1.Canvas := TBildbearbeiter.SChwarzWeissBild(Image1.Canvas);

SChwarzWeissBild muesste nun eine Klassenfunktion sein. Das ist wahrscheinlich ein Fehler. TBildbearbeiter statt Bildbearbeiter.

Ein Canvas kann nichts zugewiesen werden und sollte nichts zugewiesen werden.
Canvas heisst Leinwand und man malt darauf mit den Methoden die TCanvas anbietet.

Der zweite Codeblock ist Unsinn. Du weist jeden Pixel sich selbst zu.
Warum Floodfill nicht faerbt ist ohne Kenntnis des Bildinhalts nicht zu klaeren.

Alles in allem scheinst du die grundlegenden Unterschiede und Zusammenhaenge von TCanvas, TBitmap und TImage nicht zu verstehen.

DGL-luke 30. Nov 2005 16:44

Re: Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas
 
ähm.. ne... das ist eher das bitmap für das hintergrundmuster.

in dem fall hast du recht, du mussst natürlich das TImage nehmen.

also z.b.

Delphi-Quellcode:
procedure changepencolor(image:TImage,color:TColor);
bein
image.canvas.pen.color := color;
end;

gordon freeman 30. Nov 2005 16:50

Re: Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas
 
Hi Robert,

Zitat:

Zitat von Robert Marquardt
Irgendwie ist der ganze Ansatz verquer.
Bildbearbeiter:= TBildbearbeiter.Init;
Entweder ist das eine Klassenfunktion oder ein ungewoehnlich benannter Konstruktor.
Wahrscheinlich ein Konstruktor. Bitte beim Namen Create bleiben.

Ich halte mich da an die Bezeichner, die wir im Unterricht verwendet haben, also bitte ich die Diskussion mit meinem Infolehrer auszutragen.

Zitat:

Zitat von Robert Marquardt
Image1.Canvas := TBildbearbeiter.SChwarzWeissBild(Image1.Canvas);

SChwarzWeissBild muesste nun eine Klassenfunktion sein. Das ist wahrscheinlich ein Fehler. TBildbearbeiter statt Bildbearbeiter.

Ja, das stimmt. Ich werd's ändern.

Zitat:

Zitat von Robert Marquardt
Der zweite Codeblock ist Unsinn. Du weist jeden Pixel sich selbst zu.
Warum Floodfill nicht faerbt ist ohne Kenntnis des Bildinhalts nicht zu klaeren.

So unsinnig ist es nicht, denn ich habe in "Bild" das Ganze bearbeitet und weise jetzt Image1 das Canvas von "Bild" zu. Ich wollte damit versuchen, das Bild in "Bild" zu verändern und dann erst wieder ins Image zu zeichnen.

Zur "Kenntnis des Bildinhalts": Es ist eine einfache Bitmap mit 40*40 weißen Pixeln, nicht mehr und nicht weniger.

Zitat:

Zitat von Robert Marquardt
Alles in allem scheinst du die grundlegenden Unterschiede und Zusammenhaenge von TCanvas, TBitmap und TImage nicht zu verstehen.

Ja, das stimmt. Ich habe bisher nur so gearbeitet, dass ich 2 Images hatte und in der direkten Übertragung der Pixel von Image1 nach Image2 die Farbwerte manipuliert habe. Jetzt wollte ich diese Manipulation der Farbwerte durchführen, und dann in das selbe Image zeichnen. Dazu muss ich jedoch meinem Dienst irgendwie das Bild mitgeben. Und da häng ich jetzt fest :wall:


@DGL-Luke
ich soll also das ganze Image übergeben? Hab ich das jetzt richtig verstanden? :stupid:

Robert Marquardt 30. Nov 2005 16:55

Re: Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas
 
Zitat:

Zitat von gordon freeman
Delphi-Quellcode:
Image1.Canvas.Brush.Bitmap

Nein, das ist nicht die richtige Bitmap.
Brush ist der Pinsel. Der wird von den Methoden benutzt wenn etwas gefuellt werden soll.
Zusaetzlich gibt es noch den Pen = Stift der beim Malen von Linien zum Einsatz kommt.
Der Brush kann eine einfache Farbe sein, ein Muster oder eine Bitmap.

Nochmal zur Erklaerung:
Ein TImage kann ein Bild darstellen. Zu diesem Zweck hat enthaelt TImage einen Canvas, also eine Leinwand zum Malen.
Zusaetzlich enthaelt es ein TPicture das das Bild enhaelt.
TPicture enthaelt seinerseits ein TBitmap und ein TGraphic. Diese beiden sind parallel geschaltet.
Graphic enthaelt das Bild in einem der Formate die Delphi versteht. Diese Formate kann man erweitern.
Damit kannn Graphic beispielsweise ein JPeg oder ein GIF enthalten. Windows kann aber nur Bitmaps handhaben.
Daher die Parallelschaltung des TBitmap. Diese enthaelt immer das Bild als Bitmap.
Das TBitmap hat nun seinerseits einen TCanvas, damit man auf die Bitmap malen kann. Das ist erst mal nicht sichtbar, aber
Image.Canvas und Image.Picture.Bitmap.Canvas sind intern verbunden (genaugenommen ein und der selbe Canvas), daher erscheint alles was
man auf Image.Picture.Bitmap.Canvas auch auf Image.Canvas. Entsprechend erscheint auch alles was man auf Image.Canvas malt in der Bitmap.

Eine Bitmap an ein TImage zuzuweisen geht ueber

Image.Picture.Bitmap := IrgendeineAndereBitmap;

Vorher hat man IrgendeineAndereBitmap erzeugt auf die richtige Groesse gebracht und bemalt oder aus einem File geladen.

shmia 30. Nov 2005 17:00

Re: Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas
 
Du hast es mit 2 Canvas(en) zu tun: Quelle und Ziel.
Was ist die Mehrzahl von Canvas ??
Beide Canvas(e) müssen deinem Objekt von Aussen bereitgestellt werden:
Delphi-Quellcode:
Bildbearbeiter:= TBildbearbeiter.Create; // NICHT .Init !!
Bildbearbeiter.SourceCanvas := Image1.Canvas;  // Quelle
Bildbearbeiter.SchwarzWeissBild(Image2.Canvas); // ZielCanvas wird übergeben
Es gibt keinen Grund, dass dein "Bildbearbeiter" direkt mit TImage oder TBitmap arbeitet.

gordon freeman 30. Nov 2005 17:10

Re: Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas
 
@Robert
Okay, also ich habs jetzt entsprechend folgendermaßen gelöst:

Delphi-Quellcode:
Bild : TBitmap;

//...
Bild := Image1.Picture.Bitmap; //stellvertretend für Übergabe an Prozedur
Bild.Canvas.Floodfill(1,1,clblue,fsborder); //stellvertretend für Bearbeitung
Image1.Picture.Bitmap := Bild; //stellvertretend für Rückgabewert der Funktion
//...

Allerdings erscheint mein im Original rotes Bitmap jetzt einfach weiß.... :wall:


@shmia Wieso habe ich 2 Canvas(e)? Ich hab doch nur das Canvas von Image1. Das Bild auf Image1 will ich verändern und dann wieder in Image1 zeichnen. Das Problem, vor dem ich stehe ist ganz einfach,
a) Wie bekomm ich das Bild aus dem Image raus?
b) Kann ich mit dem rauskopierten Bild genau so arbeiten, wie mit einer Canvas?
C) Wie bekomm ich das bearbeitete Bild wieder rein?

Robert Marquardt 30. Nov 2005 17:19

Re: Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas
 
Arghh! Schon wieder jemand beratungsresistent.

Zitat:

Zitat von gordon freeman
@shmia Wieso habe ich 2 Canvas(e)? Ich hab doch nur das Canvas von Image1. Das Bild auf Image1 will ich verändern und dann wieder in Image1 zeichnen. Das Problem, vor dem ich stehe ist ganz einfach,
a) Wie bekomm ich das Bild aus dem Image raus?
b) Kann ich mit dem rauskopierten Bild genau so arbeiten, wie mit einer Canvas?
C) Wie bekomm ich das bearbeitete Bild wieder rein?

Wenn du auf Image1.Canvas malst, dann malt das in Image1.Picture.Bitmap und gleich angezeigt.
a) Du brauchst eine zweite Bitmap.

MyBitmap := TBitmap.Create;
MyBitmap.Assign(Image1.Picture.Bitmap); // das kopiert das ganze Bild aus Image1

b) Nun sich mit den Methoden MyBitmap.Canvas vergnuegen. Das malt auf MyBitmap und ist unsichtbar.

c)
Image1.Picture.Bitmap.Assign(Image1.Picture.MyBitm ap); // das veraenderte Bild ins Image1 zurueckkopieren
MyBitmap.Free; // die jetzt nutzlose Objekt freigeben


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:13 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz