2

次のコードを使用してビットマップを8bppから24bppに変換すると、結果の画像がシフトしますが、その理由がわかりません。誰か助けてもらえますか?

private static Bitmap ConvertTo24(Bitmap bmpIn)
{
    bmpIn.Save(@"F:\sara1.bmp");
    Bitmap converted = new Bitmap(bmpIn.Width, bmpIn.Height, PixelFormat.Format24bppRgb);
    using (Graphics g = Graphics.FromImage(converted))
    {
         // Prevent DPI conversion
         g.PageUnit = GraphicsUnit.Pixel;
         // Draw the image
         g.DrawImageUnscaled(bmpIn, 0, 0);
         // g.DrawImage(bmpIn, 0, 0);
    }
    converted.Save(@"F:\sara2.bmp");
}

ここに画像の説明を入力してください


ここに画像の説明を入力してください

4

2 に答える 2

2

次のコードは私のために働いた:

private static Bitmap ConvertTo24(Bitmap bmpIn)
{
    bmpIn.Save(@"F:\sara1.bmp");
    Bitmap converted = new Bitmap(bmpIn.Width, bmpIn.Height, PixelFormat.Format24bppRgb);
    using (Graphics g = Graphics.FromImage(converted))
    {
        // Prevent DPI conversion
        g.PageUnit = GraphicsUnit.Pixel;
        // Draw the image
        // g.DrawImageUnscaled(bmpIn, 0, 0);
        g.DrawImage(bmpIn, 0, 0, converted.Width, converted.Height);
    }
    converted.Save(@"F:\sara2.bmp");
}

幅と高さを指定すると、画像が再スケーリングされます。

于 2012-11-05T21:20:24.873 に答える
1

bmpIn関数で受け取る前に問題が発生する可能性があります。8bpp画像を挿入した後、次の(より良い)コードをテストできます(f:\sara1.bmp変換前に8bpp画像がシフトされていないことを確認するため)。

private static Bitmap ConvertTo24(Bitmap bmpIn)
{
    //Bitmap bmpIn;
    bmpIn = new Bitmap(@"f:\sara1.bmp");
    Bitmap converted = new Bitmap(bmpIn.Width, bmpIn.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
    using (Graphics g = Graphics.FromImage(converted))
    {
         g.PageUnit = GraphicsUnit.Pixel;
         Rectangle rng = new Rectangle(new Point(0, 0), bmpIn.Size);
         g.DrawImage(bmpIn, rng);  // use this instead of following
    }
    converted.Save(@"F:\sara2.bmp");
}

それがうまくいくことを願っています4u。コメントですでに言われているように、DrawImage(Image img、Rectangle rng)を使用しました

答えは完了です。以下は説明です。あなたのコード(編集。そのまま使用してコメントに従ってください)

private static Bitmap ConvertTo24(Bitmap bmpIn)
{
    bmpIn.Save(@"F:\sara1.bmp");
    return;
    // After you have called this function. Go open your image f:\sara1.bmp from
    //hrad disk-- I doubt you would find it shifted here even before conversion
    Bitmap converted = new Bitmap(bmpIn.Width, bmpIn.Height, PixelFormat.Format24bppRgb);
    using (Graphics g = Graphics.FromImage(converted))
    {
         // Prevent DPI conversion
         g.PageUnit = GraphicsUnit.Pixel;
         // Draw the image
         g.DrawImageUnscaled(bmpIn, 0, 0);
         // g.DrawImage(bmpIn, 0, 0);
    }
    converted.Save(@"F:\sara2.bmp");
}

もう一度あなたのコード(私はあなたが受け取った8bppビットマップを無視してfドライブから直接フェッチしました。アプリケーションを実行する前、または少なくともこの関数を呼び出す前にそれを置くと仮定します)

次のコードも私にとってはうまくいきました。

private static Bitmap ConvertTo24(Bitmap bmpIn)
{
    Bitmap bmpIn = new Bitmap(@"f:\sara1.bmp");
    Bitmap converted = new Bitmap(bmpIn.Width, bmpIn.Height, PixelFormat.Format24bppRgb);
    using (Graphics g = Graphics.FromImage(converted))
    {
         // Prevent DPI conversion
         g.PageUnit = GraphicsUnit.Pixel;
         // Draw the image
         g.DrawImageUnscaled(bmpIn, 0, 0);
         // g.DrawImage(bmpIn, 0, 0);
    }
    converted.Save(@"F:\sara2.bmp");
}
于 2012-11-05T20:41:32.253 に答える