none
圖檔從Imagelist指派到Picturebox,在Picturebox的圖檔失真 RRS feed

  • 問題

  • 各位前輩好:

    小弟利用Imagelist加入多張圖檔,想利用Picturebox依序將圖檔由Imagelist讀入

    目前Picturebox已可顯示對應的圖檔,但問題是圖檔很模糊,失真了

    目前在Imagelist的 imageList1.ColorDepth設定為 ColorDepth.Depth32Bit

    圖檔為*.PNG檔,imageList1及Picturebox的ImageSize都設定為(100.73)

    不知有何問題,請各位前輩指教, 

    程式碼如下: 

                                

     foreach (Control Ctrl in this.Controls)
                {

                    PictureBox Pic = Ctrl as PictureBox;
                    if (Pic != null)
                    {   

          Pic.Image = imageList1.Images[indexPic - 1];
                        indexPic++;
                    }


    2014年10月27日 上午 10:19

解答

  • 因為圖檔加入到ImageList時就已經縮成ImageList的ImageSize指定的大小了(預設值為16x16), 再顯示到PictureBox(將16x16的圖放大成PictureBox的大小當然會失真, 您可以先變更ImageList的ImageSize大小(最大只能到256*256), 再加入圖檔
    • 已標示為解答 Y.C.Tsai 2014年10月29日 上午 01:06
    2014年10月28日 上午 02:54

所有回覆

  • ImageList.ImageSize 屬性

    http://msdn.microsoft.com/zh-tw/library/system.windows.forms.imagelist.imagesize(v=vs.110).aspx

    ImageSize超過最大了,改用Image或Bitmap陣列吧...

    2014年10月27日 下午 12:37
  • 因為圖檔加入到ImageList時就已經縮成ImageList的ImageSize指定的大小了(預設值為16x16), 再顯示到PictureBox(將16x16的圖放大成PictureBox的大小當然會失真, 您可以先變更ImageList的ImageSize大小(最大只能到256*256), 再加入圖檔
    • 已標示為解答 Y.C.Tsai 2014年10月29日 上午 01:06
    2014年10月28日 上午 02:54
  • Hi,tihs:

    imagelist圖片集合的size屬性為100,73

    且已將imagelist屬性ImageSize設定為100,73

    程式中也將Picture的Size設定為100,73,但還是失真,不知還有哪裏沒考慮到?懇請回覆,感謝

    程式碼如下:

     foreach (Control Ctrl in this.Controls)
                {

                    PictureBox Pic = Ctrl as PictureBox;
                    if (Pic != null)
                    {   

      

                        imageList1.ColorDepth = ColorDepth.Depth32Bit;
                        Pic.SizeMode = PictureBoxSizeMode.StretchImage;
                        Pic.Height =100;
                        Pic.Width = 73;

        Pic.Image = imageList1.Images[indexPic - 1];
                        indexPic++;
                    }

    2014年10月28日 上午 05:01
  • 急!c# 做activex imagelist图片失真问题

    http://bbs.csdn.net/topics/330264164

    圖片不要從設計模式加入,改由程式加入;如果可以的話,把整個專案壓縮上傳到網路空間如OneDrive,讓大家下載試試...

    2014年10月28日 上午 05:18
  • 你怎樣知道失真了?原圖多大size、什麼format 及resolution是多少?

    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog


    2014年10月28日 上午 09:49
  • 如果圖像的size不是(100,73),那Imagelist會resize那圖,我看到別人說先把它resize再放進去imagelist,便不會失真。

    private Image RezizeImage(Image img, int maxWidth, int maxHeight)
    {
        if(img.Height < maxHeight && img.Width < maxWidth) return img;
        using (img)
        {
            Double xRatio = (double)img.Width / maxWidth;
            Double yRatio = (double)img.Height / maxHeight;
            Double ratio = Math.Max(xRatio, yRatio);
            int nnx = (int)Math.Floor(img.Width / ratio);
            int nny = (int)Math.Floor(img.Height / ratio);
            Bitmap cpy = new Bitmap(nnx, nny, PixelFormat.Format32bppArgb);
            using (Graphics gr = Graphics.FromImage(cpy))
            {
                gr.Clear(Color.Transparent);
    
                // This is said to give best quality when resizing images
                gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
    
                gr.DrawImage(img,
                    new Rectangle(0, 0, nnx, nny),
                    new Rectangle(0, 0, img.Width, img.Height),
                    GraphicsUnit.Pixel);
            }
            return cpy;
        }
    
    }
    
    private MemoryStream BytearrayToStream(byte[] arr)
    {
        return new MemoryStream(arr, 0, arr.Length);
    }
    
    private void HandleImageUpload(byte[] binaryImage)
    {
        Image img = RezizeImage(Image.FromStream(BytearrayToStream(binaryImage)), 100, 73);
        img.Save("IMAGELOCATION.png", System.Drawing.Imaging.ImageFormat.Gif);
    }


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog


    2014年10月28日 上午 09:55
  • 感謝各位前輩:

    tihs前輩所言,先變更ImageList的ImageSize大小

    再重新將圖檔加入Imagelist控制項即可,

    但需注意的是必須在第一次加入圖片前就要變更ImageList的ImageSize大小

    否則在加入圖片之後才變更ImageSize,圖片還是會失真


    • 已編輯 Y.C.Tsai 2014年10月29日 上午 01:41
    2014年10月29日 上午 01:23