Laden...

PNG32 To Alpha PNG8

Erstellt von elron vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.764 Views
E
elron Themenstarter:in
171 Beiträge seit 2004
vor 14 Jahren
PNG32 To Alpha PNG8

@all
ich bin hier wieder mal am verzweifeln.
Ich will einfach nur ^^ ein Image was PNG32 ist konvertieren zu einem PNG8 Alpha.


 public static Bitmap ImageConvert(Bitmap pic)
        {

            Graphics g = Graphics.FromImage(pic);

            Bitmap newPic = new Bitmap(pic.Width, pic.Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
            g.DrawImage(newPic, pic.Width, pic.Height);
            return newPic;

        }

was rauskommt ist einfach nur schwarz X(

Ich habe mal das Source Pic mit dazugegeben wenn jemand eine lösung weiss wäre das ein super knaller

grüße,
elron

5.658 Beiträge seit 2006
vor 14 Jahren

Weil du das neue Bild in das neue Bild zeichnest.

// Edit:

public static Bitmap ImageConvert(Bitmap pic)
        {

           using (g = Graphics.FromImage(pic)) // Using verwenden, oder g.Dispose aufrufen, um am Ende Resourcen wieder freizugeben!
           {

              Bitmap newPic = new Bitmap(pic.Width, pic.Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
              g.DrawImage(pic, pic.Width, pic.Height);
              return newPic;

           }
      }

Weeks of programming can save you hours of planning

3.170 Beiträge seit 2006
vor 14 Jahren

Hallo,

genau genommen: Das neue Bild in das alte... und das neue, auf dem noch garnix gewzeichnet wurde, wird zurückgegeben.

Gruß, MarsStein

Edit:
@MrSparkle: müsste doch dan eigentlich so lauten:

public static Bitmap ImageConvert(Bitmap pic)
        {

              Bitmap newPic = new Bitmap(pic.Width, pic.Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
           using (g = Graphics.FromImage(newPic)) // Using verwenden, oder g.Dispose aufrufen, um am Ende Resourcen wieder freizugeben!
           {

              g.DrawImage(pic, pic.Width, pic.Height);
              return newPic;

           }
      }

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

5.658 Beiträge seit 2006
vor 14 Jahren

Genau, so müßte was dabei herauskommen 😃

Weeks of programming can save you hours of planning

E
elron Themenstarter:in
171 Beiträge seit 2004
vor 14 Jahren

erstmal danke aber das pic ist immer noch black..


Bitmap current = new Bitmap(@"test.png");
Bitmap bitmap = ImageConvert(current);
bitmap.Save(@"test8bit.png");


 public static Bitmap ImageConvert(Bitmap pic)
        {
            Bitmap newPic = null;

            using (Graphics g = Graphics.FromImage(pic))
            {
                newPic = new Bitmap(pic.Width, pic.Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
                g.DrawImage(newPic, pic.Width, pic.Height);
            }

            return newPic;
        }

evtl. könntest du ja mal das pic nehmen was ich angehangen habe...
dann siehst du das selber mal, es ist einfach nur schwarz ich versteh das nicht

danke und grüße
elron

3.170 Beiträge seit 2006
vor 14 Jahren

Hallo,

Du erstellst immer noch die Graphics aus dem falschen Bild.
Sieh Dir noch mal den Code in meinem vorherigen Post an.

Gruß, MarsSTein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

E
elron Themenstarter:in
171 Beiträge seit 2004
vor 14 Jahren

ne zu früh gefreut

Ich bekomme eine Exception
bei using (Graphics g = Graphics.FromImage(newPic))


 public static Bitmap ImageConvert(Bitmap pic)
        {
            Bitmap newPic = new Bitmap(pic.Width, pic.Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
            using (Graphics g = Graphics.FromImage(newPic))
            {
                g.DrawImage(pic, pic.Width, pic.Height);
            }
            return newPic;
        }

Also das Snipped funktioniert definitiv nicht X(

elron

Edit
Ich seh grad das geht nicht ...

Hinweise
Wenn das Bild in einem indizierten Pixelformat vorliegt, löst diese Methode eine Ausnahme mit der folgenden Meldung aus: "Ein Grafikobjekt kann nicht von einem Bild mit indiziertem Pixelformat erstellt werden.". In der folgenden Liste finden Sie alle indizierten Pixelformate.

Format1bppIndexed
Format4bppIndexed

Format8bppIndexed

mhh kann man das dann überhaupt konvertieren auf diesem wege?

elron

2.298 Beiträge seit 2010
vor 14 Jahren

Wie sieht denn die Exception aus? 😃

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

E
elron Themenstarter:in
171 Beiträge seit 2004
vor 14 Jahren

Wie sieht denn die Exception aus? 😃

in meinem Post drüber habe ich das noch angefügt.

Siehe: In der folgenden Liste finden Sie al....

elron

3.170 Beiträge seit 2006
vor 14 Jahren

Hallo,

stimmt, es kann gar nicht klappen:
Graphics.FromImage-Methode
unter "Ausnahmen" steht daß FromImage keine indizierten Formate unterstützt 🙁

Dann wirst Du das von Hand machen müssen. Schau mal hier:
GetPixel und SetPixel um Längen geschlagen. 800 mal schneller
Das könnte Dir weiterhelfen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

5.658 Beiträge seit 2006
vor 14 Jahren

Wenn du den Framework 3.5 verwendest, kannst du das evtl. mit der PNGBitmapEncoder-Klasse lösen.

Weeks of programming can save you hours of planning

E
elron Themenstarter:in
171 Beiträge seit 2004
vor 14 Jahren

   RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(200, 200, 92, 92, PixelFormats.Pbgra32);
            DrawingVisual drawingVisual = new DrawingVisual();

            renderTargetBitmap.Render(drawingVisual);

            FormatConvertedBitmap fcb =
                new FormatConvertedBitmap(renderTargetBitmap, PixelFormats.Indexed8, BitmapPalettes.Halftone8Transparent, 0.5);

            PngBitmapEncoder pngBitmapEncoder = new PngBitmapEncoder();
            pngBitmapEncoder.Interlace = PngInterlaceOption.Off;
            pngBitmapEncoder.Frames.Add(BitmapFrame.Create(fcb));

            using (Stream fileStream = File.Open(@"test.png", FileMode.Create))
            {
                pngBitmapEncoder.Save(fileStream);
            }

Hier bekomme ich ein komplett transparentes bild raus ..
also ich weiss auch nicht mehr weiter ... ich werden mal weiter testen ..danke für den post

49.485 Beiträge seit 2005
vor 14 Jahren