qq_14919529 2015-04-06 06:56 采纳率: 0%
浏览 1431

wpf图片处理问题求大神指教

目的:我想做的效果是点按钮,图像平移一段距离。
现在的方法:
规定必须用处理每个像素点的颜色来进行平移(我知道有现成的平移函数,但是需求必须用每个像素处理)
问题:
效果能实现,但是出现点一次图像是原色(彩色),再点一次变为很浅的颜色(只有两种颜色),依次不断循环
如下情况:
图片说明
图片说明

附上代码:
//获取位图
BitmapSource bmp = (BitmapSource)img1.Source;
int length = (bmp.PixelWidth * bmp.Format.BitsPerPixel + 7) / 8;
byte[] rawImage = new byte[length * bmp.PixelHeight];
bmp.CopyPixels(rawImage, length, 0);

        //临时数组初始值为255
        byte[] tempImage = new byte[length * bmp.PixelHeight];
        for (int i = 0; i < tempImage.Length; i++)
        {
            tempImage[i] = 255;
        }

        //平移量
        int x = 50;
        int y = 50;
        //平移位图              
        for (int j = 0; j < bmp.PixelHeight; j++)
        {
            if ((j + y) > 0 && (j + y) < bmp.PixelHeight)
            {
                for (int i = 0; i < length; i++)
                {
                    if ((i + x) > 0 && (i + x) < length)
                    {
                        tempImage[(i + x) + (j + y) * length] = rawImage[i + j * length];
                    }
                }
            }
        }

        BitmapSource bitmap = BitmapSource.Create(bmp.PixelWidth, bmp.PixelHeight, bmp.DpiX, bmp.DpiY, PixelFormats.Bgr32, bmp.Palette, tempImage, length);

        img1.Source = bitmap;
  • 写回答

3条回答 默认 最新

  • qq_14919529 2015-04-06 06:58
    关注

    代码发不完整 补全:
    //获取位图
    BitmapSource bmp = (BitmapSource)img1.Source;
    int length = (bmp.PixelWidth * bmp.Format.BitsPerPixel + 7) / 8;
    byte[] rawImage = new byte[length * bmp.PixelHeight];
    bmp.CopyPixels(rawImage, length, 0);

            //临时数组初始值为255
            byte[] tempImage = new byte[length * bmp.PixelHeight];
            for (int i = 0; i < tempImage.Length; i++)
            {
                tempImage[i] = 255;
            }
    
            //平移量
            int x = 50;
            int y = 50;
            //平移位图              
            for (int j = 0; j < bmp.PixelHeight; j++)
            {
                if ((j + y) > 0 && (j + y) < bmp.PixelHeight)
                {
                    for (int i = 0; i < length; i++)
                    {
                        if ((i + x) > 0 && (i + x) < length)
                        {
                            tempImage[(i + x) + (j + y) * length] = rawImage[i + j * length];
                        }
                    }
                }
            }
    
            BitmapSource bitmap = BitmapSource.Create(bmp.PixelWidth, bmp.PixelHeight, bmp.DpiX, bmp.DpiY, PixelFormats.Bgr32, bmp.Palette, tempImage, length);
    
            img1.Source = bitmap;
    
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?