c#从图像中剪切透明部分

时间:2015-08-12 15:14:44

标签: c# pointers image-processing pixel

假设我们有32bppRGBA图像enter image description here

正如你所看到的,它只是一个只有小红色矩形的1920x1080图像,我想只剪切这个图像的非透视像素(在我们的例子中只有小的小块)。

所以我开始扫描这个图像并获得非transpert块边界。 这就是我到目前为止所做的:

        <plugin>
         <artifactId>maven-antrun-plugin</artifactId>
         <configuration>
            <tasks>
                <scp 
                    file="${project.basedir}/target/${war.warName}.war"
                    todir="${scp.finalDir}" 
                    trust="true" 
                    failonerror="true"/>
            </tasks>
         </configuration>
         <executions>
                <execution>
                      <id>copy-war-to-server</id>
                      <phase>install</phase>
                      <goals>
                             <goal>run</goal>
                      </goals>
                </execution>
         </executions>
       <dependencies>
      <dependency>
        <groupId>ant</groupId>
        <artifactId>ant-jsch</artifactId>
        <version>1.6.5</version>
      </dependency>
      <dependency>
        <groupId>com.jcraft</groupId>
        <artifactId>jsch</artifactId>
        <version>0.1.42</version>
      </dependency>
    </dependencies>
   </plugin>        

但我得到了奇怪的结果......我认为这是一个简单的错字,我无法弄清楚......或者它可能是错误的代码逻辑......

我很感激并得到了帮助!

1 个答案:

答案 0 :(得分:0)

我刚才在其他帖子上回答了这个问题:Cut transparent parts image

    public static Bitmap Trim(string fileName)
    {
        Bitmap bmp = null;

        try
        {
            bmp = Bitmap.FromFile(fileName) as Bitmap;

            if (bmp == null)
                throw new ArgumentException("The file is not a valid image.");

            if (bmp.PixelFormat != PixelFormat.Format32bppArgb)
                throw new ArgumentException("The image file is in an invalid format (32bpp ARGB required)");

        }
        catch (Exception ex)
        {
            throw new ArgumentException("The file is not a valid image.", ex);
        }

        BitmapData bmpData = null;

        int minX, minY, maxX, maxY;
        minX = minY = int.MaxValue;
        maxX = maxY = int.MinValue;

        try
        {
            bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);

            IntPtr ptr = bmpData.Scan0;

            int bytes = bmpData.Stride * bmp.Height;
            int[] pixelData = new int[bmp.Width * bmp.Height];

            System.Runtime.InteropServices.Marshal.Copy(ptr, pixelData, 0, pixelData.Length);

            for (int y = 0; y < bmp.Height; y++)
            {
                for (int x = 0; x < bmp.Width; x++)
                {
                    Color pixel = Color.FromArgb(pixelData[x + (bmp.Width * y)]);

                    if (pixel.A != 0)
                    {
                        if (x < minX) minX = x;
                        if (x > maxX) maxX = x;
                        if (y < minY) minY = y;
                        if (y > maxY) maxY = y;
                    }
                }
            }

            pixelData = null;

            Rectangle cutRect = new Rectangle(minX, minY, maxX - minX, maxY - minY);

            bmp.UnlockBits(bmpData);

            return bmp.Clone(cutRect, bmp.PixelFormat);

        }
        finally
        {
        }
    }

我认为最大的问题是矩形的计算不正确。你有一个最小x / y和一个最大x / y,你用它作为x,y,宽度,高度。您需要从最小值中减去最大x / y的宽度/高度。

另一个问题是像素格式是32BPP ARGB,而不是RGBA,因此alpha通道首先出现,而不是索引3.最好的办法是从整数值创建Color结构,检查一下,但上面的算法仅适用于32bpp ARGB值,因为颜色只有FromARGB函数。