AGB  ·  Datenschutz  ·  Impressum  







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

physikalische Kopie einer Bitmap

Ein Thema von bernhard_LA · begonnen am 10. Feb 2020 · letzter Beitrag vom 10. Feb 2020
Antwort Antwort
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#1

physikalische Kopie einer Bitmap

  Alt 10. Feb 2020, 13:31
wir wollen von einer TBitmap in eine andere Bitmap kopieren und verwenden das assign commando
Aktuelle Fehler : das Bitmap zeigt ein anderes Muster, wir könnnen und den Inhalt nicht erklären



bitmap1.assign (bitmap2) ;


hat oft funktioniert, aktuell jedoch nicht. Speziell wenn das Bitmap zwischen div. Funktionsaufrufen so hin und her bewegen
  Mit Zitat antworten Zitat
Gyrospeter

Registriert seit: 11. Apr 2019
49 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: physikalische Kopie einer Bitmap

  Alt 10. Feb 2020, 14:02
Schon mit einem CopyRect probiert, ob es dann den Fehler dort auch gibt?

zb.
Code:
SR := Rect(0,0,Bitmap1.Width,Bitmap1.Height);
DR := Rect(0,0,Bitmap2.Width,Bitmap2.Height);

Bitmap2.Canvas.CopyRect(DR,Bitmap1.Canvas,SR);
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: physikalische Kopie einer Bitmap

  Alt 10. Feb 2020, 14:09
ist dieses Problem bekannt für Delphi, bug in der assign function ?
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.094 Beiträge
 
Delphi 12 Athens
 
#4

AW: physikalische Kopie einer Bitmap

  Alt 10. Feb 2020, 14:12
ist dieses Problem bekannt für Delphi, bug in der assign function ?
Eventuell zu große Bitmaps / Speicherprobleme ?
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.605 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: physikalische Kopie einer Bitmap

  Alt 10. Feb 2020, 14:18
wir wollen von einer TBitmap in eine andere Bitmap kopieren und verwenden das assign commando
Aktuelle Fehler : das Bitmap zeigt ein anderes Muster, wir könnnen und den Inhalt nicht erklären



bitmap1.assign (bitmap2) ;


hat oft funktioniert, aktuell jedoch nicht. Speziell wenn das Bitmap zwischen div. Funktionsaufrufen so hin und her bewegen
Eigentlich sollte das immer funktionieren. Wenn es nicht klappt, und es sich um multithreaded Code handelt hilft meist ein
MyBitmap.Canvas.Lock. bzw.
MyBitmap.Canvas.Unlock.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#6

AW: physikalische Kopie einer Bitmap

  Alt 10. Feb 2020, 15:55
Assign kopiert nicht den Bildinhalt.
Es kopiert nur die Referenz auf das interne TBitmapImage und die Eigenschaften Transparent, TransparentColor, TransparentMode, PixelFormat und AlphaFormat.
Vor allem bei Multithread oder wenn in den Bitmaps nachher noch was geändert wird, dann können schon komische Dinge rauskommen.
Delphi-Quellcode:
  TBitmapImage = class(TSharedImage)
  private
    FHandle: HBITMAP; // DDB or DIB handle, used for drawing
    FMaskHandle: HBITMAP; // DDB handle
    FPalette: HPALETTE;
    FDIBHandle: HBITMAP; // DIB handle corresponding to TDIBSection
    FDIB: TDIBSection;
    FSaveStream: TMemoryStream; // Save original RLE stream until image is modified
    FHalftone: Boolean; // FPalette is halftone; don't write to file
    ...
  end;
Bei Draw, CopyRect und Dergleichen passiert sowas nicht, da dort nur der Bildinhalt kopiert wird, aber der Rest nicht.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.605 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: physikalische Kopie einer Bitmap

  Alt 10. Feb 2020, 16:34
Assign kopiert nicht den Bildinhalt.
Es kopiert nur die Referenz auf das interne TBitmapImage und die Eigenschaften Transparent, TransparentColor, TransparentMode, PixelFormat und AlphaFormat.
Vor allem bei Multithread oder wenn in den Bitmaps nachher noch was geändert wird, dann können schon komische Dinge rauskommen.
Delphi-Quellcode:
  TBitmapImage = class(TSharedImage)
  private
    FHandle: HBITMAP; // DDB or DIB handle, used for drawing
    FMaskHandle: HBITMAP; // DDB handle
    FPalette: HPALETTE;
    FDIBHandle: HBITMAP; // DIB handle corresponding to TDIBSection
    FDIB: TDIBSection;
    FSaveStream: TMemoryStream; // Save original RLE stream until image is modified
    FHalftone: Boolean; // FPalette is halftone; don't write to file
    ...
  end;
Ich mag ja falsch liegen, aber folgendes Testprogramm:

Delphi-Quellcode:
procedure test;
var
  bmp1: TBitmap;
  bmp2: TBitmap;
  ScanLine1: Integer;
  ScanLine2: Integer;
begin
  bmp1 := TBitmap.Create;
  bmp1.SetSize(20, 20);
  bmp2 := TBitmap.Create;
  bmp2.Assign(bmp1);
  ScanLine1 := Integer(bmp1.ScanLine[0]);
  ScanLine2 := Integer(bmp2.ScanLine[0]);
  if Scanline1 <> Scanline2 then
    WriteLn('Unterschiedlich')
  else
    WriteLn('gleich');
end.

Liefert mir unter Delphi 2007 "unterschiedlich".
Thomas Mueller
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: physikalische Kopie einer Bitmap

  Alt 10. Feb 2020, 16:40
d.h. eine stabile Copyfunktion , ich will nachher zwei physikalische Bitmaps haben geht dann so


Delphi-Quellcode:
procedure CLoneBitmaps ( Bitmap1, Bitmap2 : TBitmap);

begin

SR := Rect(0,0,Bitmap1.Width,Bitmap1.Height);
DR := Rect(0,0,Bitmap2.Width,Bitmap2.Height);

Bitmap2.Canvas.Lock;
Bitmap2.Canvas.CopyRect(DR,Bitmap1.Canvas,SR);
Bitmap2.Canvas.Unlock;

end;

ist dies der richtige Weg ?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#9

AW: physikalische Kopie einer Bitmap

  Alt 10. Feb 2020, 17:16
Lock/Unlock brauchst vor allem bei Multithread, damit nicht zwei Zeichenoperationen gleichzeitig auf dem Bitmap arbeiten.

Delphi-Quellcode:
R := Rect(0, 0, Bitmap1.Width,Bitmap1.Height); // deine Rects sind ja gleich, da brauchst dann nur Eins
//Bitmap2.PixelFormat := Bitmap1.PixelFormat;
Bitmap2.SetSize(Bitmap1.Width, Bitmap1.Height);
Bitmap2.Canvas.CopyRect(R, Bitmap1.Canvas, R);

// bzw.

//Bitmap2.PixelFormat := Bitmap1.PixelFormat;
Bitmap2.SetSize(Bitmap1.Width, Bitmap1.Height);
Bitmap2.Canvas.Draw(0, 0, Bitmap1);

@dummzeuch: Hmmm, hab hier grad eben nur 'nen XE am Laufen, (glaub aber kaum, dass am TBitmap in den letzten Jahrzehnten viel geändert wurde)
aber procedure TBitmap.Assign(Source: TPersistent); kopiert da nirgendwo irgendwas
und selbst das TBitmap(Source).FImage.Reference; darin macht am Ende nichts.
Delphi-Quellcode:
procedure TSharedImage.Reference;
begin
  Inc(FRefCount);
end;
Aber vielleicht wird erst beim Zugriff auf die Pixels die Referenz dann aufgelöst, damit es dort dann keine weitere Referenz auf den Bildspeicher gibt.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (10. Feb 2020 um 17:21 Uhr)
  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 00:00 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