Pergunta

Eu quero redimensionar uma imagem com a biblioteca GDI modo que quando eu redimensioná-la para ser maior do que antes não há nenhuma mistura. (Como quando você aumentar o zoom em uma imagem em um programa de pintura)

EG: Se a minha imagem é 2px de largura, e 2px
de altura (Branco, branco,
branco, preto)
, E eu redimensioná-la para ser 100% maior, é 4px por 4px altura
(Branco, branco, branco, branco,
branco, branco, branco, branco,
branco, branco, preto, preto,
branco, branco, preto, preto)

O modo de suavização (ou outras propriedades) de um objeto de gráficos posso usar InterpolationMode ou para conseguir isso? As combinações que eu tentei até agora todas as causas cinzenta para aparecer na imagem de teste.

Aqui está o código que estou usando

    /// <summary>
    /// Do the resize using GDI+
    /// Credit to the original author
    /// http://www.bryanrobson.net/dnn/Code/Imageresizing/tabid/69/Default.aspx
    /// </summary>
    /// <param name="srcBitmap">The source bitmap to be resized</param>
    /// <param name="width">The target width</param>
    /// <param name="height">The target height</param>
    /// <param name="isHighQuality">Shoule the resize be done at high quality?</param>
    /// <returns>The resized Bitmap</returns>

    public static Bitmap Resize(Bitmap srcBitmap, int width, int height, bool isHighQuality)
    {
        // Create the destination Bitmap, and set its resolution
        Bitmap destBitmap = new Bitmap((int)Convert.ToInt32(width), (int)Convert.ToInt32(height), PixelFormat.Format24bppRgb);
        destBitmap.SetResolution(srcBitmap.HorizontalResolution, srcBitmap.VerticalResolution);

        // Create a Graphics object from the destination Bitmap, and set the quality
        Graphics grPhoto = Graphics.FromImage(destBitmap);
        if (isHighQuality)
        {
            grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
        }
        else
        {
            grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; //? this doesn't work
            grPhoto.InterpolationMode = InterpolationMode.NearestNeighbor; //? this doesn't work


        }
        // Do the resize
        grPhoto.DrawImage(srcBitmap,
              new Rectangle(0, 0, width, height),
              new Rectangle(0, 0, srcBitmap.Width, srcBitmap.Height),
              GraphicsUnit.Pixel);

        grPhoto.Dispose();
        return destBitmap;
    }
Foi útil?

Solução

Você estava no caminho certo, usando InterpolationMode.NearestNeighbor. No entanto, com o PixelOffsetMode padrão, GDI + tentará e amostra de pixel nas bordas, fazendo com que a mistura.

Para obter o escalonamento sem a mistura, você também precisa usar PixelOffsetMode.Half. Alterar o seu caso não de alta qualidade para:

else
{
    grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
    grPhoto.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
}

Outras dicas

Quando você está desenhando a imagem e passando o retângulo de origem, passar apenas o zoom-in parte da imagem original e desenhar que a área maior. Quando os zooms usuário em, em algum momento eles não serão capazes de ver toda a imagem na área de visualização. Assim, descobrir qual região de origem ainda deveriam estar à vista e pintar só isso.

Ele não parecer que você está fazendo nada de errado para mim. Veja as instruções da Microsoft na InterpolationMode:

http://msdn.microsoft.com/en-us/library/ms533836 (VS .85) .aspx

Talvez esta função está funcionando perfeitamente, mas você está dando os parâmetros errados ou exibindo o resultado de forma incorrecta?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top