• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 984
  • Last Modified:

How to copy Clip of an Image to Clipboard C# Code in a WPF Application

This is the Code the Works in Window Forms Application (Non-WPF)
"TiffImage" is a picturebox Control
public Bitmap ImageClip;

pivate void CopyBlock()
{
    Point topLeft = new Point(Math.Min(pointStart.X, pointEnd.X), Math.Min(pointStart.Y, pointEnd.Y));
    int clipWidth = Math.Abs(pointEnd.X - pointStart.X + 1),
        clipHeight = Math.Abs(pointEnd.Y - pointStart.Y + 1);

    ImageClip = new Bitmap(clipWidth, clipHeight);
    Graphics Gra = Graphics.FromImage(ImageClip);
    Gra.DrawImage(TiffImage.Image, new Rectangle(0, 0, clipWidth, clipHeight),
                                           topLeft.X, topLeft.Y, clipWidth, clipHeight, GraphicsUnit.Pixel);
    Gra.Dispose();

    Clipboard.SetDataObject(ImageClip);
}

What is the Code to do this in WFP Application
0
GEGAmbato
Asked:
GEGAmbato
1 Solution
 
GEGAmbatoAuthor Commented:
I have found the Solution to this problem.

To Clip a portion of an Image to the Clipboard you Crop the Image to a New Image.

            Image ClippedImage = new Image();
            ClippedImage.Width = clipWidth;

            CroppedBitmap cb = new CroppedBitmap((BitmapSource)imageLog.Source,
                                                  new Int32Rect( (int)Math.Round(topLeft.X),  (int)Math.Round(topLeft.Y),
                                                                  (int)Math.Round(clipWidth),  (int)Math.Round(clipHeight)));
            ClippedImage.Source = cb;
           

My problem was I was reading large Tiff File. 852.48 X 25957.44 was the test image size, one of the smaller ones.
The image DpiX = 200, DpiY = 200  Format = BlackWhite
PixelWidth = 1776 PixelHeight = 54078 BitsPerPixel = 1

To correct the problem of the cropped Image not matching what was selected I had to get the Image DpiX and DpiY  to 96.

This is the Code to Decode the Tiff File to, change Dpi to 96, and fit into an Image Control.

            Stream streamLog = new FileStream(pFile, FileMode.Open, FileAccess.Read, FileShare.Read);
            TiffBitmapDecoder decoder = new TiffBitmapDecoder(streamLog, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
            BitmapSource logToBitMap = decoder.Frames[0];

            int pixWidth = logToBitMap.PixelWidth;
            int pixHeight = logToBitMap.PixelHeight;
            int bitPerPix = logToBitMap.Format.BitsPerPixel;
            PixelFormat pixFormat = logToBitMap.Format;

            int stride = pixWidth * bitPerPix;
            byte[] pixData = new byte[stride * pixHeight];
            logToBitMap.CopyPixels(pixData, stride, 0);

            BitmapSource bmpSource = BitmapSource.Create(pixWidth, pixHeight, 96, 96, pixFormat, null, pixData, stride);
            imageLog.Source = bmpSource;
            imageLog.Stretch = Stretch.Fill;

 Hope this help someone else, this took over a week to find a solution.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now