Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   GDI + tif - MultiPage - Bild wird dunkler (https://www.delphipraxis.net/169251-gdi-tif-multipage-bild-wird-dunkler.html)

bernhard_LA 6. Jul 2012 13:59

GDI + tif - MultiPage - Bild wird dunkler
 
beim extrahieren aller Pages aus einer tif DAtei , sind jetzt die einzelnen Bitmaps sehr viel Dunkler abspeicherts als das Original
kann ich hier mit GDI + den ursprünglichen Wert beibehalten ?


erster Post zu diesem Thema ( http://www.delphipraxis.net/169243-e...ml#post1173787 )

Bummi 6. Jul 2012 14:10

AW: GDI + tif - MultiPage - Bild wird dunkler
 
hast Du mal probiert was passiert wenn Du sie als PNG's speicherst, gegf. hat es etwas mit den TEncoderParameters zu tun, ich habe diese bisher nie gebraucht ...
die Grundsätzlich Verwendung funktioniert wohl so
Delphi-Quellcode:
        Wert := 2;
        encoderParameters.Count := 1;
        encoderParameters.Parameter[0].Guid := EncoderCompression;
        encoderParameters.Parameter[0].Type_ := EncoderParameterValueTypeLong;
        encoderParameters.Parameter[0].NumberOfValues := 1;
        encoderParameters.Parameter[0].Value := @Wert;

bernhard_LA 6. Jul 2012 14:22

AW: GDI + tif - MultiPage - Bild wird dunkler
 
Liste der Anhänge anzeigen (Anzahl: 1)
er ändert den DPI Wert und die Farbtiefe , probiere den Tipp mit png mal aus

bernhard_LA 6. Jul 2012 14:34

AW: GDI + tif - MultiPage - Bild wird dunkler
 
Liste der Anhänge anzeigen (Anzahl: 1)
der Farbrange wird von 74 ..... 180 auf 90 ...110 zusammengefahren, :(

Bummi 6. Jul 2012 14:52

AW: GDI + tif - MultiPage - Bild wird dunkler
 
Die Auflösung wird ja standardmäßig auf 32 Bit aufgezogen, vielleicht hast Du Lust mit folgendem Schnipsel zu experimentieren?

Delphi-Quellcode:
procedure TForm5.Button2Click(Sender: TObject);
var
   encoderClsid: TGUID;
   MulitFrameImage: TGPImage;
   PageIndex : Integer;
   NewFilename : String;
   dest:TGPBitmap;
   G:TGPGraphics;
begin

    MulitFrameImage := TGPImage.Create('C:\temp\MultiFrame.tif');


    GetEncoderClsid('image/png', encoderClsid);
    for PageIndex:= 0 to GetFrameCount(MulitFrameImage) - 1 do
    begin
        MulitFrameImage.SelectActiveFrame(FrameDimensionPage, PageIndex);
                                                                                  //>> hier ist Platz zum expriementieren
        dest:=TGPBitmap.Create(MulitFrameImage.GetWidth,MulitFrameImage.GetHeight,PixelFormat16bppRGB565);
        g := TGPGraphics.Create(dest);
        g.DrawImage(MulitFrameImage,MakePoint(0,0));
        NewFilename := 'c:\temp\b' + IntToStr(pageIndex)+'.png';
        dest.Save( WideString(NewFilename), encoderClsid, nil );
        g.Free;
        Dest.Free;
    end;
   MulitFrameImage.Free;
end;

bernhard_LA 6. Jul 2012 17:45

AW: GDI + tif - MultiPage - Bild wird dunkler
 
haben einen interessanten link für DELPHI und GDI+ gefunden http://trac.assembla.com/delphiexter...Decoders?rev=1


bin noch am lesen und experimentieren

Bummi 6. Jul 2012 17:53

AW: GDI + tif - MultiPage - Bild wird dunkler
 
Das und noch mehr ist doch in dem Paket von http://www.progdigy.com/ unter Demos bereits enthalten :?::?:

EWeiss 6. Jul 2012 18:46

AW: GDI + tif - MultiPage - Bild wird dunkler
 
Zitat:

Zitat von Bummi (Beitrag 1173843)
Das und noch mehr ist doch in dem Paket von http://www.progdigy.com/ unter Demos bereits enthalten :?::?:

Es sollte kein problem sein mit GDI+ die Bilder verlustfrei in jegliches Format zu speichern.
Wie Bummi schon sagt eine frage der encoder parameter.

gruss

Namenloser 6. Jul 2012 19:57

AW: GDI + tif - MultiPage - Bild wird dunkler
 
Unterstützt TIF Gamma-Korrektur? Falls ja, könnte es damit zusammenhängen. Bei PNGs kenne ich solche Probleme...

bernhard_LA 6. Jul 2012 21:03

AW: GDI + tif - MultiPage - Bild wird dunkler
 
bin auf der suche nach zwei Anweisung von diesem Typ :

Delphi-Quellcode:
   

  encoderParameters.Count := 1;
  encoderParameters.Parameter[0].Guid := EncoderCompression;
  encoderParameters.Parameter[0].Type_ := EncoderParameterValueTypeLong;
  encoderParameters.Parameter[0].NumberOfValues := 1;
  encoderParameters.Parameter[0].Value := @CompressionValue;


  encoderParameters.Count := 2;
  encoderParameters.Parameter[1].Guid := EncoderColorDepth;
  encoderParameters.Parameter[1].Type_ := EncoderParameterValueTypeLong;
  encoderParameters.Parameter[1].NumberOfValues := 1;
  encoderParameters.Parameter[1].Value := @ColorDepthValue;

  ColorDepthValue := PixelFormat16bppGrayScale;
a) compression auf none zu setzen
http://www.universalthread.com/ViewP...le.aspx?ID=864


b) Farbtiefe auf 256 bit

himitsu 7. Jul 2012 04:02

AW: GDI + tif - MultiPage - Bild wird dunkler
 
Zitat:

Zitat von NamenLozer (Beitrag 1173854)
Unterstützt TIF Gamma-Korrektur?

TIFF selber kennt erstmal nicht viel, denn es ist nur ein Containerformat und als Bildformat kann sehr viel darin enthalten sein, wie z.B. JPEG oder Bitmap.
Selber speicher ich in unseren TIFFs die Bilder als LZW-komprimiertes Bitmap, also so ähnlich wie auch beim PNG.

bernhard_LA 7. Jul 2012 07:18

AW: GDI + tif - MultiPage - Bild wird dunkler
 
ich hoffe mit http://www.delphipraxis.net/1173859-post10.html kann ich den Fehler umgehen,
ich muss halt nur zwei oder mehr Parameter vor dem Speichern setzen

Am allerbesten wäre es wenn ich alle Parameter auslesen und dann vor dem Speichern übergeben könnte

bernhard_LA 8. Jul 2012 15:53

AW: GDI + tif - MultiPage - Bild wird dunkler
 
Liste der Anhänge anzeigen (Anzahl: 1)
@bummi : leider ist der Ansatz mit *.png nicht erfolgreich ; Mein Rechner
ändert das Kompressionsformat und das Farbformat
PixelFormat16bppRGB565 hat auf meinem PC anscheinend keine Bedeutung :evil:

Bummi 8. Jul 2012 18:23

AW: GDI + tif - MultiPage - Bild wird dunkler
 
hast Du mal geschaut, da sind noch diverse andere Pixelformate definiert...
Im Zweifelsfalls kannst Du auch mal für die Ausgabe ein ordinäres TBitmap erzeugen, Pixelfomat und Größe festlegen und auf dessen Canvas malen.

bernhard_LA 9. Jul 2012 12:08

AW: GDI + tif - MultiPage - Bild wird dunkler
 
ich denke mein Problem besteht darin :

egal mit welchen Parametern ich die Tiff oder png Datei ertselle,
dieser Mistkerl (mein PC) verwendet immer seine default Werte
(dabei setzt er die Kompression auf LWZ, setzt die DPI Werte und ändert das Farb-Schema)

Dieser Code hat bei Mir halt keine Wirkung :
dest.Save(WideString(NewFilename), encoderClsid, @encoderParameters);


Delphi-Quellcode:


procedure TGDIPMainForm.btn_splitt_tif_fileClick(Sender: TObject);
var
  encoderClsid: TGUID;
  encoderParameters: TEncoderParameters;
  // parameterValue: TEncoderValue;


  CompressionValue: ULONG;
  ColorDepthValue: ULONG;
  quality: ULONG;

  stat: TStatus;
  MulitFrameImage: TGPImage;
  PageIndex: integer;
  PageCount: integer;
  NewFilename: String;
  dest: TGPBitmap;
  g: TGPGraphics;

begin

  stat_main.SimpleText := ' processing ' + edt_imagefilename.Text;

  RootFolder := edt_outFolder.Text;

  /// Get an tif image from the disk.
  MulitFrameImage := TGPImage.Create(edt_imagefilename.Text);

  /// Get the CLSID of the JPEG, TIFF ... encoder.
  GetEncoderClsid('image/png', encoderClsid);

  /// Before we call Image::Save, we must initialize an
  /// EncoderParameters object. The EncoderParameters object
  /// has an array of EncoderParameter objects. In this
  /// case, there is only one EncoderParameter object in the array.
  /// The one EncoderParameter object has an array of values.
  /// In this case, there is only one value (of type ULONG)
  /// in the array. We will let this value vary from 0 to 100




  // encoderParameters.Count := 2;
  // encoderParameters.Parameter[1].Guid := EncoderCompression;
  // encoderParameters.Parameter[1].Type_ := EncoderParameterValueTypeLong;
  // encoderParameters.Parameter[1].NumberOfValues := 2;
  // encoderParameters.Parameter[1].Value := @CompressionValue;


  // encoderParameters.Count := 1;
  // encoderParameters.Parameter[0].Guid := EncoderColorDepth;
  // encoderParameters.Parameter[0].Type_ := EncoderParameterValueTypeLong;
  // encoderParameters.Parameter[0].NumberOfValues := 1;
  // encoderParameters.Parameter[0].Value := @ColorDepthValue;

  // ColorDepthValue := PixelFormat16bppGrayScale;
  // ColorDepthValue := PixelFormat16bppRGB565
  // CompressionValue := CompressionNone;

  // Save the image as ... a with quality level 0...100
  encoderParameters.Count := 1;
  encoderParameters.Parameter[0].Guid := EncoderQuality;
  encoderParameters.Parameter[0].Type_ := EncoderParameterValueTypeLong;
  encoderParameters.Parameter[0].NumberOfValues := 1;
  encoderParameters.Parameter[0].Value := @quality;
  quality := 100;

  PageCount := GetFrameCount(MulitFrameImage);

  ProgressBarPage.Min := 0;
  ProgressBarPage.Max := PageCount;

  for PageIndex := 0 to PageCount do
  begin

    ProgressBarPage.StepBy(1);

    PageFolder := 'page' + IntToStr(PageIndex) + '\';

    ThisFolder := RootFolder + PageFolder;

    CreateFolderOnDemand(ThisFolder);

    /// Display and save the page (index 0 ... MAX ).
    MulitFrameImage.SelectActiveFrame(encoderClsid, PageIndex);

    /// -------------------  VErsion TIFF ---------------------------------
    NewFilename := ThisFolder + IntToStr(PageIndex) + '__' +
      ExtractFileName(edt_imagefilename.Text);

//    stat := MulitFrameImage.Save(WideString(NewFilename), encoderClsid,
//      @encoderParameters);

    /// -------------------  Version png BUMMI ---------------------------------

    NewFilename := ChangeFileExt(NewFilename, '.png');
    dest := TGPBitmap.Create(MulitFrameImage.GetWidth,
      MulitFrameImage.GetHeight, PixelFormat16bppRGB565);
    g := TGPGraphics.Create(dest);
    g.DrawImage(MulitFrameImage, MakePoint(0, 0));
    dest.Save(WideString(NewFilename), encoderClsid, @encoderParameters);
    g.Free;
    dest.Free;

    if (stat = Ok) then
      stat_main.SimpleText := 'saved successfully (png).'
    else
      stat_main.SimpleText := ' Attempt to save failed.';

    Application.ProcessMessages;

  end;

  MulitFrameImage.Free;

end;

Bummi 9. Jul 2012 12:35

AW: GDI + tif - MultiPage - Bild wird dunkler
 
PNG:
mit PixelFormat8bppIndexed
dest.Save( WideString(NewFilename), encoderClsid, nil );

kommt es bei mir wie erwartet mit 8-Bit

wenn ich einen Encoder 'image/bmp'
geht PixelFormat16bppRGB565 , bei PNG nicht (wird 32-bit)

Ich bin nicht der Experte was die Formate angeht ....

bernhard_LA 10. Jul 2012 08:25

AW: GDI + tif - MultiPage - Bild wird dunkler
 
@Bummi : * Unterscheidet sich Dein Code von meiner Routine ?
kann leider die Tif Datei nicht Public machen

* Was wäre denn der beste Weg das ganze als TBitmap zu speichern

Bummi 10. Jul 2012 10:01

AW: GDI + tif - MultiPage - Bild wird dunkler
 
Bei mir sind die encoderParameters nil ...,da ich als PNG bzw. BMP ausgebe

bernhard_LA 19. Jul 2012 18:43

AW: GDI + tif - MultiPage - Bild wird dunkler
 
Hallo Zusammen,

vielen Dank für die echt guten Hinweise in den ganzen Threads zum Thema TIF , GDI+, Array[0..0]. Leider läuft mein Programm mit meinen Tif Bildern immer noch nicht.
Ich habe meine Aufgabe über einen Umweg (Handarbeit) gelöst, das Demo Projekt zum Thema "Tif Splitter" habe ich unter https://sourceforge.net/projects/tiffsplitdemo/ veröffentlich, vielleicht hilft es anderen oder jemand sieht noch das Problem..

Grüße

B.

Gernot Huber 20. Jul 2012 12:08

AW: GDI + tif - MultiPage - Bild wird dunkler
 
Hallo,

versuch es mal hiermit:

Delphi-Quellcode:
procedure ExtractTiffPages(aFileName: string);
var
  encoderParameters : TEncoderParameters;
  parameterValue   : TEncoderValue;

  image            : TGPImage;
  count, frameCount : UINT;
  DimensionIDs     : PGUID;
  i, j             : integer;
  encoderClsid     : TGUID;
  OutFile          : string;
  FilePath         : string;

type
  TGUIDDynArray = array of TGUID;

begin
  FilePath := ExtractFilePath(aFileName);

  Image := TGPImage.Create(aFileName);

  // Initialize the one EncoderParameter object.
  encoderParameters.Count := 1;
  encoderParameters.Parameter[0].Guid := EncoderCompression;
  encoderParameters.Parameter[0].Type_ := EncoderParameterValueTypeLong;
  encoderParameters.Parameter[0].NumberOfValues := 1;
  encoderParameters.Parameter[0].Value := @parameterValue;
  parameterValue := EncoderValueCompressionLZW;

  // How many frame dimensions does the Image object have?
  count := image.GetFrameDimensionsCount;
  GetMem(DimensionIDs, count * SizeOf(TGUID));

  // Get the list of frame dimensions from the Image object.
  image.GetFrameDimensionsList(DimensionIDs, count);

  GetEncoderClsid('image/tiff', encoderClsid);

  for i := 0 to count - 1 do
  begin
    // Get the number of frames in dimension.
    frameCount := image.GetFrameCount(TGUIDDynArray(DimensionIDs)[i]);
    for j := 0 to frameCount - 1 do
    begin
      OutFile := FilePath + IntToStr(i) + '-' + IntToStr(j) + '.tif';

      image.SelectActiveFrame(TGUIDDynArray(DimensionIDs)[i], j);
      image.Save(OutFile, encoderClsid, @encoderParameters);
    end;
  end;

  freemem(DimensionIDs);
  image.Free;
end;
Hierbei sollten die Farben erhalten beleiben.

Gruß
Gernot


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz