In Bild schwarz von weiss unterscheiden
-
Hallo!
Ich habe vor kurzem auf die anfrage wie ich eine Form beliebig anpassen kann diesen link bekommen
[url] http://www.bytesandmore.de/rad/cpp/snipp/sc02011.php [/url]In dem Programm werden zwei Ellipsen und zwei Sterne gezeichnet, mit denen bestimmt wird wie die form aussieht (ein Stern mit nem Kreis drum).
Ein in der form abgelegtes image füllt dann stern und kreis aus.Ich habe vor das Programm individuell vom User gestalten zu lassen, indem er ersteinmal mit schwartz die Fläche festlegt die das Skin belegt.
Alles was nun weiss isst wird weg geschnitten und ist nacher bei der form nicht zu sehen (Durchsichtig).
Nun kann ein Bild eingefügt werden das sozusagen als Skin dient, wobei nur die Fläche zu sehen ist die vorher im Modell schwartz war.Wie könnte ich eine solche unterscheidung zwischen schwartz und weiss erreichen und in das Programm einbinden?
-
Wenn ich das richtig sehe soll das mit Bild gefüllt werden was vorher schwarz war. Nix einfacher als das!! Wir nehmen z.B. eine Bitmap. Laden sie und strechen sie auf die größe des Formulars. Jetzt machen wir einfach eine Abfrage:
//Bitmap ist die gestrechte bitmap: for (int i = 0;i<ClientWidth;i++) { for(int j=0;j<ClientHeight;j++) { if (Form1->Piexels[i][j] == clBlack) Form1->Pixels[i][j] = Bitmap->Pixels[i][j]; } }
-
Hmmm...
Müsste das net
Form1->Canvas->Pixels[i][j]
heissen?
Auserdem glaube ich das du mich falsch verstanden hasstIch meinte das so das der User als bitmap zb. ein Haus zeichnet, einzig zugelassen sind die Farben schwartz und weiss.
Wir haben nun also ein komplett schwartzes haus als Bitmap, jetzt soll das Programm erkennen welche bereiche weiss und welche schwartz sind.
Nun wird die form mit einem Bild gefüllt.
Die Bitmap mit dem schwartzem Haus dient jetzt als so eine art Plätzchen form mit der man aus dem (Bunten) Bild nun die form ausstanzt.
-
Alles was ich brauche iss nur wie ich schw. und weiss aus der Bitmap auslese um diese bereiche dann mit
int SetWindowRgn(
HWND hWnd, // Fenster-Handle
HRGN hRgn, // Region-Handle
BOOL bRedraw // Redraw Flag
);zu bearbeiten!
-
Das kommt auf die Palette des Bildes an. Einfach auf die einzelnen Pixel des Bitmap zugreifen und die je nach Palette auswerten. Ich glaube schwarz und weis sind dabei immer der min und der max Wert. (das weis ich aber net genau) Also bei einem 256 Farben Bitmap wäre dann schwarz 0 und weis 256 oder wars doch umgekehrt.
-
Und wie greife ich auf die Bitmap Pixel zu? (Des iss neuland für mich!)
-
Momentan funzt das prog auf diese weise:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
bgNoMove = false; // Flag "Formular nicht verschieben" initialisieren// Sterne berechnen:
int X=Width/2, Y=Height/2;
HRGN R1, R2, R;
R=GetStarReg(X, Y, 100;
R1=GetStarReg(X, Y, 20);
CombineRgn(R, R, R1, RGN_DIFF);// Elliptische Regionen erzeugen:
R1=CreateEllipticRgn(10, 3, Width-6, Height-6);
R2=CreateEllipticRgn(0, 30, Width-0, Height-30);// Poligone und Ellipsen zusammenfuehren:
CombineRgn(R1, R1,R2, RGN_DIFF);
CombineRgn(R, R, R1, RGN_OR);// Fensterform setzen:
SetWindowRgn(Handle, R, FALSE);
}es berechnet einen Stern und eine Ellipse die sichtbar werden !
-
In der Hilfe unter TBitmap gibts glaub ich ein Beispiel zum Bitmap, da kannste gut sehen wie du auf die Pixel zugreifst. Außerdem kann ich in deinem oberen Code kein Bitmap entdecken auf das du zugreifen möchtest aber vielleicht is auch schon zu spät.
P.S. Was mir gerade noch einfällt. WEbFritzi (auch hier im Forum) hat mal ein Programm geschrieben, mit dem man eben solche Regionen erstellen kann, der müsste ja am besten Wissen wie ers gemacht hat, vielleicht sagt ers dir ja!
[ Dieser Beitrag wurde am 15.05.2003 um 23:31 Uhr von Bigwill editiert. ]
-
Nein in meinem Code greife ich auch garnicht auf eine Bitmap zu!
Es liegt ein Bild (belibiges Format) als Image in der Form!
Der Code Berechnet bloß den sichtbaren Bereich (Ellipse mit Stern drinn)
wie du es auf dem bild bei http://www.bytesandmore.de/rad/cpp/snipp/sc02011.php
gut sehen kannst .Mit der Bitmap will ich eben diesen sichtbaren Bereich bestimmen, und nicht mehr mit einer Berechnung von Formen!