AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas
Thema durchsuchen
Ansicht
Themen-Optionen

Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas

Ein Thema von gordon freeman · begonnen am 30. Nov 2005 · letzter Beitrag vom 1. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von gordon freeman
gordon freeman

Registriert seit: 28. Jun 2003
Ort: Gelsenkirchen
337 Beiträge
 
Delphi 2005 Personal
 
#1

Bild ohne zu zeichnen bearbeiten - geht nicht mit Canvas

  Alt 30. Nov 2005, 16:25
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."

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
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 30. Nov 2005, 16:31
das canvas funktioniert nicht ohne das dazugehörige Bitmap

also solltest du zum zeichnen das gesamte bitmap als const oder var übergeben.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von gordon freeman
gordon freeman

Registriert seit: 28. Jun 2003
Ort: Gelsenkirchen
337 Beiträge
 
Delphi 2005 Personal
 
#3

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

  Alt 30. Nov 2005, 16:36
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
Image1.Canvas.Brush.Bitmap gefunden, aber dann hab ich ja nur das Bitmap, wie krieg ich dann die Bearbeitungsfunktionen vom Canvas?
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#4

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

  Alt 30. Nov 2005, 16:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#5

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

  Alt 30. Nov 2005, 16:44
ä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;
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von gordon freeman
gordon freeman

Registriert seit: 28. Jun 2003
Ort: Gelsenkirchen
337 Beiträge
 
Delphi 2005 Personal
 
#6

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

  Alt 30. Nov 2005, 16:50
Hi Robert,

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 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 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 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


@DGL-Luke
ich soll also das ganze Image übergeben? Hab ich das jetzt richtig verstanden?
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#7

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

  Alt 30. Nov 2005, 16:55
Zitat von gordon freeman:
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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

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

  Alt 30. Nov 2005, 17:00
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von gordon freeman
gordon freeman

Registriert seit: 28. Jun 2003
Ort: Gelsenkirchen
337 Beiträge
 
Delphi 2005 Personal
 
#9

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

  Alt 30. Nov 2005, 17:10
@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ß....


@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?
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#10

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

  Alt 30. Nov 2005, 17:19
Arghh! Schon wieder jemand beratungsresistent.

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:25 Uhr.
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