![]() |
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:
Dann bekomm ich den Fehler "Einer Nur-Lesen-Eigenschaft kann kein Wert zugewiesen werden." :gruebel:
//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 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:
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.
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; Was mach ich falsch :wall: |
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. |
Re: Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas
Aber es gibt keinen Befehle
Delphi-Quellcode:
Kannst du mir das mit dem Bitmap genauer erklären?
Image1.Canvas.Bitmpap
//oder Image1.Bitmap Okay, hab's unter
Delphi-Quellcode:
gefunden, aber dann hab ich ja nur das Bitmap, wie krieg ich dann die Bearbeitungsfunktionen vom Canvas?
Image1.Canvas.Brush.Bitmap
|
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. |
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; |
Re: Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas
Hi Robert,
Zitat:
Zitat:
Zitat:
Zur "Kenntnis des Bildinhalts": Es ist eine einfache Bitmap mit 40*40 weißen Pixeln, nicht mehr und nicht weniger. Zitat:
@DGL-Luke ich soll also das ganze Image übergeben? Hab ich das jetzt richtig verstanden? :stupid: |
Re: Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas
Zitat:
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. |
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:
Es gibt keinen Grund, dass dein "Bildbearbeiter" direkt mit TImage oder TBitmap arbeitet.
Bildbearbeiter:= TBildbearbeiter.Create; // NICHT .Init !!
Bildbearbeiter.SourceCanvas := Image1.Canvas; // Quelle Bildbearbeiter.SchwarzWeissBild(Image2.Canvas); // ZielCanvas wird übergeben |
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? |
Re: Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas
Arghh! Schon wieder jemand beratungsresistent.
Zitat:
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 14:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz