Laden...

[erledigt] Pixelarray <> Image Konvertierung

Erstellt von Masterfire vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.902 Views
M
Masterfire Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren
[erledigt] Pixelarray <> Image Konvertierung

Guten Tag Liebe Community,

ich arbeite Grade an einem kleinen Programm für dessen Funktion es nötig ist, dass ich aus einem Imageobjekt ein Bytearray das die Pixelfarben enthält erstelle und umgedreht. Grundsätzlich habe ich das mit deisen beiden Methoden die die WPF-Klasse BitmapSource nutzen gelungen.


 public Image GetImage(Byte[] image, Image source)
        {
            Bitmap test = new Bitmap(source);
            BitmapSource bitmapsource = BitmapSource.Create(source.Width,         source.Height, source.HorizontalResolution, source.VerticalResolution, System.Windows.Media.PixelFormats.Bgr32, null, image, GetStride(test.Width, test.PixelFormat));
            return (Image)bitmapsource.ToWinFormsBitmap();
            
        }

   public Byte[] GetImageBytes(Image image)
        {
            
            Bitmap bitmap = new Bitmap(image);
            Byte[] array = new Byte[bitmap.Width * bitmap.Height * 4];
            
            BitmapSource bitmapsource = bitmap.ToWpfBitmap();
            bitmapsource.CopyPixels(array, GetStride(bitmap.Width, bitmap.PixelFormat), 0);

            return array;
        }


Das Imageobjekt "source" bei GetImage dient dem Zweck die Bildgröße des alten Bildes usw. auszulesen.

Dazu kommen noch die Erweiterungsmethoden:


    public static class BitmapConversion
    {

        public static Bitmap ToWinFormsBitmap(this BitmapSource bitmapsource)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                BitmapEncoder enc = new BmpBitmapEncoder();
                enc.Frames.Add(BitmapFrame.Create(bitmapsource));
                enc.Save(stream);

                using (var tempBitmap = new Bitmap(stream))
                {
       
                    return new Bitmap(tempBitmap);
                }
            }
        }

        public static BitmapSource ToWpfBitmap(this Bitmap bitmap)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                bitmap.Save(stream, ImageFormat.Bmp);

                stream.Position = 0;
                BitmapImage result = new BitmapImage();
                result.BeginInit();
          
                result.CacheOption = BitmapCacheOption.OnLoad;
                result.StreamSource = stream;
                result.EndInit();
                result.Freeze();
                return result;
            }
        }
    }


An sich Funktioniert das ganze wie gesagt und ich erhalte bei der Rückkonvertierung ein gültiges Imageobjekt und Abweichungen sind mit bloßem Auge nicht erkennbar.

Allerdings ist das Ergebnis eines Tests auf Gleicheit durch so eine Operation:


if (Converter.EqualContent(tempimage, Converter.GetImageBytes(Converter.GetImage(tempimage, OldImage))))

leider "false" was sich in einem nicht Funktionieren des Programms bestätigt.
D.h. das Hin und - Rückkonvertierung offensichtlich nicht Konsistent sind. Ich muss aber nunmal wieder genau dassebe Herausbekommen, wenn ich ein Image zu einem Bytearray und dann wieder zu einem Image konvertiere. Wodurch kommen die minimalen Abweichung zu stande? Was kann ich ändern?

Ich wäre für jede Hilde dankbar!
Gruß Masterfire

6.862 Beiträge seit 2003
vor 11 Jahren

Hallo,

was brauchst du denn eigentlich wirklich? Nur die Konvertierung Image <> Byte Array? Dann ist der Umweg pber WPF natürlich völliger Unsinn.

Schau dir einfach mal das Beispiel in der MSDN (BitmapData Class) an, wie man die Pixel kopieren kann.

Baka wa shinanakya naoranai.

Mein XING Profil.

M
Masterfire Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren

Ja genau das brauche ich.... mh das habe ich übersehen. Ich habe überall geschaut aber in der Microsoft Dokumentation hab ich übersehen. 🤔
Manche Dinge können so einfach sein.

Ja ich danke soweit erstmal! Ich probiers jetzt mal aus und wenn es läuft dann schließe ich das Topic.

M
Masterfire Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren

Danke nochmal! Funktioniert!