解决方案 »

  1.   

    红色部分换成 bmp.获取它的格式(bmp属性)
      

  2.   

    已经改成这样bmp.PixelFormat,直接读取它的格式的,但是BGRValues数组里还是255,应该不对吧,怎么可能每个字节都是一样的呢?求救
      

  3.   

    谁说全部是255的,你都没有输出过,你只看调试器上几个数字,因为图片大部分是白色的(255,255,255),黑色只占比较少部分
    你可以int j = 0;
    for (int i = 0; i < BGRValues.Length; i++)
    {
         if (BGRValues[i] != 255) j++;
    }
    MessageBox.Show(j+"");看到有几万个不是255的没?
      

  4.   

    全是0,是不是看错了,你提供的那张图,BGRValues[1146]之前全部是255,和你的图有关,换张图,第一个就不是255了。 void btnBMP_Click(object sender, EventArgs e)
            {
                Bitmap bmp = new Bitmap(tbSource.Text.Trim());            // Lock the bitmap's bits.  
                Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
                System.Drawing.Imaging.BitmapData bmpData =
                    bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
                    bmp.PixelFormat);            // Get the address of the first line.
                IntPtr ptr = bmpData.Scan0;            // Declare an array to hold the bytes of the bitmap.
                int bytes  = Math.Abs(bmpData.Stride) * bmp.Height;
                byte[] rgbValues = new byte[bytes];            // Copy the RGB values into the array.
                System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
                for (int i = 0; i < rgbValues.Length; i++)
                {
                    if (rgbValues[i] != 255)
                    {
                        MessageBox.Show(i.ToString());
                        break;
                    }
                }
                /*
                // Set every third value to 255. A 24bpp bitmap will look red.  
                for (int counter = 2; counter < rgbValues.Length; counter += 3)
                    rgbValues[counter] = 255;            // Copy the RGB values back to the bitmap
                System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);            // Unlock the bits.            // Draw the modified image.
                e.Graphics.DrawImage(bmp, 0, 150);*/
                bmp.UnlockBits(bmpData);
            }
      

  5.   

    对的,是有几万个不是255的,另外我想问下我加载图片用
      string fileName = Application.StartupPath.ToString() + "\\ticket.bmp";
                Bitmap bmp = new Bitmap(Image.FromFile(fileName));

                  Bitmap bmp = new Bitmap(“ticket.bmp");
    有区别吗?
      

  6.   

    Quote: 引用 7 楼 hwenycocodq520 的回复:

    一个是相对路径,一个是绝对路径,后一句会在执行程序目录中找那个图片[/quote
    我用这两种方式加载的图片后长度不一样怎么回事?另外请问怎么知道到底图片保存为byte数组有没有正确呢?
      

  7.   

    用内存流直接就取出来了
            /// <summary>
            /// 缩小图片
            /// </summary>
            /// <param name="strOldPic">源图文件名(包括路径)</param>
            /// <param name="intWidth">缩小至宽度</param>
            /// <param name="intHeight">缩小至高度</param>
            public static byte[] SmallPic(string strOldPic, int intWidth, int intHeight)
            {            System.Drawing.Bitmap objPic, objNewPic;
                try
                {
                    objPic = new System.Drawing.Bitmap(strOldPic);
                    objNewPic = new System.Drawing.Bitmap(objPic, intWidth, intHeight);
                    System.IO.MemoryStream mstream = new System.IO.MemoryStream();
                    objNewPic.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg);
                    return mstream.ToArray();
                }
                catch (Exception exp) {                Logger.DebugLog(exp.Message);
                    return new byte[0];
                
                }
                finally
                {
                    objPic = null;
                    objNewPic = null;
                    GC.Collect();
                }
            }
    这是我之前写的缩放,并且导出byte[] 你可以参考一下
      

  8.   

    试了下你的也是一样,我要的就是这个图的,现在我要实现图片保存为btye数组后传进一个函数里把图片打在车票上,但是返回总是有问题,不知道是不是保存btye时出错了。但是也看不出来有没有出错
      

  9.   

    下面是我反编译过来的代码,大家帮我看看吧,谢谢!
        byte[] array = new byte[] { 0x31, 0x33, 0x36, 50, 0x30, 0x3d, 0x31 };
        byte[] buffer2 = new byte[0x30];
        buffer2[0] = 0x35;
        buffer2[1] = 50;
        buffer2[2] = 0x30;
        buffer2[3] = 0x34;
        buffer2[4] = 0x33;
        for (int i = 5; i < buffer2.Length; i++)
        {
            buffer2[i] = 0x30;
        }
        buffer2[buffer2.Length - 1] = 0x31;
        int num2 = ((this.bitmap.Width * this.bitmap.Height) / 8) + 9;
        byte[] sourceArray = new byte[num2];
        BitmapData bitmapdata = this.bitmap.LockBits(new Rectangle(0, 0, this.bitmap.Width, this.bitmap.Height), ImageLockMode.ReadOnly, this.bitmap.PixelFormat);
        IntPtr ptr1 = bitmapdata.Scan0;
        int num3 = this.bitmap.Width * this.bitmap.Height;
        byte num5 = 0;
        byte num6 = 0;
        int num7 = 9;
        for (int j = 0; j < num3; j++)
        {
            byte num4;
            if (Marshal.ReadByte(bitmapdata.Scan0, j) > 0x80)
            {
                num4 = 0;
            }
            else
            {
                num4 = 1;
            }
            if (num5 == 0)
            {
                num6 = 0;
            }
            num6 = (byte) (num6 ^ ((byte) (num4 << (7 - num5))));
            num5 = (byte) (num5 + 1);
            if (num5 > 7)
            {
                num5 = 0;
                sourceArray[num7++] = (byte) (sourceArray[num7++] + Convert.ToByte(num6));
            }
        }
        this.bitmap.UnlockBits(bitmapdata);//到这应该就是我一开始发的代码
        string str = string.Format("{0:D3}", this.bitmap.Height);
        sourceArray[0] = 0x37;
        sourceArray[1] = 0x36;
        sourceArray[2] = 0x30;
        sourceArray[3] = 0x30;
        sourceArray[4] = 0x30;
        sourceArray[5] = 0x36;
        sourceArray[6] = (byte) str[0];
        sourceArray[7] = (byte) str[1];
        sourceArray[8] = (byte) str[2];
        Array.Resize<byte>(ref array, array.Length + sourceArray.Length);
        Array.Copy(sourceArray, 0, array, array.Length - sourceArray.Length, sourceArray.Length);//到这不知道是干什么的?
        KGB_WRAPPER_RESULT kgb_wrapper_result = this.device.kgb.WriteSetUmsgCmd(array);//btye数组传进来。
        if (this.device.kgb.ExecSendUserMessage() != KGB_WRAPPER_RESULT.ERR_OK)
      

  10.   


    Image image = Image.FromFile("文件名");
    byte[] buffer = new byte[image.Width * image.Height];
    MemoryStream ms = new MemoryStream(buffer);
    image.Save(ms, image.RawFormat);
    ms.Close();
    ms.Dispose();
    image.Dispose();
      

  11.   

    byte[] to imageMemoryStream ms = new MemoryStream(buffer);
    Image image=Image.FromStream(ms);
    //....
    //...
      

  12.   

    现在不是bmp保存为byte的问题,这个我一开始发的代码应该是对的,麻烦帮看看我11楼发的反编译的代码,看看在传byte数组到函数里之前还需要做什么,谢谢