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

# 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
1 Solution

Author 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.

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.