AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Schwarzer Bereich aus Bitmap entfernen
Thema durchsuchen
Ansicht
Themen-Optionen

Schwarzer Bereich aus Bitmap entfernen

Ein Thema von dinosaur · begonnen am 14. Dez 2004 · letzter Beitrag vom 16. Dez 2004
Antwort Antwort
dinosaur

Registriert seit: 6. Dez 2004
16 Beiträge
 
#1

Schwarzer Bereich aus Bitmap entfernen

  Alt 14. Dez 2004, 23:10
Hallo,

Ich habe ein Bitmap, bei dem sehr viel schwarz um die eigentliche "Zeichnung" herum ist.
Meine Frage ist nun, wie ich den schwarzen Teil wegschneiden kann, sodass nur noch ein Bild mit dem Tatsächlichen Inhalt da ist?

beim angehängten Beispiel möchte ich also nur den rot eingeramten bereich haben, der rest soll wegfallen
Miniaturansicht angehängter Grafiken
rand.gif  
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Schwarzer Bereich aus Bitmap entfernen

  Alt 14. Dez 2004, 23:21
Du könntest per Delphi-Referenz durchsuchencopyrect den Kasten rausschneiden, wenn du weisst, wo er ist. Du kannst dabei aber auch eine Farbe festlegen, die dann transparent wird. Ich glaube, du müsstest nach Delphi-Referenz durchsuchencopymode schauen.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
dinosaur

Registriert seit: 6. Dez 2004
16 Beiträge
 
#3

Re: Schwarzer Bereich aus Bitmap entfernen

  Alt 14. Dez 2004, 23:26
Mein Problem ist, dass ich eben nicht weiss, wo genau der "Kasten" und wie gross er ist, da das bild veränderbar ist (verschiedene grössen / inhalt / position)
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Schwarzer Bereich aus Bitmap entfernen

  Alt 14. Dez 2004, 23:31
Dann "scanne" das Bild linienweise von oben, unten, links und rechts an in Richtung mitte ab, und sobald eine andere Farbe als Schwarz auftaucht, hast du die gesuchte Begrenzung. Dann mit einer der vielen Copy-Möglichkeiten auschneiden (CopyRect, BitBlt müsste auch gehen, etc.)

UND: Herzlich wilkommen an Board!
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
dinosaur

Registriert seit: 6. Dez 2004
16 Beiträge
 
#5

Re: Schwarzer Bereich aus Bitmap entfernen

  Alt 14. Dez 2004, 23:34
danke für die begrüssung

Ich werde morgen versuchen eine Funktion zu machen.. Wenn ich mir das so überlege, muss ich mit scanline von oben nach unten, dann von unten nach oben, von links nach rechts und von rechts nach links durchgehen.. gibts auch ne einfachere Variante oder muss ich das so machen ?

Das eigentlich e Ausschneiden ist nicht das problem, sondern möglichst einfache finden der koordinaten
  Mit Zitat antworten Zitat
DerDan

Registriert seit: 15. Nov 2004
Ort: Donaueschingen
251 Beiträge
 
Delphi XE3 Professional
 
#6

Re: Schwarzer Bereich aus Bitmap entfernen

  Alt 14. Dez 2004, 23:39
Du möchtest das Bild automatisch verkleinern ?

dann kannst du etwa so vorgehen:


Delphi-Quellcode:
pPixelLine := Bmp.ScanLine [0];
BackColor := pPixelLine^.[0];

// oberste BMP Zeile suchen die nicht einfarbig ist:
Top := -1;
for Y := 0 to Bmp.Height do
begin
  pPixelLine = Bmp.ScanLine [y];
  for x := 0 to bmp.Width do
  begin
    if BakcColor <> pPixelLine^.[0] then
    begin
       Top := y;
       break;
    end;
    if Top >= 0 then begin
      break;
    end;
  end;
end;
dann suchst du noch
von unten nach oben,
von rechts nach links und
von links nach rechts
um alle vier Kanten
deines neuen Rechtecks zu ermitteln.

dann noch ausschneiden -> fertig

die Typen von
BackColor und pPixelLine
sind davon abhängig in welchem Format deine Bmp daherkommt.

das kann man mit bmp.PixelFormat abfragen


DerDan
nichts ist so schön wie man es sich vorstellt
  Mit Zitat antworten Zitat
dinosaur

Registriert seit: 6. Dez 2004
16 Beiträge
 
#7

Re: Schwarzer Bereich aus Bitmap entfernen

  Alt 16. Dez 2004, 11:11
Von oben-nach-unten und von unten-nach-oben Geht ja schon gut, Kriege es aber im moment nicht auf die Reihe

von links nach rechts zu suchen und umgekehrt.. Scanline nimmt ja immer eine Horizontale Zeile

Delphi-Quellcode:
function TForm1.RemoveBlack(Picture: TBitmap): TBitmap;
type
  PixArray = Array [1..3] of Byte;
var
  p: ^PixArray;
  FirstTop,FirstLeft, FirstBottom, FirstRight, h,w: Integer;
  Pic: TBitmap;

begin
  FirstTop:=-1;
  FirstLeft:=-1;
  FirstBottom:=-1;
  FirstRight:=-1;

  Pic:=TBitmap.Create;
  Pic.Assign(Picture);
  Pic.PixelFormat:=pf24bit;

  For h:=0 to Pic.Height-1 do
  begin
    p:= Pic.ScanLine[h];
    For w:=0 to Pic.Width-1 do
    begin
      if (p^[1]<>0) OR (p^[2]<>0) OR (p^[3]<>0) then
      begin
        FirstTop:=h;
        break;
      end;
      inc(p)
    end;
   if (FirstTop >= 0) then break;
  end;

  For h:=Pic.Height-1 downto 0 do
  begin
    p:= Pic.ScanLine[h];
    For w:=0 to Pic.Width-1 do
    begin
      if (p^[1]<>0) OR (p^[2]<>0) OR (p^[3]<>0) then
      begin
        FirstBottom:=h;
        break;
      end;
      inc(p)
    end;
   if (FirstBottom >= 0) then break;
  end;

  Showmessage('Y1:' +inttostr(FirstTop)+'Y2:' +inttostr(FirstBottom));
end;
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:51 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