AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ein Bild Zerlegen

Ein Thema von Christian18 · begonnen am 17. Dez 2005 · letzter Beitrag vom 22. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2      
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#1

Ein Bild Zerlegen

  Alt 17. Dez 2005, 17:25
Hallo,

ich habe eine Grafik und die soll in Raster eingeteilt werden. Also ich will eine kleine Routine schreiben, womit ich ein Bild öffne und dann soll die Routine das Bild in 10 mal 10 pixel bilder zerlegen. ist das möglich??? wenn ja wie???

MFG Christian18
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Ein Bild Zerlegen

  Alt 17. Dez 2005, 17:28
mit copyrect kannst du einzelne Bitmapteile ausschneiden.

Zitat:
ist das möglich???
Mit Delphi ist alles möglich. Frägt sich nur noch wie viele Millionen Assemblerzeilen man dazu braucht
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#3

Re: Ein Bild Zerlegen

  Alt 17. Dez 2005, 17:29
Zitat von ichbins:
mit copyrect kannst du einzelne Bitmapteile ausschneiden.
und wie gehts dann weiter, wenn ich den ausschnitt in mein arbeitsspeicher kopiert habe?
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Ein Bild Zerlegen

  Alt 17. Dez 2005, 17:35
nein, das geht so:
Delphi-Quellcode:
var
  bmp,splitteer:tbitmap;
  r1,r2:trect;
begin
  //<-- ertmal bmp laden
  splitter:=tbitmap.create;
  splitter.width:=10;
  splitter.height:=10;
  splitter.copyrect(rect(0,0,10,10),bmp.canvas,rect(0,0,10,10));
end;
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von SleepyMaster
SleepyMaster

Registriert seit: 18. Mai 2003
634 Beiträge
 
#5

Re: Ein Bild Zerlegen

  Alt 17. Dez 2005, 18:10
Hi Christian...

ich schreibe im Moment an einer Rotine zur Bilderkennung. Hier ist mal ein kleiner Schnipsel meines Programmes, mit dem ich ein Raster in ein Bild reinbekomme. Ist jetzt keine fertige Lösung, aber vlt hilfts dir ja weiter.

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
const
  RSize = 10;
var
  x, y, i, j: integer;
  r, g, b: int64;
  Color: TColor;
begin
  y := 0;
  while y < (Image1.Picture.Bitmap.Height - RSize) do
    begin
    x := 0;
    while x < (Image1.Picture.Bitmap.Width - RSize) do
      begin
      r := 0;
      g := 0;
      b := 0;
      for i := 0 to RSize do
        for j := 0 to RSize do
          begin
          Color := Image1.Canvas.Pixels[x+i, y+j];

          r := r + GetRValue(Color);
          g := g + GetGValue(Color);
          b := b + GetBValue(Color);
          end;
      Color := RGB(Round(R / (RSize * RSize)), Round(G / (RSize * RSize)), Round(B / (RSize * RSize)));

      for i := 0 to RSize do
        for j := 0 to RSize do
          begin
          Image1.Canvas.Pixels[x+i, y+j] := Color;
          end;
      x := x + RSize;
      end;
    y := y + RSize;
    end;
end;
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#6

Re: Ein Bild Zerlegen

  Alt 17. Dez 2005, 19:18
Hi,
ja ein Raster kann das geben, du mittels doch hier Farbwerte, oder?

So oder so würde ich dir auch zu CopyRect oder Ähnliches raten. Wenn du auf einzelne Werte der Bitmap zugreifen möchtest, solltest du (hier auch ein Tipp an SleepyMaster) Pixels vermeiden, ist unheimlich langsam. Viel schneller kannst du das gleiche mit Scanline erreichen.
Das Einzigste was beim ScanLine Befehl beachtet werden sollte ist, dass man auf das Pixelformat achten muss. Wenn du nicht jeden Ausschnitt als eigenes Bitmap-Objekt brauchst, sondern nur die Farbwerte, dann solltest du einfach ein großes Array anlegen, die Daten (mittels Scanline) dort hinein kopieren und auf diese wie auf eine 10x10 Matrix zugreifen.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Benutzerbild von SleepyMaster
SleepyMaster

Registriert seit: 18. Mai 2003
634 Beiträge
 
#7

Re: Ein Bild Zerlegen

  Alt 18. Dez 2005, 15:04
Ja, ich mittel die Farbwerte. Hier jetzt mal die optimierte Funktion von mir...

Delphi-Quellcode:
function DoResize(Bitmap: TBitmap; Width, Height: integer): TBitmap;
var
  SizeX, SizeY, X1, Y1, X2, Y2, I, J, PixelsInRect: integer;
  R, G, B: int64;
  Color: TColor;
  p1, p2 : pIntegerArray;
begin
  result := TBitmap.Create;

  result.PixelFormat := pf32Bit;
  Bitmap.PixelFormat := pf32Bit;

  SizeX := trunc(Bitmap.Width / Width);
  SizeY := trunc(Bitmap.Height / Height);

  result.Width := trunc(Bitmap.Width / SizeX);
  result.Height := trunc(Bitmap.Height / SizeY);

  PixelsInRect := (SizeX + 1) * (SizeY + 1);

  Y1 := 0;
  Y2 := 0;
  while Y1 <= (Bitmap.Height - SizeY) do
    begin
    p2 := result.ScanLine[Y2];
    x1 := 0;
    X2 := 0;
    while X1 <= (Bitmap.Width - SizeX) do
      begin
      r := 0;
      g := 0;
      b := 0;
      for i := 0 to SizeY do
        begin
        p1 := Bitmap.ScanLine[y1];
        for j := 0 to SizeX do
          begin
          b := b + (p1[x1] and $0000FF);
          g := g + ((p1[x1] and $00FF00) shr 8);
          r := r + ((p1[x1] and $FF0000) shr 16);
          end;
        end;
      p2[X2] := trunc(B / (PixelsInRect)) + (trunc(G / (PixelsInRect)) shl 8) + (trunc(R / (PixelsInRect)) shl 16);
      X1 := X1 + SizeX;
      X2 := X2 + 1;
      end;
    Y1 := Y1 + SizeY;
    Y2 := Y2 + 1;
    end;
end;
Edit1: Code nochmals optimiert
Edit2: und nochmal
Edit3: Fehler ausgebessert
  Mit Zitat antworten Zitat
Cicaro

Registriert seit: 9. Feb 2005
285 Beiträge
 
Delphi 7 Personal
 
#8

Re: Ein Bild Zerlegen

  Alt 22. Dez 2005, 10:49
Zitat von ichbins:
Mit Delphi ist alles möglich. Frägt sich nur noch wie viele Millionen Assemblerzeilen man dazu braucht
Ach ja ? Dann zeig' mir mal, wie man mit Delphi eine Variable aus einer DLL exportieren kann ohne sie mit dem Rückgabewert einer Funktion zurückzugeben.
In C++ ist das möglich.

Zum Thema:
Delphi-Quellcode:
// x und y geben die Position im Raster an und Width und Height die Rasterbreite und -höhe
BitBlt(ZielCanvas.Handle,0,0,Width,Height,QuellCanvas.Handle,x*Width,y*Height,SRCCOPY);
Damit zeichnet man das Rechteck das an der Position (0,0) liegt in ein anderes Canvas.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#9

Re: Ein Bild Zerlegen

  Alt 22. Dez 2005, 10:54
Nun ja, was macht denn der Compiler aus C++-Code? Wenn es Assembler ist, hat ichbins dir die Antwort schon gegeben
  Mit Zitat antworten Zitat
Cicaro

Registriert seit: 9. Feb 2005
285 Beiträge
 
Delphi 7 Personal
 
#10

Re: Ein Bild Zerlegen

  Alt 22. Dez 2005, 11:11
Zitat von Der_Unwissende:
Nun ja, was macht denn der Compiler aus C++-Code? Wenn es Assembler ist, hat ichbins dir die Antwort schon gegeben
Das Problem, das ich da angesprochen hab', hat nichts mit dem Inline-Assembler zu tun. Der Delphi-Compiler erlaubt das direkte Exportieren einer Variablen aus einer DLL nicht. Aber wenn mich jemand etwas anderes lehrt auch gut, dann weiß ich mehr. Übrigens ich verwende Delphi 7 Enterprise, nicht, dass das zu unnötigen Diskussionen führt.
  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 08:29 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