|
Vb net 2010
Tif img
I would like to print that image by calling print preview
Image is larger than one print page.
I cannot get another (second) page where it should be rest of that img.
I'm using
Img.framecount(framedimension .page) where count is always 1, but should be 2.
(To divide 1 tiff img to 2 print pages)
Thanks
Imports System.Drawing.Printing
Imports System.Drawing.Imaging
Imports System.Drawing
Imports System.IO
Public Class Form2
Private fileCount As Integer = 0
Private currPage As Integer = 0
Private pCount As Integer = 0
Private currImage As Image
Private Sub vPrintDocument()
Dim vPrintDoc As New PrintDocument
vPrintDoc.DefaultPageSettings.Landscape = False
AddHandler vPrintDoc.PrintPage, AddressOf docPrintPage
AddHandler vPrintDoc.BeginPrint, AddressOf docBeginPrint
Dim i As PrintPreviewDialog = New PrintPreviewDialog
i.Document = vPrintDoc
i.ShowDialog()
End Sub
Private Sub docBeginPrint(ByVal sender As Object, ByVal e As PrintEventArgs)
currPage = 0
currImage = Image.FromFile("C:\out.tif")
pCount = currImage.GetFrameCount(Imaging.FrameDimension.Page)
‘MsgBox(pCount)
End Sub
Private Sub docPrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)
currImage.SelectActiveFrame(Imaging.FrameDimension.Page, currPage)
e.Graphics.DrawImage(currImage, 20, 20)
currPage = currPage + 1
If currPage < pCount Then
e.HasMorePages = True
Else
e.HasMorePages = False
End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Call vPrintDocument()
End Sub
End Class
modified 28-Sep-14 2:21am.
|
|
|
|
|
That method does not return the amount of pages that the image is printed on; it returns the amount of frames[^] (total images in an animation) in there.
If you want to know how many pages are needed to print something, then you'd have to create a print-preview using the printer-driver.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Again, FrameCount should return 1, unless this is a multiframe, "animated" image. The image knows NOTHING about what you're displaying the image on or printing it on. How could it possibly know??
If you need to print the entire image on multiple pages, YOU have to write the code that breaks the image up into multiple images and figures out exactly what dimensions each sub-image has to be based on the printable area of the selected printer page.
|
|
|
|
|
Thanks Dave, Eddy
Do you have any ideas how I can do that...
|
|
|
|
|
Answered here[^] by the topicstarter.
I upvoted the answer since he took the time to share it.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
I'm wondering if this is a post-secondary assignment for credit.
http://www.falgames.com/
|
|
|
|
|
I thought I seen an example up here before But I will be dang if I can find it now.
I have a panel control which has geometry created on it from a third party dll. What I would like to do is that and create an image (preferably with transparent background) of what the user is seeing on that screen.
can anyone point me in the right direction?
Oh I guess I should mention that I am using VS2013 vb.net
Thanks
|
|
|
|
|
A panel is a control, and those can be drawn to a bitmap. See MSDN[^]
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Thanks for the advice but that does not create a transparent bitmap and in most cases will not work if the actual drawing to the panel is done through a 3rd party dll.
I think what I really need is more of a screen capture of the panel and then convert its size and transparentcy
|
|
|
|
|
I found this bit of code to work with 2 exceptions. 1) how to re-size it to a smaller image (So I can display a thumbnail type image and 2) how to make the background transparent.
I want item 2 because the image is displayed in a panel control with a black background. That is what the user needs to see. But when I create the image I do not want the black background
Private Sub my_capture(ctrl As Control, fileName As String)
Dim bounds As Rectangle = ctrl.Bounds
Dim pt As Point = ctrl.PointToScreen(bounds.Location)
Dim bitmap As New Bitmap(bounds.Width, bounds.Height)
Using g As Graphics = Graphics.FromImage(bitmap)
g.CopyFromScreen(New Point(pt.X - ctrl.Location.X, pt.Y - ctrl.Location.Y), Point.Empty, bounds.Size)
End Using
bitmap.Save(fileName, ImageFormat.Png)
End Sub
|
|
|
|
|
You'd have to specify which color should become transparent[^].
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
I changed my code to this:
But it had no effect. I still get the image with a black background.
I am not sure how to include images with the reply otherwise I would show you before and after images
Dim bounds As Rectangle = ctrl.Bounds
Dim pt As Point = ctrl.PointToScreen(bounds.Location)
Dim myBitmap As New Bitmap(bounds.Width, bounds.Height)
myBitmap.MakeTransparent(ctrl.BackColor)
Using m_g As Graphics = Graphics.FromImage(myBitmap)
m_g.CopyFromScreen(New Point(pt.X - ctrl.Location.X, pt.Y - ctrl.Location.Y), Point.Empty, bounds.Size)
m_g.Dispose()
End Using
myBitmap.Save(fileName, ImageFormat.Png)
myBitmap.Dispose()
|
|
|
|
|
Hi
Imports System.Drawing.Imaging
Imports System.Drawing.Printing
Private Sub PrintDocument1_PrintPage(ByVal Sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Static page As Integer = 1
Dim startPosition As Integer = (page - 1) * PrintDocument1.DefaultPageSettings.Bounds.Height
Static maxPages As Integer = 0
If page = 1 Then
For Each ctrl As Control In Me.pRight19.Controls
If TypeOf ctrl Is TextBox Or TypeOf ctrl Is Label Or TypeOf ctrl Is PictureBox Or TypeOf ctrl Is RichTextBox Then
ctrl.Tag = Int((ctrl.Top + ctrl.Height) / PrintDocument1.DefaultPageSettings.Bounds.Height) + 1
If CInt(ctrl.Tag) > maxPages Then maxPages = CInt(ctrl.Tag)
End If
Next
End If
For Each ctrl As Control In Me.pRight19.Controls
If CInt(ctrl.Tag) = page Then
If TypeOf ctrl Is TextBox Or TypeOf ctrl Is Label Or TypeOf ctrl Is RichTextBox Then
Dim sf As New System.Drawing.StringFormat
If TypeOf ctrl Is TextBox Then
If DirectCast(ctrl, TextBox).TextAlign = HorizontalAlignment.Right Then
sf.Alignment = StringAlignment.Far
Else
sf.Alignment = StringAlignment.Near
End If
ElseIf TypeOf ctrl Is Label Then
If DirectCast(ctrl, Label).TextAlign = ContentAlignment.TopLeft Then
sf.Alignment = StringAlignment.Far
End If
ElseIf TypeOf ctrl Is RichTextBox Then
If DirectCast(ctrl, RichTextBox).SelectionAlignment = ContentAlignment.TopLeft Then
sf.Alignment = StringAlignment.Near
End If
End If
sf.FormatFlags = StringFormatFlags.NoClip
e.Graphics.DrawString(ctrl.Text, ctrl.Font, New SolidBrush(ctrl.ForeColor), New Rectangle(ctrl.Left, ctrl.Top - startPosition, ctrl.Width + 50, ctrl.Height), sf)
ElseIf TypeOf ctrl Is PictureBox Then
e.Graphics.DrawImage(DirectCast(ctrl, PictureBox).Image, New PointF(ctrl.Left, ctrl.Top - startPosition))
End If
End If
Next
page += 1
If page > maxPages Then
e.HasMorePages = False
page = 1
maxPages = 0
Else
e.HasMorePages = True
End If
End Sub
Private Sub ToolStripButton1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click
' PrintDocument1.Print()
PrintPreviewDialog1.Document = PrintDocument1
PrintPreviewDialog1.ShowDialog()
End Sub
|
|
|
|
|
Drago11
I am not sure what all the printing code has to do with my question. Maybe you just pasted it in to the wrong question. Am I missing something?
|
|
|
|
|
That's the good answer, but to the wrong question
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Set the transparency AFTER you capture the screen.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Eddy
yep that is what the issue was. Setting it after did the trick.
Now that I have that working(thanks to you) and I see the results, I think I need to save the image as B/W or greyScale.
Is that difficult?
|
|
|
|
|
Not very hard, but I reckon it will need to remain a 32bit argb format for transparency to work.
There's a howto[^] on MSDN
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Hmmm that use the Imaging class
I have seen that used in medical applications I believe,
Maybe I will try a different approach. You would think that Microsoft would of made saving an image a whole lot easier wouln't you?
|
|
|
|
|
I am using the this sub and on the following line of code I get an error
pixColor = myBitmap.GetPixel(x, y)
the error states "An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in System.Drawing.dll
Additional information: Parameter must be positive and < Width."
Would anyone know why?
Private Sub my_capture(ctrl As Control, fileName As String)
Dim bounds As Rectangle = ctrl.Bounds
Dim pt As Point = ctrl.PointToScreen(bounds.Location)
Dim myBitmap As New Bitmap(bounds.Width, bounds.Height)
Dim BW_Bitmap As New Bitmap(bounds.Width, bounds.Height)
Dim x As Integer
Dim y As Integer
Dim pixColor As Color
Dim luma As Integer
Using m_g As Graphics = Graphics.FromImage(myBitmap)
m_g.CopyFromScreen(New Point(pt.X - ctrl.Location.X, pt.Y - ctrl.Location.Y), Point.Empty, bounds.Size)
m_g.Dispose()
End Using
For y = 0 To BW_Bitmap.Height
For x = 0 To BW_Bitmap.Width
pixColor = myBitmap.GetPixel(x, y)
luma = CInt(pixColor.R * 0.3 + pixColor.G * 0.59 + pixColor.B * 0.11)
BW_Bitmap.SetPixel(x, y, Color.FromArgb(luma, luma, luma))
Next
Next
BW_Bitmap.Save(fileName, ImageFormat.Png)
BW_Bitmap.Dispose()
myBitmap.Dispose()
End Sub
|
|
|
|
|
..from 0 to 640, is 641 steps, not 640. That's one more step than there is pixels, causing it to go out of range.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Well ! Boy do I feel stupid. Thanks
|
|
|
|
|
how to create ActiveX control
|
|
|
|
|
Considering you haven't told us anything about what you want to do and which flavor of VB you're using, it's pretty much impossible to tell you anything useful.
|
|
|
|
|
We have couple of projects (1 win forms and 1 web form) written in VB.Net. We would like to get those converted into C#. We would be using VS 2012 Professional for BUILD. I am already googling for such tools but would also like to take community's opinion/recommendation on any such highly recommended tools with highest precision/accuracy in converting code from VB.Net to C#. I am good with free and paid tools. Your pointers/suggestions will be highly appreciated.
Thanks in advance.
Regards,
Vipul Mehta
|
|
|
|